Author:颖奇L'Amore Blog:www.gem-love.com
WPS是Wi-Fi Protected Setup(Wi-Fi保护设置)的简称。在本系列中第一篇文章中我写了这样的内容:
但是因为802.11标准太复杂,于是成立了Wi-Fi联盟并由Wi-Fi联盟提出Wi-Fi标准,Wi-Fi联盟还自行提出了一些标准,比如Wi-Fi保护设置(WPS,跟QSS一样)。
所以WPS是由Wi-Fi联盟提出的,并不是最初的IEEE 802.11系列的一部分,WPS的提出是为了方便家庭用户连接,用户无需输入复杂的Wi-Fi密码即可进行网络连接。在WPA2出现后,Wi-Fi联盟又制定了WPS的升级版——WCS(Wi-Fi Simple Configuration),除此之外一些厂商比如TP-Link将之称为QSS(快速安全设置),实际上本质都一样,后文统一用WPS这一称号。 但是在2011年WPS被披露了一个非常严重的漏洞,WPS的PIN码可以被攻击者在短短几个小时内被攻破,有了PIN码便可以在几秒钟内得到PSK,即使修改了密码仍然可以通过PIN码得到新的PSK,PIN成为了一个天然后门。 并不是所有的路由器都支持WPS,并且自从WPS被爆出漏洞后,很多厂商在新固件中已经不再支持WPS。比如我五年前买了一款水星MW320R最初的固件是支持WPS的,但是更新了固件后就不再支持了。而且比较坑,不能往回刷老固件
除此之外,2014年爆出了WPS另一个名为Pixie Dust attack的安全漏洞,也就是著名的pixiewps的利用漏洞,该漏洞可以秒破或者一两分钟便破解PIN码,只不过并不是所有厂商的芯片都受其影响,尽管如此WPS的安全性依然再次大大降低。 但是和同样被淘汰的WEP比起来,WPS仍然存在,所以本文依然有它的用武之地。
WPS一共有4种工作模式,实际上经常被使用的只有前两种。
存在一个由8位数字组成的PIN码,该PIN码允许客户端使用PIN码代替PSK,客户端可以直接输入8位PIN码进行连接。这个模式需要STA支持WPS-PIN码连接才可以。对于PIN码模式,又分为两种模式:
Push Button Configuration,即在AP上按下按钮,客户端便可以连接成功。
同时支持NFC的AP和客户端可以使用这种方式上网,客户端碰一下AP进行“刷卡”即可连接成功
插USB的方式连接,不过目前我还没见过这种。
《Kali Linux无线网络渗透测试详解》中对WPS给出了一个形象的描述:
我们用“锁与钥匙”的比喻来形容Wi-Fi Protected Setup认证产品的配置及安全机制。该标准自动使用注册表为即将加入网络的设备分发证书。用户将新设备加入WLAN 的操作可被看作是将钥匙插入锁的过程(即启动配置过程并输入PIN码或按下PBC按钮)。此时,Wi-Fi Protected Setup启动设备与注册表之间的信息交换进程,并由注册表发放授权设备,加入WLAN 的网络证书(网络名称及安全密钥)。 随后,新设备通过网络在不受入侵者干扰的情况下进行安全的数据通信,这就好像是在锁中转动钥匙。信息及网络证书通过扩展认证协议(EAP)在空中进行安全交换,该协议是WPA2 使用的认证协议之一。此时系统将启动信号交换进程,设备完成相互认证,客户端设备即被连入网络。注册表则通过传输网络名(SSID)及WPA2“预共享密钥”(PSK)启动安全机制,由于网络名称及PSK 由系统自动分发,证书交换过程几乎不需用户干预。WLAN安全设置的“锁”就这样被轻松打开了。
我们可以看一个WPS的帧交互图:
AP是否支持WPS是由信标帧定期(通常为100ms)通告的。有图可知,输入PIN后将开启EAP交换,通过EAP完成设备的相互认证。 实际上,在凭证被正式发送之前这个EAP交互过程会循环几次,在这个过程中会得到:
这几项为后文的PixieWPS做铺垫。 不像字典破解WPA的预共享密钥,破解PIN码和其数据帧交互过程实际上没有太大关系,所以就不过多详细介绍了。有兴趣的可以参考:
hostapd wpa_supplicant madwifi详细分析(九)——wps原理及实现 一 Wi-Fi Simple Configuration Technical Specification
在线暴力破解攻击就是平时我们所讲的“跑PIN码”。这里先来通俗的说下什么叫在线破解: 用户输入一个密码,目标响应对错,如果错了则换另外的密码继续提交给目标,假设目标离线了无法响应则无法再破解,这种就是在线暴力破解;而离线就像爆破WPA的PSK,正确的MIC就存在握手包里,本地进行计算验证即可,不需要目标AP的参与,这种称为离线破解。 PIN是一个8位数字,最后一位是校验位,除此之外还剩7位,也就是一共有10^7种可能,但是并不是需要最多10^7次爆破。AP将这个8位的PIN分成了3部分:
1234-567-8
在进行PIN码验证时,AP分别进行前4位和中3位的验证并返回结果,也就是说我们可以对这4位一组和3位一组的两个部分进行分别爆破。前4位一共产生10^4=10000种结果,中间三位一共产生10^3=1000种结果,也就是说最多只有10000+1000=11000种结果。 假设AP没有freeze时间,假设2s验证一个PIN,那么最多也只需要 (10^4+10^3)x2s = 6.11h
即可跑完全部结果。
“口算”这个标题有点夸张了,不过这并不代表它不可能实现。 1.某些厂商的设备(比如腾达某些设备)会通过设备的MAC地址来计算其默认PIN码,假设MAC地址是8C:F2:28:14:FA:A8
,其后3个字节14FFA8
转换成10进制后为1374888
,其默认的PIN的前7位就是1374888
,只需要猜第8位,一共10中可能,试一下就出来了。 2.某些厂商会根据MAC地址的前2个字节来决定PIN的前4位,MAC地址的前2字节相同,则PIN的前4位相同。有人已经总结出了厂商MAC和PIN码的对应关系,参考:
关于Pixie Dust不太清楚中文怎么翻译,如果音译Pixie Dust可以译为“皮克斯之尘”之类的,或者直接叫它“皮鞋的尘土”等等也都无所谓。 维基百科上这样形容Pixie Dust Attack:
Since both the access point and client (enrollee and registrar, respectively) need to prove they know the PIN to make sure the client is not connecting to a rogue AP, the attacker already has two hashes that contain each half of the PIN, and all they need is to brute-force the actual PIN. The access point sends two hashes, E-Hash1 and E-Hash2, to the client, proving that it also knows the PIN. E-Hash1 and E-Hash2 are hashes of (E-S1 PSK1 PKe PKr) and (E-S2 PSK2 PKe PKr), respectively. The hashing function is HMAC-SHA-256 and uses the “authkey” that is the key used to hash the data.
由于AP和客户端都需要证明他们拥有PIN来保证客户端没有连接到恶心的AP,所以攻击者已经有了2个哈希值,这俩哈希分别包含PIN的一半,并且他俩都所需要的就是去爆破实际的PIN码。AP发送了两个哈希E-Hash1和E-Hash2给客户端证明它知道PIN码。E-Hash1和E-Hash2分别是(E-S1 PSK1 PKe PKr) 和 (E-S2 PSK2 PKe PKr)的HMAC-SHA-256哈希值,并且使用authkey这个密钥去哈希加密数据。 这个authkey就是上面提到在EAP的交互中会得到的。 Pixie Dust攻击的关键在于这两个哈希:
E-Hash1 = HMAC-SHA-256(E-S1 PSK1 PKe PKr)
E-Hash2 = HMAC-SHA-256(E-S2 PSK2 PKe PKr)
他们的计算参数中出现了两个随机数E-S1和E-S2,而这两个随机数是关键中的关键!这两个随机数被所谓的“随机函数”生成。或许你对此不了解,但是你可能了解过php的mt_rand()
的安全问题。所谓的随机数,实际上是“伪随机数”,这两个随机数是由哈希函数得到,甚至有可能为0! 在做PHP的伪随机数的CTF时,我们通常还原随机数种子,这样我们就可以手工计算出这个伪随机数了。同样的,我们也可以通过爆破等手段还原E-S1和E-S2这两个伪随机数,之后就可以在极短的时间内还原E-Hash1和E-Hash2这两个哈希值,也就从而得到了正确的PIN码。 不过Pixie Dust Attack只适用于雷凌、博通、瑞昱等厂商的一些芯片。
airodump-ng –wps wlan0mon
可以看到,多了一列wps,WPS列可以出现WPS的版本(0.0和空白的没有开启或不支持WPS)和这些名词:
关于ALB和DISP这两个模式没有找到什么资料,只找到一句英文描述,猜测LAB是AP生成一个PIN码所有人共用的方式,然后DISP是客户端生成PIN到AP注册的方式。 顺便提一下,某些设备在进行几次PIN验证后会将其WPS置为Locked
来防止暴力破解攻击。但是对于某些设备,可以通过Flood Attack(泛洪水)发送一些资源来强制路由器重启,这样Locked
就被重置为了初始状态。_WPS-SLAUGHTER_ 工具使用多个无线网卡来重启WPS并查看是否重启和解锁。 推荐使用airodump-ng,因为可以直观的看到AP使用的是哪种WPS模式
wash是一款专门识别启用WPS的AP的工具,默认Kali已安装。 用法可以直接看-h
英文都很简单 就不翻译了:
wash -i wlan0mon
显示的分别是BSSID、信道、信号、WPS版本、是否Locked、芯片厂商、ESSID。
wifite是个支持批量攻击且操作简单的工具,kali下已默认安装 在csdn上转载了一个wifite的用法图,原文链接在references中:
如果只是想要扫描,直接输入wifite
即可
Client数需要持续多扫描一些时间才能更准确,随时可以ctrl+c停掉,其默认按照信号强度来排序。
我虽然找到一款支持PIN模式的无线路由器,但是WPS功能不生效,无法演示。昨天已经在某宝上下单了两款老版支持PIN的路由器,不过受SARS-CoV-2病毒影响快递延迟很严重。 还好我曾在2016-2017年录制了《iSafeTeam无线局域网安全攻防系列教程》其中演示了跑PIN码,方法都一样,这里就直接从那个视频里截图了。
reaver是最首选的工具,使用方法:
使用方法:
reaver -i wlan0mon -c [channel] -b [bssid] -v -S -d 0 -t 1
若为了防止路由僵死,应将-d
和-t
的参数调为默认或更大。 如下图所示,在49分钟时成功爆破出了正确的PIN码,通过PIN有得到了PSK:
假设通过某种途径直接获取到了PSK,可以通过reaver一键得到PSK:
reaver -i wlan0mon -b [BSSID] -p [PIN]
reaver的进程文件:
/usr/local/etc/reaver /etc/reaver
前四位: 从第4行开始相当于一个字典,而爆破了多少个PIN码和其所在行数存在偏移量为4。可以得到这样的公式:
“最后一个Pin的前四所在行数” - 4 = “第一行应该填入的号码”
这个”最后一个Pin的前四所在行数”指的是Reaver破解到哪儿了,如果你想让reaver从某个PIN开始,就应该修改进程文件让reaver认为它自己破解到这里了! 光说是说不清楚的,举个例子: 我的PIN前四位是1281,对应行数是1293,我希望reaver从1281开始破解,1293-4=1289,就在第一行填入1289。
后三位: 同样的,在10004行开始为后三位的字典。公式:
“最后一个PIN所在的后3所在行数” - 10004 = “第二行填入的数”
比如我的PIN的后三位是972,对应行数是10977,10977-10004=973,那么第二行填入973
最后别忘了第三行需要按照需要修改,改成0或者1。
最初在2014年曝光Pixie Dust攻击之后,有一款名为pixiewps的工具问世,不过后来已经被集成到了reaver中,所以直接使用reaver即可。
reaver -i wlan0mon -c [channel] -b [BSSID] -v -S -K 1
我并没有买到支持Pixie Dust攻击的路由器,不过我找到了一个Pixiewps Offline WPS brutefocrce attack的演示视频:
视频中,攻击者仅仅用了1秒钟即得到了PIN码。
输入wifite之后扫描,ctrl+c结束后选择攻击的目标,之后就会开始Pixie dust攻击,若攻击成功则得到PIN码并开始通过PIN来计算PSK:
可以看到,这里成功通过Pixie-Dust攻击得到了PIN码为61118409
,但是该AP并不能通过PIN得到PSK,大概可能是因为内置了WPS无法关闭,但实际上并不支持WPS的功能。 如果Pixie Dust攻击失败,wifite将自动进行PIN码穷举,穷举成功是这样的:
https://en.wikipedia.org/wiki/Wi-Fi\_Protected\_Setup https://security.stackexchange.com/questions/149178/what-is-pixie-dust-attack-on-router https://hackingvision.com/2017/06/14/finding-wps-enabled-aps-kali-linux-wash/ https://blog.csdn.net/Aaron\_Miller/article/details/88338245 https://www.hackingtutorials.org/wifi-hacking-tutorials/pixie-dust-attack-wps-in-kali-linux-with-reaver/ https://unix.stackexchange.com/questions/364251/airodump-ng-what-are-the-abbreviations-in-the-wps-column