如何获得MAC和IP';使用python在外部网络上对设备的访问
我一直在处理数据包,在这样做的过程中,我制作了一些嗅探程序,在这些程序中拾取广播的数据包(下面是其中一个)。我想在我的程序中添加一种方法,告诉我设备的MAC和(如果可能的话)它们在嗅探到的外部网络上的IP地址(该网络的内部地址)(扫描一个单独的网络)。我知道,设备上的自动连接选项允许您查看设备IP/MAC和它们过去连接到的网络(由于它们广播),但是,据我所知,仅当它们在您的网络上时才起作用。如果有任何方法可以做到这一点,那就太好了(比如airodump ng),下面是代码:如何获得MAC和IP';使用python在外部网络上对设备的访问,python,networking,packets,sniffing,Python,Networking,Packets,Sniffing,我一直在处理数据包,在这样做的过程中,我制作了一些嗅探程序,在这些程序中拾取广播的数据包(下面是其中一个)。我想在我的程序中添加一种方法,告诉我设备的MAC和(如果可能的话)它们在嗅探到的外部网络上的IP地址(该网络的内部地址)(扫描一个单独的网络)。我知道,设备上的自动连接选项允许您查看设备IP/MAC和它们过去连接到的网络(由于它们广播),但是,据我所知,仅当它们在您的网络上时才起作用。如果有任何方法可以做到这一点,那就太好了(比如airodump ng),下面是代码: #!/usr/bin
#!/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路,我不太明白你的意思。我没有假设你的知识水平,我只是指出这是基本的路线知识。您当然可以对此进行研究,但可以从以下方面进行研究:“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题与堆栈溢出无关,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决此问题所做的工作。”