本实验网络拓扑图如下所示: 一台Attacker主机M和两台Victim主机A、B:
Task 1: ARP Cache Poisoning
本实验的任务是要攻击A机器的ARP cache,在A的ARP缓存中,将B的IP地址对应到M的MAC地址上。
实验前的准备:
- ARP 缓存查看:
在A主机(10.9.0.5)上运行arp -n命令即可看到A主机的ARP cache,如下所示:
结果显示当前A主机没有ARP cache。
- 查看docker为当前实验容器创建的网卡:
在虚拟机上执行ifconfig可以查看对应于子网10.9.0.0/24的网卡名称:
- 查看各个主机的MAC地址(使用ifconfig命令):
M主机:
A主机:
B主
机:
攻击过程:
有三种攻击方法:
(1)使用ARP Request: M机器发送ARP请求到主机A。
(2)使用ARP Reply: M机器发送ARP Reply到主机A。
(3)使用ARP gratuitous message
Task 1.A (using ARP request)
- 主机A上查看ARP cache,结果如下:
- 主机A ping 主机B(10.9.0.6):
然后查看主机A的ARP
cache:
可以看到ARP cache中已经有了主机B的MAC地址,并且是正确的。
- 在M主机上创建arp_A_attack.py,文件内容如下:
然后添加执行权限,chmod +x arp_A_attack.py:
执行得到如下图
结果:
- 在主机A上查看ARP cache,结果如下:
Task 1.B (using ARP reply):
在Attacker主机M上创建新的脚本arp_B_attack.py,
内容如下:
这里有两种情况:
Scenario 1: B’s IP is already in A’s cache.
- 先使用arp -d 10.9.0.6命令清除A主机中的关于B主机的缓存并查看ARP cache:
- A主机ping B主机(10.9.0.6):
之后A主机中重新出现B主机的ARP缓存,并且对应正确。
结果如下:
- 在Attacker主机M上运行arp_B_attack.py:
- 在主机A上查看ARP cache,结果如下:
发现主机B对应的MAC地址已经变成主机M的MAC地址了。
Scenario 2: B’s IP is not in A’s cache.
- 先使用arp -d 命令清除A追加的arp缓存:
- 在Attacker主机M上运行arp_B_attack.py:
- 在主机A上查看ARP cache,结果如下:
发现并没有关于B主机的ARP缓存。
得出结论:
ARP Reply只能修改ARP缓存,不能添加新的项。
Task 1C (using ARP gratuitous message):
在Attacker主机M上创建脚本arp_C_attack.py,内容如下:
还是存在1B的两种情况:
Scenario 1: B’s IP is already in A’s cache.
- A主机ping B主机(10.9.0.6),之后A主机中出现B主机的ARP缓存,并且对应正确。结果如下:
- 在Attacker主机M上运行arp_C_attack.py
在主机A上查看ARP cache,
- 结果如下:
发现主机B对应的MAC地址已经变成主机M的MAC地址了。
– Scenario 2: B’s IP is not in A’s cache.
- 先使用arp -d 命令清除A追加的arp缓存:
- 在Attacker主机M上运行arp_C_attack.py:
- 在主机A上查看ARP cache
如图所示:
得出结论:ARP gratuitous message只能修改ARP缓存,不能添加新的项。
综上所述,通过执行以上操作,我们完成了ARP Cache Poisoning 任务
Task 2: MITM Attack on Telnet using ARP Cache Poisoning
Step 1 (Launch the ARP cache poisoning attack).
在Attacker主机上创建脚本文件mitm_attack.py,文件内容如下:
然后运行nmitm_attack.py文件,即可投毒。
Step 2 (Testing).
投毒成功后测试主机A和主机B之间互ping的结果,以及wireshark抓包的结果。
- 在Attacker主机上运行以下命令:
sysctl net.ipv4.ip_forward=0
- 主机A和主机B之间互ping的结果都是无法ping通,如下所示:
- wireshark抓包结果
在A主机(10.9.0.5)ping B主机(10.9.0.6)时wireshark抓取的结果如下:
B主机ping A主机的结果也是一样的,都没有回复。
Step 3 (Turn on IP forwarding).
- 将net.ipv4.ip_forwarding设置为1
sysctl net.ipv4.ip_forwarding = 1
- Attacker继续ARP投毒: 运行mitm_attack.py
- wireshark结果如下所示:
发现有回复了。
Step 4 (Launch the MITM attack).
之后开始进行snif_and_spoof过程,在Attacker上创建attack-2.py,内容如下:
- 在Attacker主机中执行mitm_attack.py程序,不断投毒:
另开一个页面,用于后续的攻击。
- 在Attacker上执行以下命令开启转发,先让A主机和B主机可以建立Telnet连接。
在A主机上建立到B主机(10.9.0.6)的telnet
- 连接。
- 开启Wireshark抓包,为了方便之后查看,直接过滤规则tcp.port == 23:
- 在Attacker主机上修改禁止转发,然后开启attack-2.py文件:
在A主机上任意输入一个字符到建立好的telnet
- 连接中:
- Wireshark中会看到发送一个字符都会出现6个包(已经过滤过了),仔细观察后,会发现前4个包分别是:
- A发送到Attacker的包(10.9.0.5 → 10.9.0.6)
- Attacker修改后发送给B的包(10.9.0.5 → 10.9.0.6)
- B返回给Attacker的包(10.9.0.6 → 10.9.0.5)
- Attacker修改后返回给A的包(10.9.0.6 → 10.9.0.5)
在Wreshark中找到的Attacker主机修改后发送给B主机(10.9.0.6)的包如下所示,数据被修改为Z:
综上所述,通过执行以上操作,我们完成了MITM Attack on Telnet using ARP Cache Poisoning任务
Task 3: MITM Attack on Netcat using ARP Cache Poisoning
在Attacker上创建脚本attack-3.py,内容如下:
- 关闭forawrd:
2.在Attacker主机上的另一个Tab页执行ARP投毒攻击,如下所示:
3.在Attacker主机上执行attack-3.py脚本
等待来自主机A和主机B的数据包:
4.在主机B上开启监听:
5.在A主机上连接主机B,然后输入带有name的字符串。
6.在B主机(10.9.0.6)上可以看到结果如下:
综上所述,通过执行以上操作,我们完成了MITM Attack on Netcat using ARP Cache Poisoning任务