Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得MAC和IP';使用python在外部网络上对设备的访问_Python_Networking_Packets_Sniffing - Fatal编程技术网

如何获得MAC和IP';使用python在外部网络上对设备的访问

如何获得MAC和IP';使用python在外部网络上对设备的访问,python,networking,packets,sniffing,Python,Networking,Packets,Sniffing,我一直在处理数据包,在这样做的过程中,我制作了一些嗅探程序,在这些程序中拾取广播的数据包(下面是其中一个)。我想在我的程序中添加一种方法,告诉我设备的MAC和(如果可能的话)它们在嗅探到的外部网络上的IP地址(该网络的内部地址)(扫描一个单独的网络)。我知道,设备上的自动连接选项允许您查看设备IP/MAC和它们过去连接到的网络(由于它们广播),但是,据我所知,仅当它们在您的网络上时才起作用。如果有任何方法可以做到这一点,那就太好了(比如airodump ng),下面是代码: #!/usr/bin

我一直在处理数据包,在这样做的过程中,我制作了一些嗅探程序,在这些程序中拾取广播的数据包(下面是其中一个)。我想在我的程序中添加一种方法,告诉我设备的MAC和(如果可能的话)它们在嗅探到的外部网络上的IP地址(该网络的内部地址)(扫描一个单独的网络)。我知道,设备上的自动连接选项允许您查看设备IP/MAC和它们过去连接到的网络(由于它们广播),但是,据我所知,仅当它们在您的网络上时才起作用。如果有任何方法可以做到这一点,那就太好了(比如airodump ng),下面是代码:

#!/usr/bin/env python
import scapy
import os
import optparse
import sys
import socket
from scapy.all import *
import platform
os_type = platform.system()
if(os_type != "Linux"):
    print("[-] Error. Made for Linux.")
    try:
            exit(0)
    except:
        sys.exit(1)
class c:
    r = '\033[0;31m'
    g = '\033[0;32n'
    o = '\033[0;33m'
    b = '\033[0;94m'
    p = '\033[0;35m'
    d = '\033[0;00m'
    w = '\033[0;54m'
class ssid_fingerprint:
    w_ssid = 'Dot11'
    parser = optparse.OptionParser()
    parser.add_option("-i", "--interface", action="store", dest="inter", help="Interface Protocal", default="no_interface")
(options, args) = parser.parse_args()
error = c.w+'['+c.r+'-'+c.w+'] '
if(options.inter=="no_interface"):
    print(error+'You must supply a interface')
    try:
        exit(0)
    except:
        sys.exit(1)
#elif('mon' not in str(options.inter)):
#   print(error+'You must use a monitor interface')
#   try:
#       exit(0)
#   except:
#       sys.exit(1)
ssid_captures = []
#subprocess.Popen(['ifconfig '+options.inter+' down ; ifconfig '+options.inter+' promisc ; ifconfig '+options.inter+' up'], shell=True)
while True:
    try:
        ssid_packet = sniff(iface=options.inter, count = 1)
        for pck in ssid_packet:
            if(pck.haslayer(Dot11)):
                try:
                    ssid_layer = pck.getlayer(Dot11)
                    ssid_name = ssid_layer.info
                    ssid_mac = ssid_layer.addr2
                    ssid_string = str(ssid_name)+':'+str(ssid_mac)
                    if(ssid_string not in ssid_captures):
                        ssid_captures.append(str(ssid_name)+':'+str(ssid_mac))
                    print('[*] SSID: {} | SSID MAC:     {}').format(ssid_name, ssid_mac)
                except:
                    pass
    except KeyboardInterrupt:
        print("Captured SSID's:"),
        print(ssid_captures)
        try:
            exit(0)
        except:
            sys.exit(1)
#   except OSError:
#       subprocess.Popen(['ifconfig '+options.inter+' down ; ifconfig '+options.inter+' promisc ; ifconfig '+options.inter+' up'], shell=True)
#   except socket.error:
#       pass
    except:
        raise

MAC地址仅在具有这些MAC地址的主机连接的LAN上有效或可见。路由器从数据包中剥离帧头,并为数据包必须通过的下一个接口创建新帧,从而丢失任何原始的第2层寻址。此外,并非所有第2层协议都使用MAC地址,只有IEEE LAN协议使用MAC地址,其中一些协议使用48位MAC地址,而另一些协议使用64位MAC地址。PPP之类的协议不使用任何寻址,而ATM或帧中继之类的协议则完全使用其他方式。@RonMaupin有没有办法拦截这些帧而不进入它们的网络,而且如果第2层寻址丢失,airodump ng如何能够捕获外部网络上的MAC?帧不会离开LAN。正如我所解释的,路由器将从数据包中剥离帧。路由器按第三层地址路由数据包,因此它们转储第二层信息,并且必须为其发送数据包的下一个接口的网络创建新的第二层帧。这是101路,我不太明白你的意思。我没有假设你的知识水平,我只是指出这是基本的路线知识。您当然可以对此进行研究,但可以从以下方面进行研究:“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题与堆栈溢出无关,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决此问题所做的工作。”