使用Scapy构建的网络扫描仪仅对其自身进行扫描

问题描述 投票:0回答:1

下面是我尝试作为第一个Python项目构建的NetworkScanner的代码。#!/ usr / bin / env python

import scapy.all as scapy
import optparse


def scan(ip):
    packet1 = scapy.ARP(pdst=ip)
    etherpacket = scapy.Ether(dst='ff:ff:ff:ff:ff:ff')
    broadcast_packet = etherpacket / packet1
    ans = scapy.srp(broadcast_packet, timeout=60, verbose=False)[0]
    ret_list = list()

    for item in ans:
        dic = {}
        dic['ip'] = item[1].pdst
        dic['mac'] = item[1].hwdst
        ret_list.append(dic)
    print(ret_list)
    return ret_list


def printfun(returnlist):
    print("IP\t\t\tMAC Address\n----------------------------------------------")
    for elem in returnlist:
        print(elem["ip"] + "\t\t" + elem["mac"])


def getip():

    parser = optparse.OptionParser()
    parser.add_option('-i', "--ip", dest = 'received_ip', help="Please enter the ip you want to scan")
    (option, arguments) = parser.parse_args()
    return option.received_ip


ip = getip()
if ip:
    result = scan(ip)
    printfun(result)
else:
    print("no ip given")

现在,我确实遵循了一些教程,并学会了并行构建,这对我来说似乎是正确的,但我并不擅长。但是当我执行该程序时,它仅扫描执行该程序的虚拟主机本身的IP。

/PycharmProjects/Networkscanner$ sudo python networkscanner.py -i 192.168.1.1/24
[{'ip': '192.168.1.205', 'mac': '08:00:27:1f:30:76'}, {'ip': '192.168.1.205', 'mac': '08:00:27:1f:30:76'}]
IP          MAC Address
----------------------------------------------
192.168.1.205       08:00:27:1f:30:76
192.168.1.205       08:00:27:1f:30:76

当我使用python的内置网络扫描仪时,会给出这些结果。

 Currently scanning: Finished!   |   Screen View: Unique Hosts                 

 5 Captured ARP Req/Rep packets, from 4 hosts.   Total size: 300               
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname      
 -----------------------------------------------------------------------------
 192.168.1.1     a0:47:d7:36:2a:c0      2     120  Best IT World (India) Pvt Lt
 192.168.1.203   e4:42:a6:30:93:64      1      60  Intel Corporate             
 192.168.1.205   30:b5:c2:10:05:3b      1      60  TP-LINK TECHNOLOGIES CO.,LTD
 192.168.1.207   30:b5:c2:10:05:3b      1      60  TP-LINK TECHNOLOGIES CO.,LTD

编辑:我尝试了“监视”模式,但这无济于事。我也尝试在主窗口上使用外部WiFi适配器运行它,仍然是同样的问题

有人可以协助解决我的代码中的错误吗?

python python-3.x scapy arp kali-linux
1个回答
0
投票

确定问题

如果我们更恰当地命名变量,显然问题出在哪里:

for sent_recv in ans:
    dic = {}
    return_packet = sent_recv[1]
    dic['ip'] = return_packet.pdst
    dic['mac'] = return_packet.hwdst
    ret_list.append(dic)
  • 每个item是已发送数据包和已接收数据包的元组。如此命名可以帮助识别它。
  • sent_recv的第二个元素是返回的数据包。让我们这样命名。
  • 返回数据包的目标IP和MAC地址将是我们机器的IP和MAC地址。在您的输出上下文中,这是有道理的:您为每个响应都拥有自己的IP / MAC。

因此,如果将其更改为返回数据包的src IP / MAC,我们将获得以下信息:

for sent_recv in ans:
    dic = {}
    return_packet = sent_recv[1]
    # Difference is dst => src here
    dic['ip'] = return_packet.psrc
    dic['mac'] = return_packet.hwsrc
    ret_list.append(dic)

:ARP数据包不应该花60秒钟返回-根据网络大小,它的范围更多为10到100毫秒。这里的2s超时更为合适。

测试修复程序

使用修改后的代码运行此代码,我们将获得所需的结果:

$ python script.py -i "192.168.1.0/24"
[{'ip': '192.168.1.48', 'mac': '00:1b:78:20:ee:40'}, 
 {'ip': '192.168.1.67', 'mac': '6c:33:a9:42:6a:18'}, 
...

IP          MAC Address
----------------------------------------------
192.168.1.48        00:1b:78:20:ee:40
192.168.1.67        6c:33:a9:42:6a:18
...
© www.soinside.com 2019 - 2024. All rights reserved.