2021年8月31日 星期二

CodeCrackWin 3.0版(圖形驗證碼暴力破解工具) 使用說明

之前版本使用WebBrowser組件處理請求及回應,發現無法正確處理Ajax及JSON,因此重新改寫,仍由WebBrowser讀取第一頁面,以便取得登入欄位及驗證碼圖形。暴力測試測試則改由HttpWebRequest處理,以解決前版遭遇的問題。

執行檔下載:CodeCrackWin.ZIP(記得調整設定檔 CodeCrackWin.config)

原始碼下載: CodeCrackWin-source.ZIP (本專案是用 Visual Studio 2013開發的)

範例網頁:CodeCrackDemo.ZIP (請自行掛載到IIS)

一、前言
CodeCrackWin是以.NET 3.5為基礎,用C#寫成的,主要的OCR元件為tessdata 4的函式庫。這支程式算是入門級,可能還有很多狀況沒有考慮到,因此誤判率可能不低,能應付的圖形碼也有限,當初開發的目的只是為了測試使用者是否使用弱密碼,但軟體總是要先有初版,如果不符您的需求,請直接移除。
二、安裝CodeCrackWin
CodeCrackWin 採綠色軟體模式開發,不必安裝,但需依程式存放的目錄調整組態檔。
修改CodeCrackWin.exe.config
1.<appSettings>區段的設定
tessedit_char_whitelist:表示進行OCR時只會判斷這些字元,如果圖形碼使用的字元愈多,本程式的辨識就愈低。系統預設只用數字和大寫字母,如果待破解的網站會用到小寫字母,請將此設定的 value 加入小寫字母。如果網站的圖形碼只有數字,則將此參數值設成「0123456789」,可以提高辨識率。
程式中的「 OCR字元」欄位內容與tessedit_char_whitelist的功用相同,只是「OCR字元」針對特定的網站(寫在設定檔中,程式執行時,如果「OCR字元」有值,則優先使用「OCR字元」內容,如果「OCR字元」是空的,則使用tessedit_char_whitelist的內容。
timer_tick:設定嘗試破解的時間間隔,單位是毫秒,如設為3000,表示每三秒鐘才嘗試一組帳密。
2. <userSettings>> <  TesseractOCR.Properties.Settings> 區段
TessdataPath<value>是指定ORC判斷的範本,如果設錯了,程式執行時會卡住,它的路徑一定要指定程式安裝位置下的tessdata目錄,以本例應該是D:\CodeCrack\tessdata。  (上圖是我的測試環境,和這一段的描述的路徑不同)
三、第一次執行
要執行此程式,只要雙擊「CodeCrackWin.exe」即可,起始畫面如下圖(預先填入一些值,只是為了讓使用者明白該欄位的格式),是有點複雜,而且使用上也需要一點竅門。
下列是程式各欄位說明 (畫面上的>數字對應下列的項次編號):
1.網址:這是需要使用者填入帳號及密碼的頁面網址,通常就是系統的登入頁面,必須指定完整的網址,如果實際的登入頁是嵌在frame(或iframe)裡,應該要指定真正的登入頁網址,而不是佈置frame的外圍網址。
2.帳號欄位登入網頁上用來填「帳號」的欄位之name或id屬性值。例如該欄位的HTML是<input type="text" name="account" id="account-id">,則這一欄就是填「account」;如果沒有name屬性,則填id的值「account-id」。
3.密碼欄位登入網頁上用來填「密碼」的欄位之 name屬性內容。例如該欄位的HTML是<input type="password" name="pwd" id="pwd-id">,則這一欄就是填「pwd」;如果沒有name屬性,則填id的值「pwd-id」。
4.圖形碼欄位登入網頁上用來填「圖形驗證碼」的欄位之name屬性內容;如果沒有name屬性,則填id的值。
5.圖形元素的TagName:由於應用程式有不同方式可提供圖形,這裡必須要知道它是用img 或 input,例如它的html碼是<IMG id=loginImg src=\"../VerifyCodeServlet?t=login\">,這一欄就填「img」。又如果是用<input name="ImageButton1" src="ValidateCode.aspx"> ,就填「input」。類型一定要正確,否則會找不到圖形。
6.圖形碼來源:用來判斷驗證碼圖形元素的關鍵字,程式是靠這段文字判斷哪一個元素是圖形,以第5.點的說明為例,圖形元素的HTML碼是<IMG id=loginImg src="../VerifyCodeServlet?t=login">,則這一欄可以填「VerifyCodeServlet?t=login」或「VerifyCodeServlet?」
7.圖形座標微調:有時程式自動判斷圖片位置會有些微誤差,可以利用此欄位進行微調,單位是「像點」。有些驗證碼圖形會加外框(指圖本身),造成程式誤判背景顏色,這種情況可以利用應標微調方式避開外框,以下圖而言,紅色外框轉成灰階後會近似黑色,但實際背景應該是白色,由於框的寬度是2pix,因此可將 x,y 各設為2。x是水平座標,也就控制圖形左邊的垂直框線,y是垂直座標,也就控制圖形上邊的水平框線。
8.去2nd雜點去3rd雜點:這是用來強化清除圖片雜點的選項,請視圖片的品質選用,有時過度清除雜點也會造成失真,要不要啟用,應該以實際情況做為依據。
9.未使用圖形驗證碼:本程式除了針對有圖形驗證的登入頁面外,也適用於無圖形驗證的登入頁面,若登入頁未使用圖形驗證碼機制,請將此欄打勾,程式就不會處理圖形辨識。要應付沒有圖形驗證碼的登入頁面,hydra會是更好的選擇。
10.(OCR結果):這裡可看到OCR辨識結果,供人工判斷辨識成功與否。
11.(灰階值):當用滑鼠點擊31.的驗證碼圖形時,這裡會顯該像點的灰階值,可做為24. 25.項的噪音線上、下限調整參考。
12. 提交字串:新版改用HttpWebRequest提交資料,因此需要知道提交對象及內容。
如何得知提交字串?可以利用瀏覽器的開發人員工具攔截人工登入的流量,查看「登入」時,帳號、密碼及驗證碼是如何提交給後端驗證,並記錄提交對象提交方法提交內容。提交字串的內容就是<提交對象>?<提交內容>所組成。
若為GET方式,URL的內容就是提交字串,若為POST方式,要手工自行組合。
為了順利提交資料,提交字串需要稍作整形,以下圖的例子來看,從瀏覽器取得的提交字串是「Account=test&Password=password&VarifyCode=666666&AccountType=Student&__RequestVerificationToken=uar5cJQ4LbogTjPEp3dPJgcohYranexj7qfqSO4T_l-bgmJ9duY42rzCPTJxByMmY9Mu1PhWEulmZBunU7i5sRQJUa81」,其中紅字部分是變動資料,必須告訴工具要用哪些資料來替換。
例如:test是來自表單的「Account」欄位,所以「test」要改成「^Account^」,同理password要改成密碼欄的名稱或id,即「password」要改成「^Password^」;某些Web系統會動態塞入一些防偽造token,只要它是插在表單的欄位裡(例如 hidden),也可以利用前述的替換手法,讓系統自動提交,例如「__RequestVerificationToken=^__RequestVerificationToken^」,本工具就會從表單中找出__RequestVerificationToken的值,在請求登入時,提交正確的token值。

13. 提交方式:參考12. 的說明,依照提交方法,請選擇「GET」或「POST」。
14. 資料型態:參考12. 的說明,依照提交內容的格式,請選擇「URL格式」或「JSON」。
15. 轉址層數:當提交登入資料後,後端程式可能會依驗證結果而做轉址,此處的轉址層數是告訴工具,若有轉址行為,只要判斷到第幾層就好,所謂第幾層,就是收到幾次30x的狀態碼。
16.帳號檔載入帳號單一帳號:此三項是一體連動的,若勾選單一帳號,則帳號檔的內容就是單筆帳號,例如只想嘗試破解admin這組帳號的密碼,就可以將單一帳號打勾,並於帳號檔填「admin」。如果單一帳號沒有打勾,就可以利用載入帳號鈕選擇字典檔,將待測的帳號清單載到程式中,載入後,有效的帳號筆數會出現在此按鈕文字的右方,例如載入5筆帳號,按鈕文字會由「載入帳號」變成「載入帳號(5)」,而帳號檔這一欄的內容就是帳號字典檔的路徑。
17.密碼檔載入密碼單一密碼:此三項是一體連動的,若勾選單一密碼,則密碼的內容就是單筆密碼,例如只想嘗試password這組密碼,就可以將單一密碼打勾,並於密碼檔填「password」。如果單一密碼沒有打勾,則可以利用載入密碼鈕選擇字典檔,將待測的密碼清單載到程式中,載入後,有效的密碼筆數會出現在此按鈕文字的右方,例如載入5筆密碼,按鈕文字會由「載入密碼」變成「載入密碼(5)」,而密碼檔這一欄的內容就是密碼字典檔的路徑。
18.帳密方式:執行暴力破解時,預設(都不勾選時)是先選一組帳號,然後測試所有密碼後(密碼先行),再選下一組帳號,這種破解方式很可能讓使用者的帳號被鎖定(DoS攻擊的一種)。本工具提供另三種帳密使用方式:
帳號先行:有些系統會每隔一段時間(如30分鐘)自動解鎖,這時就可以選用帳號先行策略,選一組密碼,嘗試所有帳號之後,再選下一組密碼,讓每組帳號被測試的間隔拉長。
帳密同行:帳號清單及密碼清單同時遞增,只要其中一種測試完畢,即停止測試。
只用帳號:將帳號清單的內容同時填在帳號欄及密碼欄。一般用在登入頁面只有帳號欄位,而沒有密碼欄位時。(此時3. 的密碼欄位可以隨便指定一個名稱)。
19. 登入失敗的訊息登入成功的訊息:用來判斷帳密正確與否的字串,若不勾選,則回應內容若存在指定的字串,就視為登入失敗;若勾選,則回應內容若存在指定的字串,就視為登入成功。(見 20. )
20. (判斷登入結的文字):配合19. 的設定,用來判斷登入成功或失敗的回應文字。這裡判斷的字串不一定是顯示在頁面的文字,必須小心分析出成功或失敗的差異。
21.驗證碼錯誤的訊息:當驗證碼錯誤時,伺服回應的判斷訊息,程式是利用此文字判斷填入的驗證碼是否正確。
22.帳號鎖定之訊息:當帳號被鎖定時,伺服回應的判斷訊息,程式是利用此文字判斷帳號是否已被鎖住,鎖住的帳號就不會再嘗試。
23.OCR字元:設定OCR識別的範圍,如果圖形驗證碼只會出現數字,此欄可以填「0123456789」,如果會出現大小寫及數字,就必須填入「0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
24.噪音線灰階下限、25.噪音線灰階上線、25'. 降階值:這三個值會影響程式過濾圖形的噪音線及噪音點的能力,噪音線灰階的低愈低,表示顏色愈黑,0是全黑,反之,愈高就是愈白,255是全白,所謂上限或下限是指色碼值介於上、下限之間的像點才視為待辨識的文字,其餘的像點將被當成雜點而被濄濾掉,程式過濾噪音的能力就愈好,ORC的正確率就愈高。圖形會先轉成256階的灰階形式,以利OCR處理,降階值就是將256再降成更少階,例如填「8」,就是將每8階縮成1階,所以256階就會變成32階,如果圖形的文字和背景、噪音的色差很大,可以調高此值,如果色差很小,則此值就要調小一點。這三個>值沒有一定的基準,針對不同的站臺,一定有不同的最佳值,必須自己嘗試
26.密碼嘗試次數:最少1次,若設9999即表示嘗試密碼清單中的所有值,這一項是為了防止帳號被鎖而設計的,如果已知密碼錯5次會被鎖定,則可以將次數設為3,讓帳號不會被鎖,只要過幾天,使用者正確登入,則密碼錯誤的計數就會歸零。
27.放大倍數:進行OCR時,將圖形放大有時可以提高成功率,此值為浮點數,可以設 1到2之間的數。
28.旋轉角度:有些圖形內的文字會以鈄體方式呈現,可以利用旋轉角度(-90~90之間)將它變成水平,以利OCR處理,當然對於隨機傾鈄的文字就無能為力了。
29.test鈕:當設好各個欄位後,可用「test」鈕試跑一筆,它真的只會跑一筆而已,用途就是測試欄位填的恰不恰當,也可以看看OCR結果理不理想,如果不理想可以試者調整:噪音線灰階下限噪音線灰階上線降階值去2nd雜點去3rd雜點放大倍數旋轉角度等參數,找出最佳辨識力。
30.開始嘗試:當按下此鈕,程式就會開始嘗試猜解,而且按鈕文字會改成「停止嘗試」,隨時可按「停止嘗試」中止此次的猜解作業(本程式沒有「暫停」功能)。
31.查看說明:載入本程式的說明文件(就是現在看到的頁面)
32.載入設定、33.儲存設定:因為本程式有許多設定欄位,如果每次執行都要逐一設定,鐵定瘋掉,為了讓設定結果可以重複取用,故可將目前運作良好的值存成設定檔,下次只要用「32.載入設定」就可以取回設定值。當然也可以建一個公版,修改後用「33.儲存設定
34.(瀏覽視窗):每一回的瀏覽畫面會顯示在此視窗。
35.(處理後的驗證碼圖形)、36.(選用圖形碼):這裡會顯示圖片經程式轉換過程中,不同處理階段經OCR的結果,可以此預覽圖,做為各項參數調整的參考。在七道處理過程中,如果覺得某一道的OCR之正確率最高,可利將它勾選,就會以該道的OCR結果作為提交的圖形碼,而不是提交最終結果的圖形碼。
此圖形處理過程平常是隱藏的,可以雙擊10. 的圖片來開/關此方框。
37.(破解的帳密):如果有猜解到的帳密會顯示在這裡。而執行目錄下會記錄執行日誌,格式為yyyymmddRun.log (yyyymmdd是年月日)。
在執行破解時,此清單會隱藏,若要手動開關,可以雙擊16. 或 17. 的文字標籤(即帳號檔密碼檔字樣)
38.(自定JavaScript):這些JavaScript只會作用於登入頁面。當頁面載入完成後,會呼叫__func__函式,而寫在此處的JavaScript則會被包封進__func__中,所以,寫在此處的JavaScript只支援單純的指令,請不要再用 function NAME() {   } 去包裝。例如:
/*test   不要再自己加 function NAME() {  }  */
document.getElementById("Account").style.backgroundColor = "green";
39.(目前嘗試的帳密):為了讓使用者目前處理進度,這裡會顯示目前嘗試的帳號及密碼。
四、載入帳號及密碼字典檔
為了進行暴力猜解,會需要帳號及密碼的字典檔,字典檔必須一組資料一行,程式目前不支援在一個檔案中同時以帳號、密碼組合的配對形式,帳號及密碼必須是各自獨立的檔案。下面是帳號字典檔的範例。
admin
88991
93676
peterwumoj7427
52137
五、存成設定檔及載入設定檔
由於猜解圖形驗證碼和猜解一般只有帳號密碼的困難度有很大差異,必須調整最佳參數才能得到理想效果,調整參數相當累人,當然不希望每回測試時都要重填一次,因此可將目前的設定結果儲存起來(見「33.儲存設定」),下次執行同一網站的猜解時就可用「32.載入設定」載入之前儲存的參數。
設定檔本身就是一支文字檔,也可以手動編輯,有關設定檔的說明請參考CodeCrack的設定檔
六、測試用範例網頁
任隨猜解別人網站的帳密是違法行為,為了測試此工具,筆者做了一組小小的網頁(CodeCrackDemo),您可以將它架在IIS上,做為測試之用,如果執行無誤,應該會發現兩組帳密:admin12345678a 和usermyPass1234

2 則留言:

  1. 您好 範例網站無法下載測試....

    回覆刪除
    回覆
    1. 感謝您指正,已修正連結。
      https://drive.google.com/file/d/1OTqu8KoeJ3zXr3vsOxNc0gAJOeTg4N-9/view?usp=sharing

      刪除