python - 如何使用 Scapy 确定无线加密类型?

标签 python security wifi scapy

我正在对无线网络进行安全研究,其中涉及编写一个小工具来扫描附近的 Wifi 接入点。根据发现的加密类型,它会继续进行其他一些安全测试。

到目前为止,我有 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和 channel ,这似乎是这样,但我认为这不是强制性的。

这段代码应该可以完成工作:

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 .

关于python - 如何使用 Scapy 确定无线加密类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613091/

相关文章:

linux - rt2870.o/rt2870.ko USB 无线适配器安装问题

python - 如何删除 float64 值的多余数字?

python - 有没有办法找到结束 token

php - 从 PHP 类和 DBMS 技术创建 PDO 连接字符串

Android WIFI ADB 插件不适用于某些 Android 真实设备?

android - Android WifiManager 如何连接到 wpa_supplicant?

python - FTP上传文件Python

python - 是否有一种非阻塞方式来检查 asyncio 子进程是否还活着?

asp.net - 是否有理由编写自己的身份验证而不是使用 Forms Security

security - API 网关的可选授权