实验目的
实验过程
运行python代码,演示MITM攻击现象
python代码
代码由两部分组成,一个是ArpPoison.py模块文件,便于调用和自定义攻击对象。另一个一个是newMitM.py对象文件。
ArpPoison.py
1 | #!/usr/bin/env python3 |
newMitM.py
1 | #!/usr/bin/env python3 |
实验配置
-
攻击机为Linux kali 5.3.0,IP为192.168.2.207
初始ARP缓存表
-
受害机A(客户机)为SEEDUbuntu16,IP为192.168.2.101
初始ARP缓存表
-
网关机B(服务机)为SEEDUbuntu16,IP为192.168.2.244
初始ARP缓存表
-
python 3.7.6
检查ARP表变化
作用机理是kali攻击机不断(间隔为1.5s)向外广播Arp响应数据报(op=2,其中dstMAC=“ff:ff:ff:ff:ff:ff”,达到短时间就毒化ARP的效果
1 | python3 newMitM.py |
主机A(192.168.2.101)ARP表如下
主机B(192.168.2.244)ARP变化如下
可见A、B的对向MAC地址均指向kali攻击机
wireshark查看kali数据包
主机A数据包
主机B数据包
嗅探数据包
打开IP转发功能
1 | os.system("sudo sysctl net.ipv4.ip_forward=1") |
A Ping B:
在kali wireshark捕获ICMP数据包
并且为其转发
A:
B:
MITM攻击
嗅探FTP报文密码
将ftpSniff所在行注释去掉
A登陆B的ftp
1 | ftp 192.168.2.244 |
python程序捕捉到账号密码
报文查看TCP流
账号和USER在同一个报文里,密码和PASS在同一个报文里,很容易被嗅探到
嗅探telnet密码
去掉exploit()函数关于telnetSniff的注释
主机A向B进行telenet登陆:
1 | telnet 192.168.2.244 |
嗅探到的数据流在屏幕上显示
左边一列是主机A,右边一列是主机B
可以看见输入字符边输入边回显,密码则没有回显,这与FTP大不相同
查看wireshark数据流
红色代表主机A向B发送的数据内容,蓝色则是B,各数据段分散开来。
telnet替换内容为字母Z
从上面我们可以看到telnet输入一个字符就回显该字符,尝试替换该字符
将exploit的这两行注释去掉
首先进行A向B的telnet连接
然后运行python程序
其中下面的代码让kali攻击机停止转发功能
1 | os.system("sudo sysctl net.ipv4.ip_forward=0") |
尝试在A中输入字符,发现无法回显
主机B收到了内容被替换为Z的数据包
主机A没有收到回应
关掉程序
A的终端界面依然无法显示任何字符,
过两三分钟后,由于A获取不到信息,重新发送了ARP报文,当获取B的正确的MAC地址,就可以正常显示字符了
实验心得
本次实验通过进一步学习scapy编程掌握了制包、抓包、改包,实现了ARP毒化的MITM攻击。然而有点奇怪的是,在telnet替换内容为字母Z实验中,理应得到主机B回显的内容却未能得到响应,这着实令人费解。。。