哈希密码爆破工具hashcat

前言

hashcat是世界上最快,最先进的密码恢复实用程序,为300多种高度优化的哈希算法提供了五种独特的攻击模式。hashcat支持Linux,Windows和macOS平台,且支持使用CPU,GPU和其他硬件加速器计算,并具有分布式密码破解的功能。

参数

经典字典破解用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
hashcat testHashfile --hash-type 0 --attack-mode 0 passDic.txt
-m,--hash-type选择哈希类型,
1000为windows nt hash,1800是sha512 Linux加密,不指定-m默认为0即md5。
-a,--attack-mode选择模式
0 = Straight (字典破解)
1 = Combination (组合破解)
2 = Toggle-Case (大小写转换)
3 = Brute-force(掩码暴力破解)
4 = Permutation(序列破解)
5 = Table-Lookup(查表破解)
6 = Hybrid dict + mask 字典加掩码破解
7 = Hybrid mask + dict 掩码+字典破解
8 = Prince(王子破解)
-b, --benchmark 测试计算机破解速度和显示硬件相关信息
-h,--help 帮助,可查看hashcat各参数的用法和可供破解的哈希类型编号
--quiet 静默模式, 抑制输出
-n, --threads=NUM 线程数
-o, --outfile=FILE 定义哈希文件恢复输出文件
--outfile-format=NUM 定义哈希文件输出格式,见下面的参考资料
--outfile-autohex-disable 禁止使用十六进制输出明文
--hex-salt salt值是用十六进制给出的
--hex-charset 设定字符集是十六进制给出
--runtime=NUM 运行数秒(NUM值)后的中止会话
--status 启用状态屏幕的自动更新
--status-timer=NUM 状态屏幕更新秒值
--status-automat 以机器可读的格式显示状态视图
--session 后跟会话名称,主要用于中止任务后的恢复破解。


内置的字符集:
?l = abcdefghijklmnopqrstuvwxyz 代表小写字母
?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ 代表大写字母
?d = 0123456789 代表数字
?s = !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 代表特殊字符
?a = ?l?u?d?s 大小写数字及特殊字符的组合
?b = 0x00 - 0xff

使用实例

本文使用最常用的两种加密:linux系统密码(sha512)和windows系统密码(NT
HASH)做实例,并使用最常用的两种攻击方式进行演示。

字典破解linux系统密码

查看linux hash的方式是打开/etc/shadow直接查看,/etc/shadow文件中每一行代表一个用户以及其密码hash以及密码配置信息,以如下格式分布。

1
2
3
root:$6$t3lLj7DjLuEnQHCy$w.xIeZPxn61ew.17w09qMXkg.E4aXOM7IMjHJ7PRRiH7XSMaCdHI1Hc0pLyMqRZcafSZtz.UEOb3nmYxyFxKm.:18443:0:99999:7:::

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

其他字段都较好理解,其中加密密码和最后一次修改时间需要解释一下:

加密密码中如果第一个字符为!或者*的话,说明这是一个不能登录的账户,其他情况格式为$id$salt$encrypted

根据id可以判断加密方式,第二个$到第三个$之间的字段为salt,第三个$之后的字段为密码hash。

常见的情况

1
2
3
id1时,采用md5算法加密
id5时,采用SHA256算法加密
id6时,采用SHA512算法加密

最后一次修改时间是从1970-01-01开始计算的,每天加1,所以会显示为这样一个数字,我们可使用如下命令计算修改时间

1
2
root@kali:~# date -d "1970-01-01 18443 days"
20200630日 星期二 00:00:00 CST

了解了linux系统密码保存的情况,就可以提取出来使用hashcat破解,我们需要提取第二个冒号到第三个冒号之间的字段保存到一个文件root.txt中

1
$6$t3lLj7DjLuEnQHCy$w.xIeZPxn61ew.17w09qMXkg.E4aXOM7IMjHJ7PRRiH7XSMaCdHI1Hc0pLyMqRZcafSZtz.UEOb3nmYxyFxKm.

然后使用准备好的字典top100.txt破解,将破解结果保存在result.txt中

1
hashcat -m 1800 -a 0 -o result.txt root.txt top100.txt --force

掩码破解windows用户密码

查看windows hash的工具非常多,为了省事我直接使用前面文章介绍过的工具LaZagne 就不重复介绍新工具了 http://uuzdaisuki.com/2019/12/07/%E4%B8%A4%E6%AC%BE%E5%AF%86%E7%A0%81%E6%8F%90%E5%8F%96%E5%B7%A5%E5%85%B7%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E4%BD%BF%E7%94%A8/

提取到windows hash如下

1
2
3
test:1005:aad3b435b51404eeaad3b435b51404ee:f9e37e83b83c47a93c2f09f66408631b:::

用户名称:RID:LM-HASH:NT-HASH

我们需要提取后方的NT-HASH用来破解,即f9e37e83b83c47a93c2f09f66408631b存入test.txt,由于我设置的是三位字母三位数字的密码,使用如下掩码进行爆破

1
hashcat -m 1000 -a 3 -o result4.txt test.txt ?l?l?l?d?d?d --force

可以很快得到结果

参考资料