一.环境
一台 kali linux,版本如下:
ssh 版本如下(ssh 默认安装,未作任何配置,全是默认配置):
二.现象
命令如下:
###暴力破解 127.0.0.1 的 ssh 协议,-l root 表示用户为 root,-P big.txt 密码字典使用
big.txt, -t 64 线程数为 64,-w 3 每次密码尝试的超时时间为 3s 。 -vV 显示详细过程 ,
-f 找到正确密码即刻停止,-o successful1a 把暴力破解的结果放入这个文件。
big.txt 是从 hydra 的默认字典中(路径/usr/share/wordlists/dirb/)复制过来的,大约 2
万行,为了测试效果,我把我的正确密码“123456”改到了 big.txt 的最后几行。
1:当我使用的字典很小的时候,比如只有几十行,很快就破解成功了。
2:当我使用上面的 big.txt(2 万行)的时候,正确密码如果在该文件的前几十行,或者
前 400 行的样子,也很快就破解成功了(命令不变,只是修改密码字典的内容)。
3:当使用 big.txt(2 万行),并且正确密码放到比较靠后的时候,该命令跑到大约 400 行
的时候屏幕的输出就会卡顿一会儿,过一会儿又继续输出,如下(总共 19732 行的字典,
下面的进度是跑到了 446 行):
4: 我同时查看 ssh 服务的日志信息(tail –f /var/log/auth.log)和执行上面的暴力破解命
令,发现前 446 行都是有这种报错命令的,类似于报“认证失败”,说明上面前 446 次的暴力
破解服务端是有反应的:
但是 446 次之后的破解,ssh 服务端的日志出现了不一样的提示信息,并且再之后就是
空白的了,没有新的信息输出了(此时 hydra 暴力破解还在运行,hydra 那儿有输出信息),
这就表示虽然我还在暴力破解,但是服务端的某个策略已经使得我得暴力破解失效了(日志
后面是空白了就表示不再理会之后的 ssh 登陆请求)
百度搜索了这个报错,大约的意思就是:PAM 被设置为”retry=3”,他将忽略同一会话
中来自 sshd 的任何进一步的身份验证请求。---这句话的意思好像是同一会话密码验证不能
超过 3 次,否在就不再处理后面的请求。但是实际现象是 ssh 暴力破解尝试了约 446 次之后
才会卡住,并且这里的会话也不知道指的什么意思。
注:ssh 服务端配置文件/etc/ssh/sshd_config 里面可以设置验证方式(配置文件里面有
个 UsePam yes 就是设置 PAM 的),貌似有三种,并且优先级为 公私钥认证>PAM 认证>密
码认证
5 由于这里 446 次之后就卡住了,也就是说 auth.log 没有输出信息了,于是我就 ctrl+C
结束了 hydra 暴力破解进程,然后我再次执行和上一次同样的暴力破解命令,auth.log 又有
输出信息了,说明 ssh 服务端又开始处理我的请求了,依然是到 446 次那儿就不再处理请求。
这就很奇怪了,同样的源 IP 和目的 IP,并且我抓包看了,前 446 次用的源端口都是不同的
(端口依次加 1,但是 IP 会话只有一百多条,不知道为什么),不知道它这个安全策略到底
是怎么样子的,也无法理解第 4 步中的报错信息的解释,但是我只关心结果,能破解成功就
行。
三.解决方法
1 通过上面现象大约可以猜测到,默认安装 ssh 服务端时,由于某种安全策略,使得我
暴力破解时密码字典不能超过大约 446 行。
2 于是我自己新建了一个 300 行左右的密码文件(行数更小更加保险),把正确密码放
在最后几行的位置,暴力破解成功。
3 但是实际环境中,密码字典肯定很大,于是我的解决思路为:将 big.txt 这个大的密码
字典拆分为小的 txt 文件,然后针对每一个文件执行一次如下的命令,只是将-P(密码字典)
后面跟的文件名改一下就行了。
我将 big.txt 拆分到了/root/tmp/这个目录下,拆分的命令为:
将 big.txt 按照每 300 行拆分一次,拆分后的文件名为前缀为 1(文件名以 1 开头),拆
分后的文件如下:
再写个脚本 1.sh,内容如下:
写了个循环,对于拆分后的每个字典文件,都执行一次 hydra 命令,linux 脚本中的代
码语法比较奇怪,和 java/c 语言什么的区别很大,比如上面的读取 tmp 目录下的所有文件:
$(ls $folder) ,$folder 符号表示取 folder 的值,也就是”/root/tmp”,左边那个$也表示取值,
但是当后面跟 linux 命令的时候,必须要用小括号括起来。
4 执行脚本之后,又发现了新问题,脚本卡在那儿了。为了排查,我执行了如下命令,
也就是对拆分后的密码文件 1aa 单独执行 hydra 命令,该文件 300 行,并且该文件中没有正
确的 ssh 密码。
命令执行到 299 行的时候,hydra 这个进程就一直卡在那儿了,不会自动结束,之前做
过测试,如果文件里面有正确密码,即使正确密码在最后一行,找到正确密码之后进程就会
自己结束。如下,行数记错了,1aa 密码文件一共是 362 行。
5 为了解决以上 hydra 进程不自己结束的问题,我大约估计了一下时间,每个密码文件
大约需要 20s 就能破解完,于是脚本文件改成了下面的:
加了一个 timeout 命令,这个命令格式如下:
timeout 时间 命令 --上面就表示 20s 内该 hydra 命令将被强制 kill 掉。
再次执行脚本,密码破解成功!现在就只需要一个强大的密码字典,就能成功暴力破解
默认安装的 ssh 服务。
查看 success 这个文件,框选部分就是成功的密码,不知为何会出现多次,下面的那些
行就是没有成功的那些密码字典的显示信息,仅显示执行了哪条命令。
四.疑惑
1 这个报错到底是什么意思:
我的疑惑如下两张图:
2 为什么 hydra 执行到倒数第二行的时候进程不会自己结束,对于我上面的解决方法,还有
没有其他的更好的方式,希望有一个老师可以教我,自己摸索又难效率又低,主要是想利用
工具进行攻击渗透(这里是指的实际环境,不是什么 dvwa 之类的靶机)。