【颖奇L’AmoreのWiFi安全系列】#4 脆弱的Wi-Fi保护设置(WPS) 3 min read
本文最后更新于 606 天前,其中的信息可能已经有所发展或是发生改变。

Author:颖奇L’Amore

Blog:www.gem-love.com


0x01 WPS介绍

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仍然存在,所以本文依然有它的用武之地。


0x02 WPS的工作模式

WPS一共有4种工作模式,实际上经常被使用的只有前两种。

PIN

存在一个由8位数字组成的PIN码,该PIN码允许客户端使用PIN码代替PSK,客户端可以直接输入8位PIN码进行连接。这个模式需要STA支持WPS-PIN码连接才可以。对于PIN码模式,又分为两种模式:

  1. AP上设置了一个固定的PIN码,所以客户端使用同一个PIN码进行连接
  2. STA生成PIN码,到AP上进行注册,注册成功后则连接成功
PBC

Push Button Configuration,即在AP上按下按钮,客户端便可以连接成功。

RFID

同时支持NFC的AP和客户端可以使用这种方式上网,客户端碰一下AP进行“刷卡”即可连接成功

USB

插USB的方式连接,不过目前我还没见过这种。


0x03 WPS工作原理

《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交互过程会循环几次,在这个过程中会得到:

  • Enrolee的Diffie Hellman公钥
  • Register的Diffie Hellman公钥
  • WPS PIN的两个Hash
  • Enrolee随机数和一个派生的authkey

这几项为后文的PixieWPS做铺垫。

不像字典破解WPA的预共享密钥,破解PIN码和其数据帧交互过程实际上没有太大关系,所以就不过多详细介绍了。有兴趣的可以参考:

hostapd wpa_supplicant madwifi详细分析(九)——wps原理及实现 一

Wi-Fi Simple Configuration Technical Specification


0x04 WPS在线暴力破解原理
在线爆破

在线暴力破解攻击就是平时我们所讲的“跑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即可跑完全部结果。

口算PIN

“口算”这个标题有点夸张了,不过这并不代表它不可能实现。

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码的对应关系,参考:

【转】PIN码免跑包无线路由器MAC对应PIN码表 直接PIN码破解WPA WPA2无线密码


0x05 Pixie Dust attack

关于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-Hash1 是前半个PIN的哈希值
  • E-Hash2 是后半个PIN的哈希值
  • E-S1 是随机数1
  • E-S2 是随机数2
  • HMAC-SHA-256 是进行哈希处理的函数
  • PSK1 是WPS PIN的前半部分,有10^4可能
  • PSK2 是WPS PIN的后半部分,有10^4可能(实际上只认为有10^3种可能,因为最后一位是校验位)
  • PKE是Enrollee的公钥
  • PKR是Registrar的公钥

他们的计算参数中出现了两个随机数E-S1和E-S2,而这两个随机数是关键中的关键!这两个随机数被所谓的“随机函数”生成。或许你对此不了解,但是你可能了解过php的mt_rand()的安全问题。所谓的随机数,实际上是“伪随机数”,这两个随机数是由哈希函数得到,甚至有可能为0!

在做PHP的伪随机数的CTF时,我们通常还原随机数种子,这样我们就可以手工计算出这个伪随机数了。同样的,我们也可以通过爆破等手段还原E-S1和E-S2这两个伪随机数,之后就可以在极短的时间内还原E-Hash1和E-Hash2这两个哈希值,也就从而得到了正确的PIN码。

不过Pixie Dust Attack只适用于雷凌、博通、瑞昱等厂商的一些芯片。


0x06 扫描WPS设备
airodump-ng
airodump-ng --wps wlan0mon

可以看到,多了一列wps,WPS列可以出现WPS的版本(0.0和空白的没有开启或不支持WPS)和这些名词:

  • USB = USB method
  • ETHER = Ethernet
  • LAB = Label. LAB is a label on the device that contains a PIN to be input into the client device
  • DISP = Display. DISP is when a device generates a PIN and then it is shown on the device
  • EXTNFC = External NFC
  • INTNFC =Internal NFC
  • NFCINTF = NFC Interface
  • PBC = Push Button 按下按钮之后连接的方式
  • KPAD = Keypad
  • Locked

关于ALB和DISP这两个模式没有找到什么资料,只找到一句英文描述,猜测LAB是AP生成一个PIN码所有人共用的方式,然后DISP是客户端生成PIN到AP注册的方式。

顺便提一下,某些设备在进行几次PIN验证后会将其WPS置为Locked来防止暴力破解攻击。但是对于某些设备,可以通过Flood Attack(泛洪水)发送一些资源来强制路由器重启,这样Locked就被重置为了初始状态。WPS-SLAUGHTER 工具使用多个无线网卡来重启WPS并查看是否重启和解锁。

推荐使用airodump-ng,因为可以直观的看到AP使用的是哪种WPS模式

wash

wash是一款专门识别启用WPS的AP的工具,默认Kali已安装。

用法可以直接看-h 英文都很简单 就不翻译了:

wash -i wlan0mon

显示的分别是BSSID、信道、信号、WPS版本、是否Locked、芯片厂商、ESSID。

wifite

wifite是个支持批量攻击且操作简单的工具,kali下已默认安装

在csdn上转载了一个wifite的用法图,原文链接在references中:

如果只是想要扫描,直接输入wifite即可

Client数需要持续多扫描一些时间才能更准确,随时可以ctrl+c停掉,其默认按照信号强度来排序。


0x07 实现WPS-PIN在线暴力破解

我虽然找到一款支持PIN模式的无线路由器,但是WPS功能不生效,无法演示。昨天已经在某宝上下单了两款老版支持PIN的路由器,不过受SARS-CoV-2病毒影响快递延迟很严重。

还好我曾在2016-2017年录制了《iSafeTeam无线局域网安全攻防系列教程》其中演示了跑PIN码,方法都一样,这里就直接从那个视频里截图了。

  • ESSID:iSafe_Normal
  • PIN:12819720
  • Pixie Dust:不支持

reaver暴力破解

reaver是最首选的工具,使用方法:

使用方法:

reaver -i wlan0mon -c [channel] -b [bssid] -v -S -d 0 -t 1 

若为了防止路由僵死,应将-d-t的参数调为默认或更大。

如下图所示,在49分钟时成功爆破出了正确的PIN码,通过PIN有得到了PSK:

由PIN获取PSK

假设通过某种途径直接获取到了PSK,可以通过reaver一键得到PSK:

reaver -i wlan0mon -b [BSSID] -p [PIN]

指定PIN开始破解

reaver的进程文件:

/usr/local/etc/reaver
/etc/reaver
  • 第一行 前四位跑到的位置
  • 第二行 后三位跑到的位置
  • 第三行 0:全部不确定 1:已确定前四 2:前四后三都确定了

前四位:

从第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。


0x08 WPS Pixie Dust Attack实现
reaver

最初在2014年曝光Pixie Dust攻击之后,有一款名为pixiewps的工具问世,不过后来已经被集成到了reaver中,所以直接使用reaver即可。

reaver -i wlan0mon -c [channel] -b [BSSID] -v -S -K 1

我并没有买到支持Pixie Dust攻击的路由器,不过我找到了一个Pixiewps Offline WPS brutefocrce attack的演示视频:

Pixiewps Offline WPS brutefocrce attack

视频中,攻击者仅仅用了1秒钟即得到了PIN码。

wifite

输入wifite之后扫描,ctrl+c结束后选择攻击的目标,之后就会开始Pixie dust攻击,若攻击成功则得到PIN码并开始通过PIN来计算PSK:

可以看到,这里成功通过Pixie-Dust攻击得到了PIN码为61118409,但是该AP并不能通过PIN得到PSK,大概可能是因为内置了WPS无法关闭,但实际上并不支持WPS的功能。

如果Pixie Dust攻击失败,wifite将自动进行PIN码穷举,穷举成功是这样的:


0x09 安全建议
  1. 首选关闭WPS
  2. 关闭PIN模式,使用PBC,同时将PSK设置的非常非常复杂
  3. 如果开启PIN码,设置5次PIN验证失败WPS自动锁定

0x0A References

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

颖奇L'Amore原创文章,转载请注明作者和文章链接

本文链接地址:https://www.gem-love.com/wlan/1498.html

注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示

暂无评论

发送评论 编辑评论

上一篇
下一篇