Python暴力破解WiFi密码:WPA2握手包抓取与字典攻击实战 简介这是一份面向Python初学者与网络安全入门者的实验型资源聚焦wifi密码暴力破解的实现原理。程序以预设的八位数密码字典为基础通过循环读取txt文件中的候选密码逐一向可搜索到的无线网络发起连接尝试适合在自家网络或已授权环境下进行技术演练速度约每秒一次连接可用于理解简单口令爆破的完整流程。压缩包共3个文件、约3KB包含2个Python脚本和1个纯文本密码字典。py脚本分别承担密码字典的读取与连接尝试逻辑txt文件则存放待测试的八位数密码组合结构精简便于初学者直接阅读和修改。该资源发布后已有16474人学习兼具热度与实操参考价值。通过学习读者可以掌握Python文件读写、循环控制、异常处理及无线接口交互的基本写法并借此熟悉字典攻击的思考方式与局限性。作为入门级实验代码它演示了自动化网络连接尝试的简易实现也提示了强密码与访问控制的重要性。1. Python暴力破解WiFi密码从动手到懂原理的实验路径Python暴力破解WiFi密码听起来像黑客电影里的镜头但在网络安全入门实验里它是一条把无线协议、抓包工具和Python文件操作全部串起来的路径。很多python初学朋友第一时间以为要拿着网卡到处蹭网实际不是。我们要拿到的不是「随便一个路由器」而是「你授权测试的路由器」。资源包里的脚本和文档正是帮你扫盲的一整套实战Demo。这套资源解决的核心问题是让你搞明白四个环节怎么监听空中的WiFi信号、怎么把握手包完整抓下来、怎么用字典一个个验算、最后怎么确认密码有效。它不是暗网教程是安全测试技能树里很基础的一环。适合读过Python基础语法、但还没接触过无线安全的从业者和学生。全程跑完一遍你会对信息收集、离线计算、结果验证这些概念有一个非常具体的体感。我建议你把自己的手机热点或家里闲置路由器当靶场密码设成已知的弱口令比如 12345678先跑通流程再谈真实环境。2. 从WPA2握手到Python脚本破解前的三个底层认知2.1 四次握手与PMK为什么“暴力”其实是“字典”WPA2-PSK 整个认证的核心是预共享密钥PSK就是你输入的路由器密码。它不会在网上明文传输而是通过四个握手包EAPOL帧完成密钥确认。简单理解路由器发一个随机数给客户端客户端把随机数、SSID、MAC地址和自己知道的PSK一起做一系列运算回传一个校验字段路由器做同样计算并比对两边一致就放行。攻击者可以在这一轮通信中把四个包全部记录下来之后离线复现。原因是握手包中携带了计算所需的公开信息SSID、双方MAC、随机数。唯一未知的是PSK。于是破解任务就变成对字典中的每个候选密码重新算一遍从PSK到校验字段的哈希链路看是否命中。这个过程可完全脱离路由器运行也不会触发告警所以比在线猜密码现实得多。WPA2-PSK 采用的 KDF 是 PBKDF2具体参数是 HMAC-SHA1、迭代4096次、输出256位。这四个参数在不同设备间几乎一致因此算法复杂度固定。如果要用纯Python演示可以这样生成PMKimport hashlib def generate_pmk(password, ssid): # WPA2 的 PMK 生成参数PBKDF2-HMAC-SHA1迭代4096次输出32字节 pmk hashlib.pbkdf2_hmac( sha1, password.encode(utf-8), ssid.encode(utf-8), 4096, dklen32 ) return pmk if __name__ __main__: ssid_name test_router psk goodpassword123 pmk generate_pmk(psk, ssid_name) print(pmk.hex())这段代码就是整条破解链路的起点。hashlib.pbkdf2_hmac四个参数从左到右分别代表哈希算法、密码原文、盐值这里用SSID、迭代次数、输出长度。注意WPA2把SSID作为盐值相同密码在不同路由器上算出的PMK完全不同所以字典攻击没法提前预计算所有密码的PMK必须拿到目标SSID后现场算。这也说明为什么密码中带上随机前缀会让破解成本成倍增加因为盐值不固定。这里有一个常见认知误区所谓的“暴力破解”不是把8位纯数字从00000000试到99999999。WPA2的密钥空间太大一个长度为8的随机密码穷举量足够让GPU集群跑很多年。现实中的成功案例基本都是命中字典里的弱口令或“弱口令变形”。所以脚本设计最花心思的部分其实是字典而不是循环本身。2.2 工具链选型无线网卡、aircrack-ng 与 Python 的配合要跑通上面的算法还需要一个能拿到握手包的设备。普通笔记本内置网卡常由驱动限制不开放监听模式。监听模式monitor mode让网卡不连接任何WiFi只被动接收周围所有的无线帧。这是抓包的前提。我一般这样选硬件优先考虑USB外接网卡芯片尽量选Atheros或Realtek的8812au这类驱动支持好的型号兼容性列表在无线安全工具社区里能查到。不要只看宣传页写的“大功率”驱动兼容才是第一位。网卡方案芯片监听模式推荐场景内置网卡Intel/RTL部分支持日常连接别指望抓包USB外接1Atheros AR9271稳定入门测试首选USB外接2Realtek 8812au需要装驱动追求5GHz频段时选Python脚本在整个流程里的定位不是重造轮子而是把外部命令串联起来。通过subprocess调airmon-ng、airodump-ng、aircrack-ng这些现成命令行工具能少写几百行协议代码也更稳定。import subprocess cmd [which, aircrack-ng] result subprocess.run(cmd, capture_outputTrue, textTrue) if result.returncode 0: path result.stdout.strip() print(aircrack-ng:, path) else: print(aircrack-ng 未安装请先安装必要依赖)这是最简单的环境自检脚本。subprocess.run里我习惯把capture_output设为True这样外部工具的提示信息能进stdout不会直接打在终端。脚本启动第一步就做这样的检查能省掉后续大量找不到命令的排错时间。有人会问为什么不用Python的scapy直接伪造数据包、自己计算PTK答案是没必要。抓包、编解码、注入这些底层能力aircrack-ng 做了十几年远比个人从零写的稳定。Python更适合做“调度层”和“结果层”调度外部命令、监听输出、解析结果、管理字典。资源包里的脚本也是这么分的真正的算法交给专业工具Python只做胶水。这个选型思路不只适用于无线你做其他安全工具集成时也一样适用。3. 抓包与破解实操从监听模式到跑出密码的完整流程3.1 启动监听模式驱动加载与模式切换先把USB网卡插上断开任何正在连接的WiFi避免网卡驱动自动切换回受管模式。在终端执行iwconfig确认新网卡的接口名一般叫wlan0或wlx...。然后停用系统网络管理服务再启动监听模式sudo systemctl stop NetworkManager sudo airmon-ng start wlan0执行完用iwconfig再看一次网卡模式会变成Monitor接口名可能变成wlan0mon。这一步翻车的点在于没有停掉NetworkManager它会把网卡拉回托管状态导致监听模式秒退。参数说明airmon-ng start wlan0中的wlan0要改成你自己网卡的接口名start表示创建监听接口成功后原接口可能被禁用。如果网卡驱动加载有问题会提示类似“SIOCSIFFLAGS: Operation not permitted”这时先检查是否装好了对应驱动不要急着换命令。另外VirtualBox虚拟机里的无线网卡基本玩不了监听建议直接用物理机或装着USB网卡的树莓派。我一开始图方便在虚拟机里折腾白白耗了两天后来换到物理机才正常。这不是玄学是虚拟机的无线帧透传能力天然残缺。3.2 抓取握手包airodump监听与认证干扰监听模式启动后我们需要一边扫描目标网络一边等客户端重新连接。先用airodump-ng扫描周围热点sudo airodump-ng wlan0mon屏幕上会不断刷新可见的BSSID、信道、客户端数量。当目标网络的功率信息稳定后按CtrlC停止扫描再针对目标在固定信道抓包sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w handshake wlan0mon参数说明-c 6指定信道6--bssid指定目标路由器MAC这里用假MAC演示-w handshake是把抓到的包写入当前目录的handshake文件。这样只接收该路由器上的流量文件不会夹杂其他网络的数据。现在问题来了如果客户端没有重新连接就一直没有新的四次握手。最简单的办法是向连着的客户端发送解除认证帧让它掉线再自动重连。常见的做法是用aireplay-ngsudo aireplay-ng -0 3 -a AA:BB:CC:DD:EE:FF -c 00:11:22:33:44:55 wlan0mon参数说明-0 3是连续发送3个解除认证帧-a后面是路由器BSSID-c后面是客户端MAC。发送期间airodump窗口里如果出现包含“EAPOL”或“handshake”的提示说明已经抓到了。注意这个操作会对正常网络造成干扰只能在授权测试环境中做否则就是破坏。等到提示抓到手CtrlC结束。这时目录下会生成一个.cap文件也就是之后跑字典的输入。你可能会看到多个cap文件比如handshake-01.cap、handshake-02.cap这是因为airodump每收到一次握手就换一个文件。挑最新的一个用就行。3.3 Python自动化用subprocess串联抓包和跑包很多初学者会把上一步理解为纯手工操作但实际做安全测试时我会写一个Python脚本让它完成固定动作扫描、锁定、抓包、跑字典。资源包里的核心脚本就是这么设计的。下面这段是简化的跑包环节import subprocess cap_file handshake-01.cap password_dict wordlist.txt cmd [ aircrack-ng, cap_file, -w, password_dict, -b, AA:BB:CC:DD:EE:FF ] result subprocess.run(cmd, capture_outputTrue, textTrue) output result.stdout if KEY FOUND! in output: for line in output.splitlines(): if KEY FOUND! in line: pwd line.split([)[1].split(])[0] print(找到密码, pwd) else: print(字典中未命中需要更换字典)逻辑说明aircrack-ng读取handshake-01.cap握手包配合字典文件逐条验算-b指定目标BSSID防止同频干扰。脚本通过subprocess.run拿到完整输出再用字符串匹配定位“KEY FOUND!”那一行的密码。容易出错的地方是aircrack-ng的输出在部分系统会把密码写在两行中间直接解析一行可能失败。我通常建议先打印输出看一眼格式再调整字符串切分逻辑。这比盲改正则靠谱。另外capture_outputTrue时外部程序可能往stderr写日志排查时也要打印result.stderr不要只看stdout。这一章的实操流程我把它做成一个命令序列启动监听、扫描、抓包、解除认证、跑字典。中间任何一步被中断都需要回退到上一步。对初学者来说最好一次只开一个终端分别看着网卡状态和抓包状态不要把所有输出混在一起。资源包里还有个辅助脚本会把这几步压缩成一行命令自动记录时间戳和信道跑完生成日志文件方便后面复盘。4. 避坑四个最容易让实验中断的问题与排查记录4.1 网卡启动监听模式失败现象执行airmon-ng start wlan0后iwconfig显示模式还是Managed或者提示Operation not permitted。原因硬件驱动不完整或系统服务在干扰。多数内置网卡默认没有监听驱动USB网卡则可能装错支持版本。解决先用lsusb确认芯片型号再去对应驱动仓库查支持状态不要相信店家说的“即插即用”。如果是Realtek芯片经常需要先卸载内核自带模块再装载对应驱动这一步每家卡不一样资源包里有一份排错清单跟着步骤走就行。同时务必执行systemctl stop NetworkManager或者用airmon-ng check kill自动停掉冲突进程。如果两条都做了还不行果断换一张至少被二十份文档验证过的网卡。为了一张几十块的网卡和一个驱动血战三天时间成本实在不划算。4.2 一直抓不到握手包现象airodump 开在目标信道上列表里能看到客户端但长时间没有显示WPA handshake。原因不是所有流量都包含握手包。四次握手只在客户端重新连接时出现如果一个客户端稳定在线又从不重连就永远没有新的EAPOL帧。解决用aireplay-ng -0把客户端踢下线让它重连。重连瞬间抓包机要正好在监听。注意有些客户端踢一次就会重连有些要等一段时间。另一个常见问题是选错了信道airodump 全频扫描后停在了不是目标所在信道的位置。解决办法是先用全频扫描记录目标BSSID和CH再固定信道去抓。还有一个细节摄像头、智能音箱这类固件简单的IoT设备收到解除认证帧后不会像手机那样立刻重连可能隔很久。这时候最好找一台手机去主动连目标WiFi让握手包必然出现。折腾了四十分钟没抓到包的话十有八九是客户端选得不对。4.3 Python脚本提示找不到命令现象手动在终端执行aircrack-ng没问题但Python脚本运行时却报FileNotFoundError/command not found。原因外部工具在/usr/sbin下Python的子进程没有继承环境变量的完整PATH。解决调用时给subprocess.run加一个env参数把/usr/sbin和/usr/local/bin合并进去或者直接写完整路径。我一般用import os env os.environ.copy() env[PATH] os.pathsep /usr/sbin:/usr/local/bin result subprocess.run([aircrack-ng, ...], capture_outputTrue, textTrue, envenv)这段代码的作用是把PATH扩展到/usr/sbin让aircrack-ng能被找到。os.pathsep是路径分隔符Linux下是冒号。如果你用安装包方式装了新版本工具路径到了/opt记得也把对应目录加进去。我的习惯是在脚本最开始写一个环境检测函数把所有外部工具的绝对路径都拿一遍哪个缺失就直接退出不用等到半路才炸。4.4 字典文件太大脚本内存直接炸现象用readlines()加载一个大字典跑了十分钟还没开始内存占用飙升到几个G机器卡到鼠标都动不了。原因部分初学者习惯一次性把文件读到列表里而安全测试常用字典解压后超过十G比如基础弱口令动态生成的组合字典文件本身就数以G计。解决改成逐行读取处理完一行就丢弃。还可以在进入Python前先量一下字典大小超过内存容量的就分块或用外部工具直接处理。下面的写法只保留当前行def test_wordlist(path): with open(path, r, encodinglatin-1) as f: for line in f: candidate line.strip() # 这里做具体的PMK或hash校验参数说明encodinglatin-1很关键因为很多字典文件写入的时候不是严格的UTF-8用UTF-8读会直接报UnicodeDecodeError。逐行读的效率完全够关键是不要用readlines一次性铺开。4.5 跑包速度慢到怀疑人生现象字典只有一万条但aircrack-ng跑了几分钟才跑完感觉还不如手动试。原因PBKDF2 迭代4096次是CPU密集计算纯Python循环计算PMK会比C程序慢很多。如果你在脚本里自己实现了PMK计算这会非常明显。解决尽量让aircrack-ng或hashcat这类C/OpenCL程序去跑计算Python只负责调度和解析。如果非要在Python里做局部验证用hashlib.pbkdf2_hmac而不是自己写哈希循环。小块字典可以先在Python里过滤掉明显不可能的口令比如长度不对、包含非ASCII字符的再交给外部工具通常能筛掉一半词条。5. 从“跑通”到“可信”验证密码、GPU加速和实验底线5.1 验证结果别让“假密码”骗过你跑出“KEY FOUND”之后不代表实验完全结束。尤其是在真实测试中字典命中可能是误报特别是信道抓包不干净多个AP混在一个文件里。我建议验证密码的正确性做两件事第一重新用airodump-ng只抓这个BSSID的包确认 handshake 文件干净第二用一个真实的连接尝试来验证密码。在Linux下可以用wpa_supplicant先写一个配置文件network{ ssidtest_router psk找到的密码 }然后执行:sudo wpa_supplicant -D nl80211 -i wlan1 -c /tmp/wpa_test.conf如果连接日志显示关联成功密码就是真的。注意wlan1这里是陪你验证的网卡接口要用支持正常连接的那张卡而不是正在监听的wlan0mon。有时候同一张卡需要先把监听模式切回Managed否则会出现“设备忙”的错误。5.2 从CPU到GPU用hashcat把速度提上去Python脚本调aircrack-ng跑的是CPU多核做4096次迭代的PBKDF2比较吃力。一个只有几千条的小字典可能不明显到了真实规模的字典CPU速度就成了瓶颈。大多数进阶者会在这时转入hashcat。先把握手包转换成hashcat需要的格式hcxpcapngtool handshake-01.cap -o hash.hc22000然后用GPU跑同一个字典hashcat -m 22000 hash.hc22000 wordlist.txt参数说明-m 22000是WPA-PBKDF2-PMKIDEAPOL模式的哈希模式hash.hc22000是转换后的哈希文件wordlist.txt是字典。hashcat会用显卡并行计算速度可能比CPU的aircrack快几十倍。在Python脚本里也可以做这样的分支检测到hashcat存在就把过程替换成hashcat否则回退到aircrack。我一般在脚本开头做一次能力探测优先走GPU。5.3 实验底线授权、白盒和善后我从接触这套东西开始就被某导师反复强调一句话没有书面授权的破解等于破坏。这不是道德说教是真实安全测试工作的第一道门槛。我自己的习惯是用一个“可丢弃”的手机热点当靶场密码设为弱口令测试前把授权范围写在一张本地备注里标明哪个SSID、哪段时间被允许测试跑完恢复所有网卡至普通模式清理临时文件。从那次因为忘记恢复网卡导致实验室网络排查了半天之后我每次实验结束都会强制走一遍airmon-ng stop wlan0mon和systemctl start NetworkManager。这套资源最值得学的地方不在于把哪个密码跑出来而在于你踩过这些坑之后能形成自己的测试规范。希望帮到你。本文还有配套的精品资源点击获取