1
2
3
4
5
6
7
8
9
10
当我们需要对客户的所有Linux机器进行弱口令检查时,如果选择在线破解,不仅会影响业务,而且破解速度很慢,还必须确保在破解过程中能够持续访问。因此,将在线破解转变为要求客户提供shadow文件,这样我们就能更有优势地破解shadow文件了。后来,k哥提供了一个批量调用john the ripper破解shadow文件的bash脚本。然而,该脚本存在一些限制,因此我进行了深入研究并对其进行了优化。现在,我将在本文中记录下来。如果有更好的解决方案,欢迎交流!
#!/bin/sh
for i in `ls ./shadow/`;
do
echo "---------------$i---------------"
john --single ./shadow/$i;
john --wordlist=10W.txt ./shadow/$i;
john --format=crypt --wordlist=10W.txt ./shadow/$i;
john --format=sha512crypt --wordlist=10W.txt ./shadow/$i;
john --show ./shadow/$i > /tmp/$i.result;
done;
1
root:$1$v2wT9rQF$XSpGgoB93STC4EFSlgpjg1:14181:0:99999:7:::
1
2
3
4
5
6
7
8
9
通过分析脚本的源代码,我发现存在以下限制。针对这些限制,我思考了一些解决方法。我将使用图1对以上方法进行流程化梳理。
在开始破解之前,让我们先了解一下shadow文件的格式。可以看出,shadow文件中的每一行对应一个用户的用户名和密码等信息,格式为0:1:2:3:4:5:6:7:8。冒号是分隔符,每个字段分别代表:
其中,hash值的格式如下:$id$salt$密文。其中,id代表使用的加密算法,不同的系统使用的算法也不尽相同。salt是加密时使用的盐。最后是密文。
数字和所使用的加密算法的对应关系如下:
需要注意的是,如果密码字符串为*,表示系统用户不能登录;如果为!,表示用户名被禁用;如果密码字符串为空,表示没有密码。
0:用户名
1:密码hash值
2:密码修改距离1970年1月1日的时间
3:密码将被允许修改之前的天数(0 表示“可在任何时间修改”)
4:系统将强制用户修改为新密码之前的天数(1 表示“永远都不能修改”)
5:密码过期之前,用户将被警告过期的天数(-1 表示“没有警告”)
6:密码过期之后,系统自动禁用帐户的天数(-1 表示“永远不会禁用”)
7:该帐户被禁用的天数(-1 表示“该帐户被启用”)
8:保留供将来使用
1
2
为了提高破解的效率和准确性,我们将从多个shadow文件中提取满足以下条件的用户,并合并成一个shadow文件。为此,我编写了一个名为shadowFilter.py的脚本,用于快速批量处理shadow文件(如果想了解该脚本的各个参数作用,请查看我的GitHub)。脚本地址:
例如,如果我们想要破解shadow目录下所有shadow文件中root和test账号的密码,可以按照以下步骤进行整理:
python shadowFilter.py -d F:shadow -c 1 -iuser root -o hashcat_crack.shadow #输出适合hashcat破解的格式
python shadowFilter.py -d F:shadow -iuser root -o john_crack.shadow #输出适合john the ripper破解的格式
1
需要注意的是,-c参数表示需要提取的列数,shadow文件的格式为0:1:2:3:4:5:6:7:8,其中0列是用户,1列是密码等等。hashcat只需要提取第1列,而john需要提取全部列!
使用hashid识别hash类型是一个可以识别多种hash类型的脚本,同时它可以输出hashcat和john the ripper破解该类型的格式。以下是一些参数的描述:
hashid -m -j crack.shadow
1
2
hashcat64.exe -a 0 -m 500 out.shadow 10W.txt #500为hashcat识别出
hashcat64.exe --show out.shadow > pwd.txt #查看结果
1
2
3
john --single out.shadow
john --format=md5crypt --wordlist=10W.txt out.shadow #md5crypt为hashid识别出
john --show out.shadow >pwd.txt #查看结果
1
通过hashid识别crack.shadow中所有hash的类型,并输出相应的hashcat和john the ripper破解格式。
在破解过程完成后,我们需要将破解得到的密码与特定主机上的特定账号关联起来。同样,我们可以使用脚本进行批量处理:
https://github.com/c0ny1/WorkScripts/blob/master/crack-shadow-helper/SearchPwdFromShadow.py