戰(zhàn))
簡介這是一份面向Python初學(xué)者與網(wǎng)絡(luò)安全入門者的實(shí)驗(yàn)型資源聚焦wifi密碼暴力破解的實(shí)現(xiàn)原理。程序以預(yù)設(shè)的八位數(shù)密碼字典為基礎(chǔ)通過循環(huán)讀取txt文件中的候選密碼逐一向可搜索到的無線網(wǎng)絡(luò)發(fā)起連接嘗試適合在自家網(wǎng)絡(luò)或已授權(quán)環(huán)境下進(jìn)行技術(shù)演練速度約每秒一次連接可用于理解簡單口令爆破的完整流程。壓縮包共3個文件、約3KB包含2個Python腳本和1個純文本密碼字典。py腳本分別承擔(dān)密碼字典的讀取與連接嘗試邏輯txt文件則存放待測試的八位數(shù)密碼組合結(jié)構(gòu)精簡便于初學(xué)者直接閱讀和修改。該資源發(fā)布后已有16474人學(xué)習(xí)兼具熱度與實(shí)操參考價值。通過學(xué)習(xí)讀者可以掌握Python文件讀寫、循環(huán)控制、異常處理及無線接口交互的基本寫法并借此熟悉字典攻擊的思考方式與局限性。作為入門級實(shí)驗(yàn)代碼它演示了自動化網(wǎng)絡(luò)連接嘗試的簡易實(shí)現(xiàn)也提示了強(qiáng)密碼與訪問控制的重要性。1. Python暴力破解WiFi密碼從動手到懂原理的實(shí)驗(yàn)路徑Python暴力破解WiFi密碼聽起來像黑客電影里的鏡頭但在網(wǎng)絡(luò)安全入門實(shí)驗(yàn)里它是一條把無線協(xié)議、抓包工具和Python文件操作全部串起來的路徑。很多python初學(xué)朋友第一時間以為要拿著網(wǎng)卡到處蹭網(wǎng)實(shí)際不是。我們要拿到的不是「隨便一個路由器」而是「你授權(quán)測試的路由器」。資源包里的腳本和文檔正是幫你掃盲的一整套實(shí)戰(zhàn)Demo。這套資源解決的核心問題是讓你搞明白四個環(huán)節(jié)怎么監(jiān)聽空中的WiFi信號、怎么把握手包完整抓下來、怎么用字典一個個驗(yàn)算、最后怎么確認(rèn)密碼有效。它不是暗網(wǎng)教程是安全測試技能樹里很基礎(chǔ)的一環(huán)。適合讀過Python基礎(chǔ)語法、但還沒接觸過無線安全的從業(yè)者和學(xué)生。全程跑完一遍你會對信息收集、離線計(jì)算、結(jié)果驗(yàn)證這些概念有一個非常具體的體感。我建議你把自己的手機(jī)熱點(diǎn)或家里閑置路由器當(dāng)靶場密碼設(shè)成已知的弱口令比如 12345678先跑通流程再談?wù)鎸?shí)環(huán)境。2. 從WPA2握手到Python腳本破解前的三個底層認(rèn)知2.1 四次握手與PMK為什么“暴力”其實(shí)是“字典”WPA2-PSK 整個認(rèn)證的核心是預(yù)共享密鑰PSK就是你輸入的路由器密碼。它不會在網(wǎng)上明文傳輸而是通過四個握手包EAPOL幀完成密鑰確認(rèn)。簡單理解路由器發(fā)一個隨機(jī)數(shù)給客戶端客戶端把隨機(jī)數(shù)、SSID、MAC地址和自己知道的PSK一起做一系列運(yùn)算回傳一個校驗(yàn)字段路由器做同樣計(jì)算并比對兩邊一致就放行。攻擊者可以在這一輪通信中把四個包全部記錄下來之后離線復(fù)現(xiàn)。原因是握手包中攜帶了計(jì)算所需的公開信息SSID、雙方MAC、隨機(jī)數(shù)。唯一未知的是PSK。于是破解任務(wù)就變成對字典中的每個候選密碼重新算一遍從PSK到校驗(yàn)字段的哈希鏈路看是否命中。這個過程可完全脫離路由器運(yùn)行也不會觸發(fā)告警所以比在線猜密碼現(xiàn)實(shí)得多。WPA2-PSK 采用的 KDF 是 PBKDF2具體參數(shù)是 HMAC-SHA1、迭代4096次、輸出256位。這四個參數(shù)在不同設(shè)備間幾乎一致因此算法復(fù)雜度固定。如果要用純Python演示可以這樣生成PMKimport hashlib def generate_pmk(password, ssid): # WPA2 的 PMK 生成參數(shù)PBKDF2-HMAC-SHA1迭代4096次輸出32字節(jié) pmk hashlib.pbkdf2_hmac( sha1, password.encode(utf-8), ssid.encode(utf-8), 4096, dklen32 ) return pmk if __name__ __main__: ssid_name test_router psk goodpassword123 pmk generate_pmk(psk, ssid_name) print(pmk.hex())這段代碼就是整條破解鏈路的起點(diǎn)。hashlib.pbkdf2_hmac四個參數(shù)從左到右分別代表哈希算法、密碼原文、鹽值這里用SSID、迭代次數(shù)、輸出長度。注意WPA2把SSID作為鹽值相同密碼在不同路由器上算出的PMK完全不同所以字典攻擊沒法提前預(yù)計(jì)算所有密碼的PMK必須拿到目標(biāo)SSID后現(xiàn)場算。這也說明為什么密碼中帶上隨機(jī)前綴會讓破解成本成倍增加因?yàn)辂}值不固定。這里有一個常見認(rèn)知誤區(qū)所謂的“暴力破解”不是把8位純數(shù)字從00000000試到99999999。WPA2的密鑰空間太大一個長度為8的隨機(jī)密碼窮舉量足夠讓GPU集群跑很多年?,F(xiàn)實(shí)中的成功案例基本都是命中字典里的弱口令或“弱口令變形”。所以腳本設(shè)計(jì)最花心思的部分其實(shí)是字典而不是循環(huán)本身。2.2 工具鏈選型無線網(wǎng)卡、aircrack-ng 與 Python 的配合要跑通上面的算法還需要一個能拿到握手包的設(shè)備。普通筆記本內(nèi)置網(wǎng)卡常由驅(qū)動限制不開放監(jiān)聽模式。監(jiān)聽模式monitor mode讓網(wǎng)卡不連接任何WiFi只被動接收周圍所有的無線幀。這是抓包的前提。我一般這樣選硬件優(yōu)先考慮USB外接網(wǎng)卡芯片盡量選Atheros或Realtek的8812au這類驅(qū)動支持好的型號兼容性列表在無線安全工具社區(qū)里能查到。不要只看宣傳頁寫的“大功率”驅(qū)動兼容才是第一位。網(wǎng)卡方案芯片監(jiān)聽模式推薦場景內(nèi)置網(wǎng)卡Intel/RTL部分支持日常連接別指望抓包USB外接1Atheros AR9271穩(wěn)定入門測試首選USB外接2Realtek 8812au需要裝驅(qū)動追求5GHz頻段時選Python腳本在整個流程里的定位不是重造輪子而是把外部命令串聯(lián)起來。通過subprocess調(diào)airmon-ng、airodump-ng、aircrack-ng這些現(xiàn)成命令行工具能少寫幾百行協(xié)議代碼也更穩(wěn)定。import subprocess cmd [which, aircrack-ng] result subprocess.run(cmd, capture_outputTrue, textTrue) if result.returncode 0: path result.stdout.strip() print(aircrack-ng:, path) else: print(aircrack-ng 未安裝請先安裝必要依賴)這是最簡單的環(huán)境自檢腳本。subprocess.run里我習(xí)慣把capture_output設(shè)為True這樣外部工具的提示信息能進(jìn)stdout不會直接打在終端。腳本啟動第一步就做這樣的檢查能省掉后續(xù)大量找不到命令的排錯時間。有人會問為什么不用Python的scapy直接偽造數(shù)據(jù)包、自己計(jì)算PTK答案是沒必要。抓包、編解碼、注入這些底層能力aircrack-ng 做了十幾年遠(yuǎn)比個人從零寫的穩(wěn)定。Python更適合做“調(diào)度層”和“結(jié)果層”調(diào)度外部命令、監(jiān)聽輸出、解析結(jié)果、管理字典。資源包里的腳本也是這么分的真正的算法交給專業(yè)工具Python只做膠水。這個選型思路不只適用于無線你做其他安全工具集成時也一樣適用。3. 抓包與破解實(shí)操從監(jiān)聽模式到跑出密碼的完整流程3.1 啟動監(jiān)聽模式驅(qū)動加載與模式切換先把USB網(wǎng)卡插上斷開任何正在連接的WiFi避免網(wǎng)卡驅(qū)動自動切換回受管模式。在終端執(zhí)行iwconfig確認(rèn)新網(wǎng)卡的接口名一般叫wlan0或wlx...。然后停用系統(tǒng)網(wǎng)絡(luò)管理服務(wù)再啟動監(jiān)聽模式sudo systemctl stop NetworkManager sudo airmon-ng start wlan0執(zhí)行完用iwconfig再看一次網(wǎng)卡模式會變成Monitor接口名可能變成wlan0mon。這一步翻車的點(diǎn)在于沒有停掉NetworkManager它會把網(wǎng)卡拉回托管狀態(tài)導(dǎo)致監(jiān)聽模式秒退。參數(shù)說明airmon-ng start wlan0中的wlan0要改成你自己網(wǎng)卡的接口名start表示創(chuàng)建監(jiān)聽接口成功后原接口可能被禁用。如果網(wǎng)卡驅(qū)動加載有問題會提示類似“SIOCSIFFLAGS: Operation not permitted”這時先檢查是否裝好了對應(yīng)驅(qū)動不要急著換命令。另外VirtualBox虛擬機(jī)里的無線網(wǎng)卡基本玩不了監(jiān)聽建議直接用物理機(jī)或裝著USB網(wǎng)卡的樹莓派。我一開始圖方便在虛擬機(jī)里折騰白白耗了兩天后來換到物理機(jī)才正常。這不是玄學(xué)是虛擬機(jī)的無線幀透傳能力天然殘缺。3.2 抓取握手包airodump監(jiān)聽與認(rèn)證干擾監(jiān)聽模式啟動后我們需要一邊掃描目標(biāo)網(wǎng)絡(luò)一邊等客戶端重新連接。先用airodump-ng掃描周圍熱點(diǎn)sudo airodump-ng wlan0mon屏幕上會不斷刷新可見的BSSID、信道、客戶端數(shù)量。當(dāng)目標(biāo)網(wǎng)絡(luò)的功率信息穩(wěn)定后按CtrlC停止掃描再針對目標(biāo)在固定信道抓包sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w handshake wlan0mon參數(shù)說明-c 6指定信道6--bssid指定目標(biāo)路由器MAC這里用假M(fèi)AC演示-w handshake是把抓到的包寫入當(dāng)前目錄的handshake文件。這樣只接收該路由器上的流量文件不會夾雜其他網(wǎng)絡(luò)的數(shù)據(jù)。現(xiàn)在問題來了如果客戶端沒有重新連接就一直沒有新的四次握手。最簡單的辦法是向連著的客戶端發(fā)送解除認(rèn)證幀讓它掉線再自動重連。常見的做法是用aireplay-ngsudo aireplay-ng -0 3 -a AA:BB:CC:DD:EE:FF -c 00:11:22:33:44:55 wlan0mon參數(shù)說明-0 3是連續(xù)發(fā)送3個解除認(rèn)證幀-a后面是路由器BSSID-c后面是客戶端MAC。發(fā)送期間airodump窗口里如果出現(xiàn)包含“EAPOL”或“handshake”的提示說明已經(jīng)抓到了。注意這個操作會對正常網(wǎng)絡(luò)造成干擾只能在授權(quán)測試環(huán)境中做否則就是破壞。等到提示抓到手CtrlC結(jié)束。這時目錄下會生成一個.cap文件也就是之后跑字典的輸入。你可能會看到多個cap文件比如handshake-01.cap、handshake-02.cap這是因?yàn)閍irodump每收到一次握手就換一個文件。挑最新的一個用就行。3.3 Python自動化用subprocess串聯(lián)抓包和跑包很多初學(xué)者會把上一步理解為純手工操作但實(shí)際做安全測試時我會寫一個Python腳本讓它完成固定動作掃描、鎖定、抓包、跑字典。資源包里的核心腳本就是這么設(shè)計(jì)的。下面這段是簡化的跑包環(huán)節(jié)import subprocess cap_file handshake-01.cap password_dict wordlist.txt cmd [ aircrack-ng, cap_file, -w, password_dict, -b, AA:BB:CC:DD:EE:FF ] result subprocess.run(cmd, capture_outputTrue, textTrue) output result.stdout if KEY FOUND! in output: for line in output.splitlines(): if KEY FOUND! in line: pwd line.split([)[1].split(])[0] print(找到密碼, pwd) else: print(字典中未命中需要更換字典)邏輯說明aircrack-ng讀取handshake-01.cap握手包配合字典文件逐條驗(yàn)算-b指定目標(biāo)BSSID防止同頻干擾。腳本通過subprocess.run拿到完整輸出再用字符串匹配定位“KEY FOUND!”那一行的密碼。容易出錯的地方是aircrack-ng的輸出在部分系統(tǒng)會把密碼寫在兩行中間直接解析一行可能失敗。我通常建議先打印輸出看一眼格式再調(diào)整字符串切分邏輯。這比盲改正則靠譜。另外capture_outputTrue時外部程序可能往stderr寫日志排查時也要打印result.stderr不要只看stdout。這一章的實(shí)操流程我把它做成一個命令序列啟動監(jiān)聽、掃描、抓包、解除認(rèn)證、跑字典。中間任何一步被中斷都需要回退到上一步。對初學(xué)者來說最好一次只開一個終端分別看著網(wǎng)卡狀態(tài)和抓包狀態(tài)不要把所有輸出混在一起。資源包里還有個輔助腳本會把這幾步壓縮成一行命令自動記錄時間戳和信道跑完生成日志文件方便后面復(fù)盤。4. 避坑四個最容易讓實(shí)驗(yàn)中斷的問題與排查記錄4.1 網(wǎng)卡啟動監(jiān)聽模式失敗現(xiàn)象執(zhí)行airmon-ng start wlan0后iwconfig顯示模式還是Managed或者提示Operation not permitted。原因硬件驅(qū)動不完整或系統(tǒng)服務(wù)在干擾。多數(shù)內(nèi)置網(wǎng)卡默認(rèn)沒有監(jiān)聽驅(qū)動USB網(wǎng)卡則可能裝錯支持版本。解決先用lsusb確認(rèn)芯片型號再去對應(yīng)驅(qū)動倉庫查支持狀態(tài)不要相信店家說的“即插即用”。如果是Realtek芯片經(jīng)常需要先卸載內(nèi)核自帶模塊再裝載對應(yīng)驅(qū)動這一步每家卡不一樣資源包里有一份排錯清單跟著步驟走就行。同時務(wù)必執(zhí)行systemctl stop NetworkManager或者用airmon-ng check kill自動停掉沖突進(jìn)程。如果兩條都做了還不行果斷換一張至少被二十份文檔驗(yàn)證過的網(wǎng)卡。為了一張幾十塊的網(wǎng)卡和一個驅(qū)動血戰(zhàn)三天時間成本實(shí)在不劃算。4.2 一直抓不到握手包現(xiàn)象airodump 開在目標(biāo)信道上列表里能看到客戶端但長時間沒有顯示W(wǎng)PA handshake。原因不是所有流量都包含握手包。四次握手只在客戶端重新連接時出現(xiàn)如果一個客戶端穩(wěn)定在線又從不重連就永遠(yuǎn)沒有新的EAPOL幀。解決用aireplay-ng -0把客戶端踢下線讓它重連。重連瞬間抓包機(jī)要正好在監(jiān)聽。注意有些客戶端踢一次就會重連有些要等一段時間。另一個常見問題是選錯了信道airodump 全頻掃描后停在了不是目標(biāo)所在信道的位置。解決辦法是先用全頻掃描記錄目標(biāo)BSSID和CH再固定信道去抓。還有一個細(xì)節(jié)攝像頭、智能音箱這類固件簡單的IoT設(shè)備收到解除認(rèn)證幀后不會像手機(jī)那樣立刻重連可能隔很久。這時候最好找一臺手機(jī)去主動連目標(biāo)WiFi讓握手包必然出現(xiàn)。折騰了四十分鐘沒抓到包的話十有八九是客戶端選得不對。4.3 Python腳本提示找不到命令現(xiàn)象手動在終端執(zhí)行aircrack-ng沒問題但Python腳本運(yùn)行時卻報FileNotFoundError/command not found。原因外部工具在/usr/sbin下Python的子進(jìn)程沒有繼承環(huán)境變量的完整PATH。解決調(diào)用時給subprocess.run加一個env參數(shù)把/usr/sbin和/usr/local/bin合并進(jìn)去或者直接寫完整路徑。我一般用import os env os.environ.copy() env[PATH] os.pathsep /usr/sbin:/usr/local/bin result subprocess.run([aircrack-ng, ...], capture_outputTrue, textTrue, envenv)這段代碼的作用是把PATH擴(kuò)展到/usr/sbin讓aircrack-ng能被找到。os.pathsep是路徑分隔符Linux下是冒號。如果你用安裝包方式裝了新版本工具路徑到了/opt記得也把對應(yīng)目錄加進(jìn)去。我的習(xí)慣是在腳本最開始寫一個環(huán)境檢測函數(shù)把所有外部工具的絕對路徑都拿一遍哪個缺失就直接退出不用等到半路才炸。4.4 字典文件太大腳本內(nèi)存直接炸現(xiàn)象用readlines()加載一個大字典跑了十分鐘還沒開始內(nèi)存占用飆升到幾個G機(jī)器卡到鼠標(biāo)都動不了。原因部分初學(xué)者習(xí)慣一次性把文件讀到列表里而安全測試常用字典解壓后超過十G比如基礎(chǔ)弱口令動態(tài)生成的組合字典文件本身就數(shù)以G計(jì)。解決改成逐行讀取處理完一行就丟棄。還可以在進(jìn)入Python前先量一下字典大小超過內(nèi)存容量的就分塊或用外部工具直接處理。下面的寫法只保留當(dāng)前行def test_wordlist(path): with open(path, r, encodinglatin-1) as f: for line in f: candidate line.strip() # 這里做具體的PMK或hash校驗(yàn)參數(shù)說明encodinglatin-1很關(guān)鍵因?yàn)楹芏嘧值湮募懭氲臅r候不是嚴(yán)格的UTF-8用UTF-8讀會直接報UnicodeDecodeError。逐行讀的效率完全夠關(guān)鍵是不要用readlines一次性鋪開。4.5 跑包速度慢到懷疑人生現(xiàn)象字典只有一萬條但aircrack-ng跑了幾分鐘才跑完感覺還不如手動試。原因PBKDF2 迭代4096次是CPU密集計(jì)算純Python循環(huán)計(jì)算PMK會比C程序慢很多。如果你在腳本里自己實(shí)現(xiàn)了PMK計(jì)算這會非常明顯。解決盡量讓aircrack-ng或hashcat這類C/OpenCL程序去跑計(jì)算Python只負(fù)責(zé)調(diào)度和解析。如果非要在Python里做局部驗(yàn)證用hashlib.pbkdf2_hmac而不是自己寫哈希循環(huán)。小塊字典可以先在Python里過濾掉明顯不可能的口令比如長度不對、包含非ASCII字符的再交給外部工具通常能篩掉一半詞條。5. 從“跑通”到“可信”驗(yàn)證密碼、GPU加速和實(shí)驗(yàn)底線5.1 驗(yàn)證結(jié)果別讓“假密碼”騙過你跑出“KEY FOUND”之后不代表實(shí)驗(yàn)完全結(jié)束。尤其是在真實(shí)測試中字典命中可能是誤報特別是信道抓包不干凈多個AP混在一個文件里。我建議驗(yàn)證密碼的正確性做兩件事第一重新用airodump-ng只抓這個BSSID的包確認(rèn) handshake 文件干凈第二用一個真實(shí)的連接嘗試來驗(yàn)證密碼。在Linux下可以用wpa_supplicant先寫一個配置文件network{ ssidtest_router psk找到的密碼 }然后執(zhí)行:sudo wpa_supplicant -D nl80211 -i wlan1 -c /tmp/wpa_test.conf如果連接日志顯示關(guān)聯(lián)成功密碼就是真的。注意wlan1這里是陪你驗(yàn)證的網(wǎng)卡接口要用支持正常連接的那張卡而不是正在監(jiān)聽的wlan0mon。有時候同一張卡需要先把監(jiān)聽模式切回Managed否則會出現(xiàn)“設(shè)備忙”的錯誤。5.2 從CPU到GPU用hashcat把速度提上去Python腳本調(diào)aircrack-ng跑的是CPU多核做4096次迭代的PBKDF2比較吃力。一個只有幾千條的小字典可能不明顯到了真實(shí)規(guī)模的字典CPU速度就成了瓶頸。大多數(shù)進(jìn)階者會在這時轉(zhuǎn)入hashcat。先把握手包轉(zhuǎn)換成hashcat需要的格式hcxpcapngtool handshake-01.cap -o hash.hc22000然后用GPU跑同一個字典hashcat -m 22000 hash.hc22000 wordlist.txt參數(shù)說明-m 22000是WPA-PBKDF2-PMKIDEAPOL模式的哈希模式hash.hc22000是轉(zhuǎn)換后的哈希文件wordlist.txt是字典。hashcat會用顯卡并行計(jì)算速度可能比CPU的aircrack快幾十倍。在Python腳本里也可以做這樣的分支檢測到hashcat存在就把過程替換成hashcat否則回退到aircrack。我一般在腳本開頭做一次能力探測優(yōu)先走GPU。5.3 實(shí)驗(yàn)底線授權(quán)、白盒和善后我從接觸這套東西開始就被某導(dǎo)師反復(fù)強(qiáng)調(diào)一句話沒有書面授權(quán)的破解等于破壞。這不是道德說教是真實(shí)安全測試工作的第一道門檻。我自己的習(xí)慣是用一個“可丟棄”的手機(jī)熱點(diǎn)當(dāng)靶場密碼設(shè)為弱口令測試前把授權(quán)范圍寫在一張本地備注里標(biāo)明哪個SSID、哪段時間被允許測試跑完恢復(fù)所有網(wǎng)卡至普通模式清理臨時文件。從那次因?yàn)橥浕謴?fù)網(wǎng)卡導(dǎo)致實(shí)驗(yàn)室網(wǎng)絡(luò)排查了半天之后我每次實(shí)驗(yàn)結(jié)束都會強(qiáng)制走一遍airmon-ng stop wlan0mon和systemctl start NetworkManager。這套資源最值得學(xué)的地方不在于把哪個密碼跑出來而在于你踩過這些坑之后能形成自己的測試規(guī)范。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取