天天看點

Hydra爆破[無驗證碼]Web頁面

Hydra是密碼爆破神器,讀者可以閱讀這篇文章<​​Hydra – Brute Force Techniques​​>,了解Hydra支援的協定。其中,爆破Http登陸密碼比爆破其他協定的密碼更為複雜,本文将介紹如何爆破HTTP登陸頁面的密碼。HTTP有兩種方式發送密碼:Get Method和Post Method,後者比前者複雜,是以需要差別對待。

0.區分Get/Post類型的登陸頁面

0.1.使用Wireshark:

分析HTTP協定怎會少了Wireshark?區分Web是以Get Method還是以Post Method發送密碼對Wireshark而言簡直是小菜一碟:選擇網卡後,在"Display fitler"中輸入http,然後重新整理登入頁面,回到Wireshark,分組清單的"Info"列會顯示該登入頁面使用何種Method發送密碼。如下圖,是我登入TP-Link路由器(TL-WR841N)管理頁面時,Wireshark捕獲的結果,TP-Link以Http Get Method方式發送密碼:

Hydra爆破[無驗證碼]Web頁面

0.2.使用Firefox-firebug插件:

用Firefox打開登入頁面,按F12或者在頁面上右鍵-"檢視元素",激活Firebug,如下圖:

Hydra爆破[無驗證碼]Web頁面

點選Firebug-"網絡",然後登入頁面。網絡标簽頁會列出登入頁面發出的請求,以及消息頭。消息頭中将列出請求類型:

Hydra爆破[無驗證碼]Web頁面

因為通路Web頁面少不了浏覽器,是以本文就使用Firebug示範。有了上面的鋪墊,我們由簡單到複雜,爆破登陸頁面。

1.爆破Get Method類型的登陸頁面

先從Get Method入手,靶機還是TP-Link的登陸頁面。用hydra爆破Get Method類型的登陸頁面,需要關注2個資訊:伺服器IP和登陸頁面(Login Page)。在Firebug-網絡标簽頁中選擇一個請求-進入右側的消息頭(Headers),點選"編輯和重發"按鈕,Firebug會列出在新請求(New Request)框中IP和登陸頁面的資訊:

Hydra爆破[無驗證碼]Web頁面
Hydra爆破[無驗證碼]Web頁面

上圖中伺服器IP是192.168.2.1;請求的登陸頁面是 "/"。現在可以基于這些資訊開始建構hydra的指令(假設你已經有爆破字典,沒有的話可以參考這篇文章​​生成字典​​):

hydra -l Eugene -P wordlist.txt -t 4 -vV -f 192.168.2.1 http-get /
#-l Eugene是登入賬戶名 簡單起見沒有使用使用者名字典
#-P 指定密碼字典
#-f 爆破成功後hydra就停下
#對于參數http-get 需要提供前面firebug給出的IP:"192.168.2.1"和登陸頁面:"/"      

人品足夠好,hydra不久會給出密碼(password:123321as):

Hydra爆破[無驗證碼]Web頁面

2.爆破Post Method類型的登陸頁面

爆破Post Method類型的登陸頁面相對麻煩,需要關注4個資訊:伺服器IP,登入頁面,消息主體(Request Body)和錯誤消息(payload)。所幸,這些資訊在Firebug中也有提供。

消息主體(其實是POST消息送出的表單參數)位于:Firebug-網絡-消息頭-編輯和重發-新請求,如下圖:

Hydra爆破[無驗證碼]Web頁面

錯誤消息位于:Firebug-網絡-響應-響應載荷(payload),(PS:錯誤消息作為hydra區分登入是否成功的重要參考資訊。并不需要提取全部錯誤消息,隻需要找到代表性的登入錯誤提示即可),如下圖:

Hydra爆破[無驗證碼]Web頁面

先看一個簡單的頁面(老婆做的頁面...),輸入錯誤的密碼後會在頁面上列印一段錯誤消息,比如我輸入name:admin,key:1234,看下Firebug的輸出:

<html>
<header>
    <meta charset="utf-8"/>
</header>

<body>
    <form action="post1.php" method="post">
        name:
        <input name='uName' type='text' />
        key:
        <input name='uKey' type='password' />
        <input type="submit" value="Submit" />
    </form>
    <?php
  
    $uName = $_POST["uName"];
    $uKey = $_POST["uKey"];
    if ($uKey !== "999") {
        // header("Location: index.php");
        // exit;
        echo "Error";
    };

    ?>
</body>

</html>      
Hydra爆破[無驗證碼]Web頁面
Hydra爆破[無驗證碼]Web頁面

Firebug顯示伺服器IP:192.168.0.151;登陸頁面是/post.php;請求主體,也就是POST送出的表單參數:uName=admin&uKey=1234;服務傳回的錯誤消息中包含"Error"字元串。是以,我們可以這樣建構hydra指令行:

hydra -l admin -P wordlist.txt -f -t 4 -vV 192.168.0.151 http-post-form "/post.php:uName=^USER^&uKey=^PASS^:Error"      

運作指令,同樣,人品夠好的話hydra會馬上傳回結果:

Hydra爆破[無驗證碼]Web頁面

再修改一下登陸頁面,當輸入錯誤的密碼時,彈出錯誤對話框:

<html>
<header>
    <meta charset="utf-8"/>
</header>

<body>
    <form action="post2.php" method="post">
        name:
        <input name='uName' type='text' />
        key:
        <input name='uKey' type='password' />
        <input type="submit" value="Submit" />
    </form>
    <?php
  
    $uName = $_POST["uName"];
    $uKey = $_POST["uKey"];
    if ($uKey !== "999") {
        echo "<script>alert('ERROR')</script>";
    };

    ?>
</body>

</html>      
Hydra爆破[無驗證碼]Web頁面

修改後的消息頭和響應載荷(payload)分别為:

Hydra爆破[無驗證碼]Web頁面
Hydra爆破[無驗證碼]Web頁面
hydra -l admin -P wordlist.txt -f -t 8 -vV 192.168.0.151 http-post-form "/post2.php:uName=^USER^&uKey=^PASS^:alert"