忘记WiFi密码不用重置:字典攻击与握手包跑包实战
1. 先说清楚这个故事发生在什么前提下去年年底我把家里那台老路由器的后台管理密码忘了手机里存着的WiFi密码也换了三次谁也记不起现在这个到底是多少。家里人急着上网当时我脑子里冒出来的第一个念头就是算了直接捅reset孔恢复出厂重新配一遍。但转念一想家里连了三四台智能电视、两个摄像头、还有空调和窗帘的网关恢复出厂以后全部要重来一轮光是那些设备的配对流程就够折腾几个小时。就在这时候我想到平时做安全测试时经常聊到的“跑字典”这个词。既然路由器的无线密码就藏在自己的网络里那我能不能用跑字典的方式把自家这个已经存在的WiFi密码给“找回来”严格说这不是绕过什么机制而是在自己的设备上做一次密码恢复实验。整个过程下来我发现网上关于WiFi密码跑字典的说法五花八门有的故作高深有的说的是十年前的旧方法还有的一上来就让你装一堆不明来源的软件。于是我想用自己的实际操作整理出一个尽可能通俗、从零开始也能看懂的版本。需要先声明这次实验全程只针对我自己架设的测试路由器和自己家的网络设备所有操作都在合法授权范围内。如果你打算拿这套方法去试别人的网络建议趁早打消念头未经授权扫描和测试他人网络属于违规行为我不想教任何人踩这条线。本文的出发点是帮那些忘记了自家密码、或者想了解无线安全原理的朋友从一个技术研究的角度看清跑字典这件事的底层逻辑。这个内容适合谁看如果你手头正好有一台遗忘密码的老路由器又不想重置那么可以照着试试如果你想弄明白“字典”“握手包”“跑包”这些词到底是什么关系这篇也能给你讲清楚如果你单纯好奇网上说的“WiFi密码破译软件”靠不靠谱那这篇文章同样能把真相聊明白。2. 思路拆解跑字典到底在跑什么2.1 密码不会被网络直接“看见”但验证过程会留下痕迹很多人对破解WiFi密码有个误解觉得是用什么工具直接“读取”路由器里存的密码。实际上WPA2-PSK这种家用加密方式下密码从来不会在网络上以明文方式传来传去。当一台设备尝试连接路由器时双方会进行四次握手的认证过程设备并不会把密码明文发给路由器而是用密码参与一系列计算生成一个验证用的密钥。这个过程中如果密码错误计算出来的结果就对不上连接就会被拒绝。跑字典之所以可行靠的正是这个“离线验证”的特性。我们把设备连接时抓到的认证数据保存下来也就是拿到所谓的握手包之后破解工具不需要再和路由器通信可以在本地把字典里每一个猜测的密码都代入到同样的计算过程中进行一次又一次验证。密码要是碰巧在字典里验证结果一匹配瞬间就能确认。这个逻辑像什么打个比方你忘了保险箱的密码但手里握着保险箱出厂时留下的一段加密校验码。你不需要把保险箱搬到厂家去试只需要在家用一本“可能密码列表”逐个代入校验码计算。算得多了总有一个能对上。字典就是那本“可能密码列表”计算的过程就是“跑”。2.2 为什么是“字典”而不是“暴力”严格说暴力破解是穷举所有可能的字符组合比如 00000000 到 99999999再从 aaaaaaaa 到 zzzzzzzz理论上最终一定能试出来但时间成本非常可怕。一个八位纯数字密码有一亿种组合八位大小写字母加数字的组合数量更是天文数字。普通电脑全速跑很可能跑到路由器都换了三台还跑不完。字典的思路是“优化穷举范围”。现实生活里绝大多数人设置WiFi密码时并不会用完全随机的一串字符。要么是生日、手机号、房间号要么是 admin、12345678、88888888 这类最常见的弱密码要么是某个英文单词加一两个数字。跑字典就是把这些最可能被使用的密码整理成一个列表优先尝试。速度跟穷举一样快但命中率比纯粹从 00000000 开始盲试高得多。所以圈内常说一句话没有跑不出来的密码只有不合适的字典和不够长的时间。这背后其实是字典质量和算力两个变量在起作用。网上那些“秒破WiFi密码”的夸张说法多半是用了一个恰好包含目标密码的精简字典再加上预先抓好的包本质上是先射箭再画靶。2.3 关键词“跑包”和“握手包”到底是什么平时你会在各种帖子里看到“跑包”和“握手包”这两个词。握手包就是前面提到的设备与路由器认证过程中交互的数据包里面包含验证所需要的随机数、MAC地址信息还有密码派生出来的校验结果。跑包就是把抓到的握手包交给破解工具让工具拿着字典去反复计算比对。抓包是整个流程里最受硬件限制的一步。电脑的无线网卡必须支持监听模式也就是能够接收附近所有无线信号而不是只接收与自己建立连接的信号。很多笔记本自带的网卡并不支持这种模式或者驱动限制严重。我这次用的是一块常见的USB外接无线网卡芯片方案是RTL8812AU在Linux下能被完美识别监听模式也很稳定。如果你手上没有支持监听模式的网卡后面的操作基本做不了。还有一点要特别注意WPA3加密已经大幅增强了握手过程的防护传统抓握手包跑字典的方法面对WPA3网络基本失效。所以这套操作的适用对象主要是仍在广泛使用的WPA2-PSK网络。很多老路由器甚至新路由器出厂默认还在用WPA2这也是为什么跑字典到现在依然是一个值得研究的话题。3. 实操之前工具选型与测试环境准备3.1 我用到的软硬件清单这次实验我分了两个阶段第一阶段用一个旧路由器搭建靶场环境故意设了一个弱密码第二阶段用真实遗忘密码的自家网络做恢复。两阶段用到的工具基本一致列个清单给各位参考。类别设备/工具说明测试路由器一台闲置的WPA2路由器设了简单密码用于验证流程目标网络家里已遗忘密码的WPA2路由器密码存在但被忘记合法测无线网卡USB外接网卡 RTL8812AU支持监听模式操作系统Kali Linux虚拟机里跑的自带大量无线安全工具抓包工具aircrack-ng 套件包含 airmon-ng、airodump-ng 等跑包工具hashcat aircrack-ng前者用GPU加速后者够用字典常用弱密码自建字典 rockyou.txt需要说明来源与裁剪如果你没有Kali LinuxUbuntu、Debian这些发行版装上对应工具包也能用但Kali确实最省事因为它默认就把aircrack-ng 全家桶装好了。虚拟机模式下USB无线网卡需要先让虚拟机接管VMware或VirtualBox都有对应的“连接USB设备”选项不提前设置的话虚拟机里看不到网卡。3.2 抓包前必须懂的三个无线概念如果你第一次接触无线安全可能会被一堆名词绕晕。这里只挑三个最关键的说清楚。第一个是网卡接口。平时网卡叫做 wlan0但进入监听模式后系统会生成一个新的接口名比如 wlan0mon这才代表网卡正在以监听模式工作。所有抓包操作都针对这个 mon 接口。第二个是信道。路由器通信会落在某个信道上比如1、6、11周边AP多了还会自动选频。airodump-ng 抓包时必须指定信道否则网卡会不停在所有信道间跳来跳去什么都抓不完整。抓到目标AP后锁定它的信道是一个关键操作。第三个是客户端。路由器只有在有设备连接时才会进行握手通信。如果目标网络当前没有客户端在线就没有设备会去和路由器重新握手自然也就很难抓到你想要的数据包。这时候可以发一个解除认证的报文强制已连接的设备断开设备会自动重连重连过程中就会产生新的握手包。3.3 常见误区一张好网卡决定成败关于网卡多说几句。不少人兴致勃勃装好Kali打开终端却发现 iwconfig 里根本找不到无线网卡或者找到了但没法开监听模式。大概率原因就是网卡芯片不支持。Intel 的很多笔记本内置网卡在Linux下表现尚可但监听模式支持参差不齐一些博通芯片更是老顽固驱动折腾一天也未必能用。USB网卡里RTL8812AU、RTL8814AU、以及Atheros AR9271 这些都是圈内验证过、听监模式支持良好的方案。买之前别光看外形酷不酷关键看芯片型号。我自己的经验是如果打算长期研究无线安全多备一块不同芯片的网卡不亏因为不同芯片在不同频谱环境下的表现差异真的很明显。还有一个容易被忽略的点虚拟机里使用USB网卡时信号质量会比物理机直插稍差一些。如果抓包时发现握手包不完整、重传率高可以先插到物理机上跑一遍排除虚拟机的问题。另外路由器与网卡之间的距离不能太远隔着一堵承重墙时抓包成功率会明显下降。4. 跑包实战从抓包到出结果的完整流程4.1 第一步开启监听模式并扫描目标我把测试路由器放在书房的角落SSID设置为 Test_Lab加密方式 WPA2-PSK密码故意设成了“88888888”。然后在Kali虚拟机里插上USB网卡确认系统识别到 wlan0 以后执行开启监听模式的命令sudo airmon-ng check kill sudo airmon-ng start wlan0第一条命令会把系统中可能干扰监听的网络管理进程停掉避免它们不断尝试把网卡拉回托管模式。第二条命令执行成功后用 iwconfig 查看应该能看到 wlan0mon 这个接口。输入下面的命令开始扫描周围的APsudo airodump-ng wlan0mon屏幕上会滚动出周围所有可见的无线网络包括BSSID也就是AP的MAC地址、信道、加密方式、信号强度、SSID名称等。我在列表里找到了 Test_Lab对应的信道是6BSSID是类似 74:da:da:xx:xx:xx 的一串地址。记下这两个信息后面要用。4.2 第二步锁定目标并抓取握手包抓握手包的常用命令是sudo airodump-ng -c 6 --bssid 74:da:da:xx:xx:xx -w capture wlan0mon-c 指定信道--bssid 指定目标AP-w capture 表示把抓到的数据包保存到以 capture 开头的一系列文件中。执行后屏幕上会列出正在与目标AP通信的客户端设备。如果有客户端在线耐心等一会儿就能看到右上角出现 “WPA handshake: 74:da:da:xx:xx:xx” 的提示这意味着握手包已经抓到了。如果没有客户端在线或者已经联网的设备没有重新握手的迹象需要主动“踢”一下客户端。另开一个终端执行sudo aireplay-ng -0 5 -a 74:da:da:xx:xx:xx wlan0mon-0 表示发送解除认证报文5 表示发送次数-a 后面跟目标AP的BSSID。这个命令会强制目标AP下所有客户端断开断开后它们一般会自动重新连接重连时的握手过程就会被监听的网卡捕获。操作起来很简单但需要清楚这是在干扰正常通信所以一定只能对自己有权限的网络做。第一次抓包我踩了个坑由于网卡和路由器中间隔了一堵墙握手包识别速度很慢抓了七八分钟都没反应。后来把笔记本挪到书房信号强度从 -75dBm 提升到 -55dBm 左右很快就抓到了。信号质量对抓包成功率的影响比工具本身更大。4.3 第三步准备字典抓包成功之后真正开始跑字典之前需要先准备好字典。如果你只是想验证流程先做一个精简字典把最常见的密码放进去就够了。我习惯先用这个精简字典跑一遍确认工具链没问题再换成大字典跑。echo 88888888 test.txt echo 12345678 test.txt echo 123456789 test.txt echo password test.txt echo admin123 test.txt echo qwerty123 test.txtrockyou.txt 是安全测试圈子里很经典的大字典里面包含了一千多万个真实泄露的密码组合很多发行版都自带一份压缩包路径一般在 /usr/share/wordlists/rockyou.txt.gz需要先解压才能用。它的体量比较大跑起来会明显感受到速度差异适合作为第二步的验证。如果你对目标密码有比较强的个人化预期比如猜测对方大概率用生日组合那还可以用 cupp 这类工具生成一个针对性的社工字典。方法是先输入目标人物的姓名、生日、手机号、常用昵称等信息工具会根据这些信息自动组合出几千条可能密码。这次实验因为是我自己家的密码我对生成规则比较有把握所以直接手工造了一个几十条的字典把生日组合、手机尾号、常见弱密码全放进去。4.4 第四步用 aircrack-ng 快速验证先介绍一个最直接的跑包命令aircrack-ng 配合字典去跑适合CPU环境快速验证。注意airodump-ng 抓包时保存的文件名是 capture-01.cap这个文件就是我们要跑的目标。sudo aircrack-ng -w test.txt -b 74:da:da:xx:xx:xx capture-01.cap-w 后面指定字典文件-b 后面指定目标BSSID避免同一个抓包里包含多个AP时跑错目标。执行之后aircrack-ng 会先确认文件中是否存在有效的握手包然后从字典第一条开始逐条尝试。我设置的测试密码 88888888 就在 test.txt 里所以几乎在瞬间屏幕上就弹出了 “KEY FOUND! [ 88888888 ]” 的提示。这里有一个很多人问过的点跑包计算的是PMK也就是由密码和SSID经过特定算法派生出来的一个中间值。同一密码在不同SSID下会生成不同的派生结果所以字典里每一条密码都要跟当前的SSID绑定计算一次。这就是为什么跑包时不能只看密码还要确认SSID匹配。aircrack-ng 显示结果时也会同时显示对应的SSID方便核对。4.5 第五步用 hashcat 调用GPU加速aircrack-ng 在CPU环境下跑小字典完全够用但面对rockyou这类千万级别的大字典CPU速度就有点不够看了。我的笔记本带了一块入门级NVIDIA独显于是改用 hashcat 来跑GPU并行计算的速度能比CPU快几十倍。用 hashcat 跑WPA/WPA2握手包需要先把 .cap 文件转换成 hashcat 支持的格式git clone https://github.com/hashcat/hashcat-utils.git cd hashcat-utils/src make ./cap2hccapx capture-01.cap out.hccapx新版 hashcat 更推荐使用在线转换服务或者直接用 hcxpcapngtool 从 pcapng 文件中提取22000格式。我习惯的路径是先用 wireshark 或 tcpdump 把抓包文件转成 pcapng然后执行hcxpcapngtool capture-01.cap -o hash.22000这个工具会从原始抓包里提取出WPA握手认证的必要信息输出成一个纯文本的哈希文件。随后用 hashcat 跑hashcat -m 22000 hash.22000 test.txt-m 22000 指定的是WPA-PBKDF2-PMKIDEAPOL模式。第一次执行如果提示 OpenCL 设备找不到很可能是显卡驱动没装好。NVIDIA 用户需要先安装官方驱动和 CUDA 工具包AMD 用户则需要关注 ROCm 或 OpenCL 运行时。驱动问题是我这次踩过最折腾的坑后面统一放进问题排查部分。hashcat 跑起来以后屏幕会实时显示当前速度比如 800 kH/s意思是每秒尝试80万条密码。用小字典基本一两秒就出结果用rockyou这种千万级字典在入门级GPU上大概需要几分钟。跑完后用 --show 命令直接查看已恢复的密码hashcat -m 22000 hash.22000 --show5. 常见问题与排查技巧实录5.1 网卡无法开启监听模式怎么办这个问题在论坛里被问过无数次。网卡插上后执行 airmon-ng start wlan0结果提示 “Failed to set monitor mode”或者干脆找不到 wlan0大概率是驱动没生效。先确认网卡芯片是哪家的再看内核是否自带对应驱动。RTL8812AU 这类芯片在较新版Kali里通常会直接支持但旧内核或精简版系统需要手动安装驱动。我建议优先换一张确认兼容的USB网卡比折腾驱动省心太多。驱动问题之外虚拟机环境也要检查一下USB直通是否正确。虚拟机菜单里能看到“可移动设备”下有你插的网卡选中并连接客户机里才会有设备节点。如果连接不上试试把USB控制器版本从2.0切到3.1有些网卡在低版本USB控制器下供电不足会导致驱动反复掉线。5.2 抓不到握手包或提示“no usable WPA handshake”出现这个提示基本分三种情况目标AP没有客户端在通信抓包时信道没锁对网卡信号太弱没有完整捕获到四次握手的全部帧。逐个排查先用 airodump-ng 确认客户端是否在线再用 -c 参数锁定正确信道最后把电脑挪得离路由器近一些。信号质量低于 -70dBm 时抓包成功率会明显下降。我这里最终把信号提升到 -55dBm 左右情况立刻好转。还有一个小细节有些路由器设置了“无线隔离”客户端之间无法直接通信但这并不影响客户端与AP之间的握手抓取。不过如果客户端是5GHz频段而你的网卡只支持2.4GHz那就完全看不到目标。买网卡时注意是否双频5GHz频段抓包对设备要求更高。5.3 跑了很久没结果是不是密码不在字典里如果你已经确认字典和抓包都没问题跑了几分钟甚至几十分钟还是没出结果那最直接的解释就是目标密码根本不在当前字典里。这时候换字典是唯一出路。可以先换一个更大的通用字典或者结合目标的个人信息用社工字典方式生成更精准的候选集。这里也体现出一个扎实的字典库对跑包效率的决定性作用。rockyou.txt 覆盖了大量真实泄露密码但如果你怀疑对方用的是“姓名全拼8位生日”这种组合普通字典往往覆盖不到此时用 cupp 生成针对性字典反而命中率更高。两层字典结合基本能覆盖绝大多数家用弱密码场景。5.4 hashcat 报错 OpenCL 设备找不到hashcat 跑包时报错 “No devices found” 或 “clGetDeviceIDs(): CL_DEVICE_NOT_FOUND” 是常见问题。先去确认驱动是否正常运行 nvidia-smi 看是否能列出你的显卡再安装OpenCL支持库sudo apt install ocl-icd-libopencl1 sudo apt install beignet-opencl-icdAMD用户对应的包名不太一样可以搜索一下硬件架构对应的OpenCL实现。Intel核显也有对应的运行时但很多旧核显性能不理想跑WPA2不如直接用CPU来得稳。5.5 字典质量不行跑得再快也白搭我给身边朋友演示跑包时发现很多人喜欢盲目下载一个几十GB的“超级字典”结果大部分时间浪费在跑完全无关的密码组合上。字典不是越大越好精准才是第一优先。网上能搜到很多根据国内用户习惯整理的中文密码字典里面包含手机号段、生日组合、拼音规则、姓名变体等对国内家用路由器的命中率明显优于纯英文rockyou。如果目标明确动手生成一份定制字典往往比捡一个巨型字典高效得多。5.6 频繁掉线、抓包不稳怎么破如果网卡在监听过程中反复掉线或者抓包文件里出现大量重复数据先看看是不是USB接口供电不足。笔记本电脑的USB口供电参差不齐建议用带供电的USB Hub连接网卡。另外监听模式下网卡发热量很大长时间跑抓包时摸一下网卡外壳烫得厉害就得停机降温否则会频繁丢包。我在连续抓包将近一小时的时候网卡一度过热断连后来加了个散热片才好一些。6. 跑完以后的一点延伸从“破解”视角看怎么防破解6.1 为什么设置强密码比频繁更换更重要经历过这次找回自家密码的实验我对“如何防止家里WiFi被跑字典”这件事有了更直观的感受。网上很多安全建议都在强调定期改密码但跑字典的底层逻辑决定了密码只要足够长、足够随机、不在常见字典里无论换多少次都一样安全反过来如果密码是 88888888 这种弱口令改十次也没用。关键是逃避字典的覆盖范围而不是寄希望于对方认不出。一个可以落地的建议是把WPA2密码设置成至少12位包含字母、数字和特殊符号并且不要用连续数字、生日、手机号这类高概率模式。不用记那种完全无规律的乱码可以用一个自己熟悉的短句加上符号数字组合比如某个电影的经典台词简写加特殊符号再加年份这种密码既不在字典里又方便自己记住。6.2 升级到WPA3能治本吗对家用用户来说换一台支持WPA3的路由器确实是更省心的选择。WPA3在握手阶段引入了新的机制即使攻击者拿到了握手数据也没法直接离线跑字典因为每次握手都绑定了在线交互过程。这意味着传统的抓包然后慢慢跑字典的方式面对WPA3基本失效。如果你家里设备较新路由器也支持WPA3/WPA2混合模式值得优先打开。老设备不支持WPA3时可以维持WPA2混合模式但密码强度必须达标。6.3 关闭WPS、隐藏SSID有用吗有些朋友觉得隐藏SSID就找不到网络了其实用扫描工具一样能发现隐藏SSID只是名字显示为空跑字典时手动指定目标BSSID依然可以操作。隐藏SSID的防护效果非常有限实际意义不大。更值得注意的是WPS功能很多路由器的WPS PIN码只有八位数字而且最后一位是校验位实际只需要尝试前七位仅一万一千种组合攻击者可以用脚本几小时内试完。如果路由器管理后台里有WPS选项我建议直接关掉。6.4 除了密码还能做什么加固密码只是防线之一。在路由器后台开启MAC地址过滤可以挡住一部分初级的连接尝试但MAC地址可以被伪造所以这不算强力防护。真正值得做的是定期登录后台查看已连接的设备列表发现陌生设备立即踢出并修改密码。有些路由器支持访客网络可以把智能家居设备单独放在访客网络里和主网络隔离开。万一某个摄像头被利用也不会直接威胁到电脑和手机所在的主网段。我自己会在跑完包之后顺手把测试路由器的密码改成一段27位随机字符串然后专门找一个本子记下来放在抽屉里。过程很老土但比所有花里胡哨的方法都可靠。7. 最后的几点体会这次从忘记密码到跑字典找回密码前后折腾了两个晚上。最大的感受是跑字典这件事技术门槛其实没有想象中那么高真正难的是在合法边界内找到合适的使用场景并且把每一步的原理弄清楚。网上的教程总是把“秒钟破解”挂在嘴边但实际操作过的人都知道抓包、字典、算力、信号环境每一个环节都可能卡住你半天。如果你也想动手验证一下这套流程建议先找一台自己的旧路由器设一个明文知道的弱密码然后完整跑一遍“抓握手包—准备字典—跑包—出结果”的链路。这比直接对一个不知底细的网络瞎试强得多也能让你对整个机制产生更踏实的理解。哪怕最后只是把 88888888 这种密码跑出来了你也会对为何要设置强密码有非常直观的认知。工具本身的命令行其实就那么几条但参数背后的原理值得多花时间琢磨。比如PMK的派生过程、握手包里的随机数作用、字典规则的优先级这些都搞明白以后你再回头看那些“WiFi密码破译软件”的广告就能一眼看出哪些是忽悠哪些是真有技术含量。这个领域的水不算深但坑不少带着研究的心态去玩才是正确的打开方式。