0x01 引言 在整理文档时,我发现了几个以随机数字命名的加密PDF文件。回想起来,这些文件的密码好像是由6位以下的数字和字母组成的。我决定记录一下使用hashcat和john来破解PDF文件密码的方法,并学习一下hashcat和john的用法。本文由“壹伴编辑器”提供技术支持。
0x02 hashcat 下载地址: 虽然kali自带了hashcat工具,但是它的功能有限。为了充分发挥其威力,最好还是将其下载到本地,并利用显卡或CPU进行运算。hashcat被誉为世界上最快的hash破解工具,但要获取文件的hash,还需要使用john的脚本。也许是我太菜了,没找到hashcat的脚本。这里我使用john的脚本pdf2john来提取PDF文件密码的hash。john的脚本目录位于/usr/share/john/,将PDF文件上传后,执行脚本即可。也可以使用在线网站进行提取。
hashcat.exe -m 10700 -a 3 $pdf$4*4*128*-4*1*16*f8e0565b3c4d9795db089448fcf5426e*32*6cff45e6bdfcecaf9039ba17cdb06ae700000000000000000000000000000000*32*f78487d59915fc93bd17f9c687bf84d1360e98df8e382132d494ed78dc3518b1 -1 ?l?u?d ?1?1?1?1?1?1
0 Straight(字典破解)
1 Combination(组合破解)
3 Brute-force(掩码暴力破解)
6 Hybrid dict + mask(混合字典+掩码)
7 Hybrid mask + dict(混合掩码+字典)
对比一下hashcat的选项,我有些不知道该选择哪个好。这是在2019年末的时候,应该是使用了较高级的加密算法。所以我赌一把,选择了10700。简单解释一下,-m指定hash类型,-a选择爆破方式。
-1字符集,这里是?l?u?d,表示数字+字母大小写,总共有6个字符,代表密码长度为6位。执行后发现不行。于是尝试使用多个hash类型来匹配这个hash。最后使用了10500,成功了。看了一下CPU的使用情况,并没有跑满,可能还需要设置一些参数。
跑了一分钟,我已经受不了了,这台电脑的风扇声音太大了。对于密码破解这种任务,还是放到服务器上慢慢跑比较实在。于是我将任务转移到服务器上慢慢进行。如果我没记错的话,应该能够破解出来。后来我又进行了一次HASH的测试:找了一个Word文件,另存为时设置了一个6位纯数字密码,来感受一下速度。只用了3秒,真的很快。这也说明了设置8位以上的密码,包含数字、字母和特殊字符的必要性。
-pwfile:<file>[,..]
用于指定存放密文所在的文件名,(可以输入多个,文件名“,”分隔,也可以使用*或者这两个通配符引用一批文件)。也可以不使用此参数,将文件名放在命令行的最后即可。
-wordfile:-stdin
指定的用于解密用的字典文件名。你也可以使用STDIO来输入,就是在键盘中输入。
-rules
在解密过程中使用单词规则变化功能。如将尝试cool单词的其他可能,如COOLER、Cool等,详细规则可以在JOHN.INI文件中的[List.Rules:Wordlist]部分查到,我们在下面详细解释。
-incremental[:]
使用遍历模式,就是组合密码的所有可能情况,同样可以在JOHN.INI文件中的[Incremental]部分查到,我们在下面详细解释。
-single
使用单一模式进行解密,主要是根据用户名产生变化来猜测解密,可以消灭笨蛋用户。其组合规则可以在JOHN.INI文件中的[List.Rules:Single]部分查到。
-external:
使用自定义的扩展解密模式,你可以在john.ini中定义自己需要的密码组合方式。JOHN也在INI文件中给出了几个示例,在INI文件的[List.External]中所定义的自订破解功能。
-restore[:]
继续上次的破解工作,JOHN被中断后,当前的解密进度情况被存放在RESTORE文件中,你可以拷贝这个文件到一个新的文件中。如果参数后不带文件名,JOHN默认使用RESTORE文件。
-makechars:
制作一个字符表,你所指定的文件如果存在,则将会被覆盖。JOHN尝试使用内在规则在相应密匙空间中生成一个最有可能击中的密码组合,它会参考在JOHN.POT文件中已经存在的密匙。
-show
显示已经破解出的密码,因为JOHN.POT文件中并不包含用户名,同时你应该输入相应的包含密码的文件名,JOHN会输出已经被解密的用户连同密码的详细表格。
本文由“壹伴编辑器”提供技术支持。
0x03 John 接下来,我要体验一下john,这个工具在渗透测试中用过几次,用来破解密码非常不错。通常情况下,使用这个工具时需要准备一个密码字典来进行密码破解,其次可以通过配置文件对密码字典中的密码进行变换,例如在末尾增加@符号,将开头字母大写等。
首先,让我们来看一下配置文件(etc/john/john.conf)。其中配置了一些默认设置和规则,例如默认的密码字典和解密模式。在这里,我们可以设置自己想要的特殊符号,例如0 = [a-zA-Z-0-9],表示数字和字母的组合。还可以指定自己想要的密码处理模式。
[List.Rules:myrules1]
cAz"[0-9]" //代表首字母大写,另外末尾增加一个数字后缀。可以将password变为Possword1。
cAz"[0-9][!@#]" //也可以加特殊符号
: 不操作:对输入词不做任何操作
l 转换为小写
u 转换为大写
c 首字母大写
C 第一个字母小写,其余字母大写
t 单词中所有字符的切换大小写
TN 在N位置切换字符的大小写
WN 切换字符在N位置的移位
r 颠倒:"Fred"->"derF"
d 重复:"Fred" -> "FredFred"
f 联想:"Fred"->"FredderF"
{ 向左旋转单词“jsmith"->"smithj"
} 向右旋转单词:"smithj"->"jsmith"
$X 将字符X附加到单词
^X 在单词前面加上X字符
sXY 将单词中的所有字符X替换为Y
s?CY 将单词中包含C类的所有字符替换为Y
@X 从单词中清除所有字符X
@?C 从单词中清除包含C类的所有字符
!X 如果单词包含字符X,则拒绝该单词
!?C 如果单词包含C类字符,则拒绝该单词
还有很多就不一一列举了,机翻的不一定准确,还需要在实际运用中自己把握,毕竟是老外的东西,角度是从字母出发的。跟我们的拼音密码还是有差距的。
[Incremental:ASCII]
File = $JOHN/digits.chr
MinLen = 1
MaxLen = 20
CharCount = 10
只需要在配置文件中添加以下内容:我们找到爆破模块,然后自定义一个6位数的纯数字模块。默认情况下,该模块是[Incremental:ASCII],枚举13位ASCII字符的所有组合。这里有一个[Incremental:ASCII]模块机,根据说明,它应该是数字,表示要爆破20位数字,我们将其修改为6位数字。将MinLen和MaxLen都改为6,然后调用该模块进行破解。
* INSTALL - installation instructions
* OPTIONS - command line options and additional utilities
* MODES - cracking modes: what they are
* CONFIG (*) - how to customize
* RULES (*) - wordlist rules syntax
* EXTERNAL (*) - defining an external mode
* EXAMPLES - usage examples - strongly recommended