是否可以通过被动监控流量来检测路由器 WPS 按钮是否被按下?

是否可以通过被动监控流量来检测路由器 WPS 按钮是否被按下?

我的意思是你可以使用此命令检查 wps 按钮是否已被按下

wpa_cli wps_pbc

但我想知道是否可以使用 airodump-ng 来做到这一点

没有任何人连接到它。

wifiphisher 实用程序声称能够做到这一点,即使我无法找到任何有关可以做到这一点的现成工具的信息

而且 python 代码不够清晰,所以我不知道他们是如何做到的

尝试找出一种被动执行此操作的方法,将其添加到可能的新攻击向量中

谢谢

答案1

我们首先检查Wi-Fi 保护设置规范

AP 使用探测响应消息通知登记者选定的注册器处于 PBC 模式

登记者通过发送具有指示登记者处于PBC模式的设备密码ID的探测请求并接收指示具有PBC设备密码ID的选定注册器的探测响应来执行此扫描。

当 AP 从注册器接收到指示 PBC 模式的选定注册器和设备密码 ID 时,它必须自动删除此信息,并且在经过一段步行时间后不再将其包含在探测响应中。在按下注册器按钮之前,AP不得公布任何活跃的 PBC 状态

在此输入图像描述

在此输入图像描述

在此输入图像描述

并从另一个WPS 文档标题为:无线 LAN PCI 卡用户手册 V1.1我们发现

设备密码 ID:指示所选注册商打算使用的方法或标识特定密码。 PBC 模式下的 AP 必须在两分钟步行时间内指示 0x0004。

我们现在了解到所需的信息位于来自 AP 的信标帧中

要检查这些信息,如果您愿意,我们可以使用三种工具来完成此操作

首先,我们检查没有按下按钮和按下按钮的 AP 上广播的探测有什么不同

为此,我们必须tcpdump在所需设备上使用 airodump 或两次,一次按下按钮,一次不按下按钮,然后我们尝试来自wireshark wiki的WPS PBC过滤器找出两者之间的差异

正如我们在尝试这些过滤器中的任何一个时所看到的

wps.selected_registrar_config_methods.phy_pushbutton
wps.selected_registrar_config_methods.pushbutton
wps.selected_registrar_config_methods
wps.device_password_id

只有按下 wps 按钮的捕获才会获得匹配

在此输入图像描述

请注意,只有wps.device_password_id == 0x0004过滤器可以可靠地检查按钮是否被按下,因为其他过滤器可能会导致误报

一位有关此事的专家的引述

"wps_selected_registrar" : 01并不意味着所有路由器都处于 PBC 模式,有些路由器还处于"wps_selected_registrar" : 01PIN 模式,并且这些路由器中 95% 或更多容易受到 Pixie Dust 攻击,

现在我们知道并测试了差异。我们可以使用另外两种工具来完成此操作,以节省时间

  1. 我们可以使用 github 上的这个 python scapy 脚本wps2key.py但请注意,它仅适用于 2.7 的旧系统

    chmod +x wps2key.py

    ./wps2key.py -i mon0 -v

我们也可以在这里看到差异 在此输入图像描述

  1. 使用著名的工具清洗。确保它已更新到最新版本掠夺者 wps-fork-t6x,要查看值,我们需要使用 json 选项 -j。此外,json 模式会检测已打印的 AP 的 WPS 配置何时发生更改,并打印另一行,因此无需退出并重新启动或每次都检查更改的循环

    清洗-i wlan0mon-j

在此输入图像描述

我们在这里也可以看到差异,但由于 Wash 没有显示我们在wireshark 中使用的所有其他元素。我们有wps_device_password_idselected_registrar_config_methodsto 区分推动和非推动

请注意,我们没有使用wps_selected_registrar因为它不可靠

我们还可以使用单行将其自动化,并且我们将使用-c-b选项来使其更快

timeout 10s wash -i wlan0mon -j -b XX:XX:XX:XX:XX:XX -c 8 | grep -q '"wps_device_password_id" : "0004"' && echo Pushed || echo NotPushed 

也可以使用一个小的 python 脚本文件来完成

import subprocess, sys ,os
argv = list(sys.argv)
argv[0] = 'wash'
proc = subprocess.Popen(argv, executable=argv[0], stdout=subprocess.PIPE)
while 1:
        line = proc.stdout.readline()
        if line == '': break
        print line
        if '"wps_device_password_id" : "0004"' in line:
            proc.terminate()
                print("WPS PBC enabled")
                break

注意这里要运行它

将脚本保存为washwrapper.py 并运行它,而不是使用您通常传递给wash 的所有参数进行wash。像 python2washwrapper.py -j -i wlan0mon -c 6 .修改“../src/wash”清洗二进制位置的路径,而不是仅仅清洗,如果需要的话,否则它不起作用

感谢你/罗弗0r剧本并就此事提供帮助

如果您想连接到它,如果我们发现按钮被按下,我们可以使用wpa_cli wps_pbc命令而不是 print 或者更好的是我们可以使用一次射击带有新添加的 --pbc 标志的 Python 脚本,只需单击一下即可完成该过程,无需事先配置,而且作为奖励,它也会输出密码。

Start WPS push button connection:

sudo python3 oneshot.py -i wlan0mon --pbc

在此输入图像描述

但请记住,为了能够在 python 中运行系统命令,我们使用 os.system("command")

最后,在搜索整个网络并发现零个网站提到或谈论它后,我不得不自己回答这个问题。

相关内容