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方式發送密碼:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM5UTN1QWO0AzY1gjYkhjNzYzX1QDOxgTM3AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
0.2.使用Firefox-firebug插件:
用Firefox打開登入頁面,按F12或者在頁面上右鍵-"檢視元素",激活Firebug,如下圖:
點選Firebug-"網絡",然後登入頁面。網絡标簽頁會列出登入頁面發出的請求,以及消息頭。消息頭中将列出請求類型:
因為通路Web頁面少不了浏覽器,是以本文就使用Firebug示範。有了上面的鋪墊,我們由簡單到複雜,爆破登陸頁面。
1.爆破Get Method類型的登陸頁面
先從Get Method入手,靶機還是TP-Link的登陸頁面。用hydra爆破Get Method類型的登陸頁面,需要關注2個資訊:伺服器IP和登陸頁面(Login Page)。在Firebug-網絡标簽頁中選擇一個請求-進入右側的消息頭(Headers),點選"編輯和重發"按鈕,Firebug會列出在新請求(New Request)框中IP和登陸頁面的資訊:
上圖中伺服器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):
2.爆破Post Method類型的登陸頁面
爆破Post Method類型的登陸頁面相對麻煩,需要關注4個資訊:伺服器IP,登入頁面,消息主體(Request Body)和錯誤消息(payload)。所幸,這些資訊在Firebug中也有提供。
消息主體(其實是POST消息送出的表單參數)位于:Firebug-網絡-消息頭-編輯和重發-新請求,如下圖:
錯誤消息位于:Firebug-網絡-響應-響應載荷(payload),(PS:錯誤消息作為hydra區分登入是否成功的重要參考資訊。并不需要提取全部錯誤消息,隻需要找到代表性的登入錯誤提示即可),如下圖:
先看一個簡單的頁面(老婆做的頁面...),輸入錯誤的密碼後會在頁面上列印一段錯誤消息,比如我輸入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>
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會馬上傳回結果:
再修改一下登陸頁面,當輸入錯誤的密碼時,彈出錯誤對話框:
<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>
修改後的消息頭和響應載荷(payload)分别為:
hydra -l admin -P wordlist.txt -f -t 8 -vV 192.168.0.151 http-post-form "/post2.php:uName=^USER^&uKey=^PASS^:alert"