GSB Bruteforce
C / libcurl這是一款我使用 C 語言搭配 curl API 開發的命令列(CLI)程式,用於執行暴力破解(brute-force)攻擊。
背景
在 BTS SIO 課程中,我們使用 PHP 搭配 CodeIgniter 框架開發了一個網站:GSB。
之後,我們被要求測試網站的安全性,並修補一些常見的資安漏洞。
我曾嘗試使用 Hydra 等現有工具對專案進行暴力破解攻擊,但由於網站的設計方式、MVC 架構以及框架的運作機制,幾乎不可能使用 Hydra 破解使用者密碼。
這是因為 Hydra 是透過分析表單目標頁面的 HTML 內容來判斷登入是否成功,而我的網站則是透過一個純 PHP 頁面(不含任何一行 HTML)來驗證帳號密碼是否有效。
因此,我決定自行開發一套暴力破解工具,改用 URL 重新導向與 HTTP 狀態碼來判斷登入是否成功,這樣更符合我的網站設計。
運作方式
原始碼分為兩個部分。第一部分依照所提供資料集所採用的密碼規則產生密碼,也就是 5 個字元,可能是小寫字母或數字。只需修改程式中的幾行程式碼,即可使用其他長度或字元組合。
第二部分使用 curl API 及其 C 語言函式庫 libcurl,向傳入程式的表單發送 POST 請求,測試密碼並檢查 HTTP 狀態碼與 URL 重新導向。若成功到達正確的 URL,程式會顯示使用者名稱與密碼並結束執行。
若找不到任何有效密碼,程式也會顯示相應提示。
程式測試
我們假設使用者帳號已經是已知的,因為資料集始終遵循相同的命名規則(名字的第一個字母加上姓氏,去除重音符號並全部小寫)。
首先鎖定表單所在的 URL,接著嘗試登入,並使用瀏覽器的開發者工具來查看所送出請求的內容。
此時我們已取得表單送出的確切請求內容,以及各變數的名稱。我 GitHub 專案中的原始碼已經使用了這個請求。
我的程式可以使用 URL 重新導向或 HTTP 狀態碼來判斷登入是否成功。如果已知登入成功後會到達的 URL,就可以直接使用;否則需要透過 curl API 進行一些測試,判斷哪個 HTTP 狀態碼代表登入失敗,之後只在取得不同狀態碼時才顯示結果。
在這個範例中,假設我們已知登入成功後的 URL 為「selection」頁面,程式將測試所有可能的密碼組合。
可以觀察到,當登入失敗時,會得到帶有錯誤 GET 參數的「index」URL,並回傳 HTTP 200 狀態碼;而登入成功時,則會到達「selection」URL,並回傳 HTTP 500 狀態碼。
因此,無論使用上述哪一種方法,都能成功找出密碼。最後,程式會顯示帳號與密碼。