我正在进行无线网络的安全研究,该研究涉及编码一个小工具,用于扫描附近的Wifi接入点.根据发现的加密类型,它继续进行其他一些安全测试. 到目前为止,我有一个python代码,它使用Scapy枚
到目前为止,我有一个python代码,它使用Scapy枚举不同的访问点,以及它们是否启用了加密(Enc = Y或Enc = N).这个代码是:
def sniffAP(p): if ( (p.haslayer(Dot11Beacon) or p.haslayer(Dot11ProbeResp)) and not aps.has_key(p[Dot11].addr3)): ssid = p[Dot11Elt].info bssid = p[Dot11].addr3 channel = int( ord(p[Dot11Elt:3].info)) capability = p.sprintf("{Dot11Beacon:%Dot11Beacon.cap%}\ {Dot11ProbeResp:%Dot11ProbeResp.cap%}") # Check for encrypted networks if re.search("privacy", capability): enc = 'Y' else: enc = 'N'
我想要的是能够使用python和scapy区分不同的加密类型(WEP,WPA,WPA2,WPS).有任何想法吗?
基于airodump-ng代码(aicrack-ng套件),您正在寻找的信息位于特定的Dot11Elt层内.顺便说一下,在你的代码中,你通过猜测它们位于第一个和第三个Dot11Elt层中来获得SSID和通道,这似乎就是这种情况,但我不认为它是强制性的.这段代码应该做的工作:
def insert_ap(pkt): ## Done in the lfilter param # if Dot11Beacon not in pkt and Dot11ProbeResp not in pkt: # return bssid = pkt[Dot11].addr3 if bssid in aps: return p = pkt[Dot11Elt] cap = pkt.sprintf("{Dot11Beacon:%Dot11Beacon.cap%}" "{Dot11ProbeResp:%Dot11ProbeResp.cap%}").split('+') ssid, channel = None, None crypto = set() while isinstance(p, Dot11Elt): if p.ID == 0: ssid = p.info elif p.ID == 3: channel = ord(p.info) elif p.ID == 48: crypto.add("WPA2") elif p.ID == 221 and p.info.startswith('\x00P\xf2\x01\x01\x00'): crypto.add("WPA") p = p.payload if not crypto: if 'privacy' in cap: crypto.add("WEP") else: crypto.add("OPN") print "NEW AP: %r [%s], channed %d, %s" % (ssid, bssid, channel, ' / '.join(crypto)) aps[bssid] = (ssid, channel, crypto) aps = {} sniff(iface='mon0', prn=insert_ap, store=False, lfilter=lambda p: (Dot11Beacon in p or Dot11ProbeResp in p))
更新:此代码现已过时.此代码的更新版本为integrated to Scapy.