ARP 检测可以通过以下步骤实现:

  1. 获取本机的 IP 地址和 MAC 地址。

  2. 构造一个 ARP 请求包,并设置目标 IP 地址为本机的 IP 地址。

  3. 发送 ARP 请求包到本地网络中,并等待一定时间,等待其他主机响应。

  4. 接收其他主机的 ARP 响应包,并检查响应包中的 MAC 地址是否与目标 IP 地址对应的 MAC 地址一致。

下面是一个简单的 Python 代码实现 ARP 检测:

import os
import sys
import struct
import socket
import fcntl
import time

# 获取本机 IP 地址和 MAC 地址
def get_local_ip_mac(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    local_ip = socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,
        struct.pack('256s', ifname[:15].encode())
    )[20:24])
    local_mac = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15].encode()))[18:24]
    return local_ip, local_mac

# 构造 ARP 请求包
def build_arp_request(local_ip, local_mac, target_ip):
    eth_hdr = struct.pack("!6s6s2s", b"\xff\xff\xff\xff\xff\xff", local_mac, b"\x08\x06")
    arp_hdr = struct.pack("!2s2s1s1s2s", b"\x00\x01", b"\x08\x00", b"\x06", b"\x04", b"\x00\x01")
    arp_sender = struct.pack("!6s4s", local_mac, socket.inet_aton(local_ip))
    arp_target = struct.pack("!6s4s", b"\x00\x00\x00\x00\x00\x00", socket.inet_aton(target_ip))
    arp_packet = eth_hdr + arp_hdr + arp_sender + arp_target
    return arp_packet

# 发送 ARP 请求包
def send_arp_request(arp_packet, interface):
    s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW)
    s.bind((interface, socket.SOCK_RAW))
    s.send(arp_packet)

# 接收 ARP 响应包
def recv_arp_response():
    s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW)
    while True:
        packet = s.recvfrom(65535)[0]
        eth_hdr = struct.unpack("!6s6s2s", packet[:14])
        if eth_hdr[2] == b"\x08\x06":
            arp_hdr = struct.unpack("!2s2s1s1s2s", packet[14:28])
            if arp_hdr[4] == b"\x00\x02":
                return eth_hdr[0], arp_hdr[3]

# 检测 ARP 是否被欺骗
def arp_detect(ifname, target_ip):
    local_ip, local_mac = get_local_ip_mac(ifname)
    arp_packet = build_arp_request(local_ip, local_mac, target_ip)
    send_arp_request(arp_packet, ifname)
    time.sleep(1)
    res_mac = recv_arp_response()[1]
    if res_mac != local_mac:
        print("ARP 欺骗已检测到!")
    else:
        print("ARP 正常!")

# 调用 arp_detect 函数进行检测
ar_detect("eth0", "192.168.1.1")

需要注意的是,该代码只能检测本地网络中的 ARP 欺骗,如果要检测跨网络的 ARP 欺骗,需要进行更复杂的操作。

Python 代码实现 ARP 检测 - 识别网络攻击

原文地址: https://www.cveoy.top/t/topic/joy4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录