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方式发送密码:
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类型的登陆页面
爆破PostMethod类型的登陆页面相对麻烦,需要关注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)分别为:
错误消息中包含"alert"字符串,将它作为关键字,构建如下hydra的命令:
hydra -l admin -P wordlist.txt -f -t 8 -vV 192.168.0.151 http-post-form "/post2.php:uName=^USER^&uKey=^PASS^:alert"
最终获得账号密码