Skip to content

Hashcat + John 密码破解

这里的破解不是解开网络账号密码,主要是通过字典和暴力碰撞尝试出密码。

简介

受密码保护的zip和rar等压缩包,Windows身份验证哈希,linux上/etc/shadow哈希,MySQL账户哈希,已知采样算法和盐的网站账户和Hmac采样的网站账户。

John

开膛手约翰是世界上最著名的、广受欢迎的多功能hash破解工具之一。这里主要用来提取特征。

有绝大多数系统中用到的哈希(散列)算法,如 MD4、 MD5、 SHA1和 NTLM等。

Hashcat

目前大多哈希算法从数学角度上是不可逆的,但不意味着破解哈希不可能。Hashcat是通过尝试去破解密码的。

采用Hashcat主要是因为它能够调用OpenCL的接口,CUDA接口等方式使用GPU进行哈希运算。相比使用CPU速度大多数算法上有越1000倍的提升。

参数与配置

John

使用John工具包中的rar2john和zip2john获取压缩包的特征。

shell
rar2john.exe [file]

会打印 测试压缩包.rar:$rar5$16$0a3640这样开头 $/rar5$结尾的字符串,需要手动删除里面文件名和跟随的冒号。即可导入Hashcat里面高速尝试。

Hashcat

常用命令行选项

-m --hash-type <哈希类型>:

指定哈希类型。例如 -m 0 表示 MD5 哈希,-m 100 表示 SHA1 哈希,完整哈希类型列表可以使用 -h 命令查看。

类型还包括word的加密,pdf加密,压缩文件密码等,有超级多种加密类型选择。

-a --attack-mode <攻击模式>:

首选,有两种主要的攻击方式,

  1. 字典攻击(Dictionary Attack):尝试所有字典中的单词,这是一种比较简单的攻击模式。但是通常通过社会工程学,能够统计出较多人使用的密码顺序。在某些情况下,能够大大加速碰撞效率
  2. 字符攻击(Character Attack):通过程序按照给定规则生成密码,尝试所有可能的字符组合。效率不那么高,但是简单有效。

例如 -a 0 表示字典攻击,-a 3 表示组合攻击,完整攻击模式列表可以使用 -h 命令查看。

模式类型
0Straight,用从给定的字典中逐个尝试破解密码
1Combination,组合破解模式,使用多个字典之中的单词进行组合。
3Brute-force,默认破解模式,暴力破解模式,尝试所有可能的字符组合。
6Hybrid wordlist + mask,字典+掩码破解模式,将字典和掩码结合在一起使用。
7Hybrid mask + wordlist,掩码+字典破解模式,将掩码和字典结合在一起使用。
9Association,目前我也不了解这个格式
-w --workload-profile <线程数>:

指定线程数,例如 -w 8 表示使用 8 个线程进行破解,默认为 CPU 或 GPU 核心数。

-r --rules-file <规则文件>:

指定规则文件,例如 -r rule.txt 表示使用 rule.txt 中的规则进行破解,规则文件可以增强破解能力。

字符集

内置字符集有很多种

字符集
?l = abcdefghijklmnopqrstuvwxyz小写字母 a-z
?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ大写字母A-Z
?d = 0123456789数字 0-9
?h = 0123456789abcdef数字+小写字母
?H = 0123456789ABCDEF数字加大写字母
?s = «space»!"#$%& 等符号特殊字符
?a = ?l?u?d?s可见字符
?b = 0x00 - 0xff应该是用在非文件的文件,采用16进制匹配
-1 --custom-charset1 <字符集>:

指定第一字符集,例如 -1 ?l 表示使用小写字母作为第一字符集。 -2 0123456789.-@ 表示在0123456789.-@内匹配 (数字1-4均可用于指定字符集)

-o <输出文件>:

指定输出文件,例如 -o result.txt 表示将破解结果保存到 result.txt 文件中。

-p <分隔符>:

指定分隔符,例如 -p : 表示使用冒号作为分隔符,用于指定输入文件中的用户名和密码之间的分隔符。

--force

忽略破解过程中的警告信息,跑单条hash可能需要加上此选项

--show

显示已经破解的hash及该hash所对应的明文

-i --increment

启用增量破解模式,你可以利用此模式让hashcat在指定的密码长度范围内执行破解过程

--increment-min

密码最小长度,后面直接等于一个整数即可,配置increment模式一起使用

--increment-max

密码最大长度,同上

-s, --skip

从一开始就跳过X个单词 如 -s 1000000 跳过前面1000000个尝试

-l, --limit

限制最高尝试的单词位置,包括跳过的单词 如 -s 1000000 -l 2000000 会从1000000开始,计算到2000000

--outfile-format

指定破解结果的输出格式id,默认是3

-V --version:

输出软件版本

-h --help:

输出帮助文件

在运行过程中

shell
按s键 可以查看破解的状态,
按p键 暂停
按r键 继续运算
按q键 退出运算

解码案例

字典破解

在命令行输入以下格式命令开启字典破解

首先,1q2w3e4r 的MD5值为 5416d7cd6ef195a0f7622a9c56b55e84

bash
hashcat -a 0 -m 0 "5416d7cd6ef195a0f7622a9c56b55e84" hashpass.txt -o success.txt

​ -a 0 -m 0 选择逆向md5码,使用字典解密

​ 使用hashpass.txt作为字典,依次尝试解密

​ -o 成功后保存到success.txt

如果命令行输出

shell
INFO: All hashes found in potfile! Use --show to display them.

表示之前已经成功解出,在命令后加上--show显示内容

使用--remove从记录中删除,一般记录在~/.hashcat/hashcat.potfile文件中

批量破解

shell
hashcat -a 0 -m 0 hash.txt hashpass.txt -o success.txt

使用文件代替文本(5416d7cd6ef195a0f7622a9c56b55e84),可以批量破解。

解码结束后会依次写入文件

掩码+字典碰撞

bash
hashcat -a 7 -m 0 "7fef6171469e80d32c0559f88b377245" "admi?l?d?d?d" hashpass.txt  -O

掩码的使用可以一起使用,掩码代表的类型见附件。如果需要组合可以使用 -1 -2 -3 -4 自定义

8位大小写字母MD5碰撞

PassWord 的md5为a9d402bfcde5792a8b531b3a82669585

shell
hashcat -a 3 -m 0 -1 "?l?u"  "a9d402bfcde5792a8b531b3a82669585" "?1?1?1?1?1?1?1?1" -O

这里用了自定义规则-1,此时 ?1 就表示 ?l?u,即大小写字母。

admin开头10位大小写字母数字碰撞

admin23323 的 MD5 值为 a9991129897a44e0d1c2855c3d7dccc4

bash
hashcat -a 3 -m 0 -1 "?l?u?d" "a9991129897a44e0d1c2855c3d7dccc4" "admin?1?1?1?1?1" -O

1-7 位 MD5 加密的大小写字母 + 数字碰撞

bash
hashcat -a 3 -m 0 -1 '?l?u?d' --force  '2792e40d60bac94b4b163b93566e65a9' --increment --increment-min 1 --increment-max 7 '?1?1?1?1?1?1?1' -O

附录

hashcat掩码规则

shell
 ? | Charset
===+=========
 l | abcdefghijklmnopqrstuvwxyz          # 小写字母 a-z
 u | ABCDEFGHIJKLMNOPQRSTUVWXYZ          # 大写字母 A-Z
 d | 0123456789                          # 数字 0-9
 h | 0123456789abcdef                    # 数字 + abcdef
 H | 0123456789ABCDEF                    # 数字 + ABCDEF
 s |  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~   # 特殊字符    
 a | ?l?u?d?s                            # 键盘上所有可见的字符
 b | 0x00 - 0xff                         # 可能是用来匹配像空格这种密码的

内置字符集

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

完整hashcat参数

shell
- [options] - (选项)
选项                          说明例子
-m, --hash-type Num Hash-type哈希类型,请参见下面的参考  -m 1000
-a, --attack-mode   Num Attack-mode攻击模式,请参阅下面的参考    -a 3
-V, --version       打印版本    
-h, --help      打印帮助    
--quiet
抑制输出    
--hex-salt
假设盐是以十六进制给出的    
--hex-wordlist      假设wordlist中的单词是以十六进制给出的 
--force     忽略警告    
--status        启用状态屏幕的自动更新 
--status-timer  Num 将状态屏幕更新设置为X --status-timer=1
--machine-readable      以机器可读格式显示状态视图   
--keep-guessing     在破解之后继续猜测哈希 
--loopback      添加新的平原来导入目录 
--weak-hash-threshold   Num 阈值X何时停止检查w  --weak=0
--markov-hcstat File    指定hcstat文件以使用   --markov-hc=my.hcstat
--markov-disable        禁用马尔科夫链,模拟经典的蛮力 
--markov-classic        启用经典马尔科夫链,没有每个位置    
-t, --markov-threshold  Num 阈值X何时停止接受新的马尔可夫链    -t 50
--runtime   Num 运行时间为X秒后中止会话    --runtime=10
--session   Str 定义特定的会话名称   --session=mysession
--restore       从--session恢复会话  
--restore-disable       不要写恢复文件 
--restore-file-path File    恢复文件的具体路径   --restore-file-path=my.restore
-o, --outfile   File    为恢复的散列定义outfile -o outfile.txt
--outfile-format    Num 为恢复的散列定义outfile格式的X --outfile-format=7
--outfile-autohex-disable       禁止在输出平面中使用$ HEX []  
--outfile-check-timer   Num 将outfile检查之间的秒设置为X  --outfile-check=30
-p, --separator Char    hashlists和outfile的分隔符char   -p :
--stdout        不要破解散列,而是只打印候选  
--show      将hashlist与potfile比较; 显示破解的哈希    
--left      将hashlist与potfile比较; 显示未破裂的哈希   
--username      启用忽略散列文件中的用户名   
--remove        一旦它们被破解,就可以清除哈希值    
--remove-timer  Num 更新输入哈希文件每X秒 --remove-timer=30
--potfile-disable       不要写potfile  
--potfile-path  Dir potfile的具体路径    --potfile-path=my.pot
--encoding-from Code(代码)    强制X |从内部词汇表编码   --encoding-from=iso-8859-15
--encoding-to   Code    强制内部词汇表编码到X --encoding-to=utf-32le
--debug-mode    Num 定义调试模式(仅通过使用规则混合)   --debug-mode=4
--debug-file    File    输出文件用于调试规则  --debug-file=good.log
--induction-dir Dir 指定用于回送|的归纳目录    --induction=inducts
--outfile-check-dir Dir 指定outfile目录来监视平原    --outfile-check-dir=x
--logfile-disable       禁用日志文件  
--hccapx-message-pair   Num 仅加载匹配X |的hccapx中的消息对    --hccapx-message-pair=2
--nonce-error-corrections   Num BF的大小范围来取代AP的随机数最后一个字节  --nonce-error-corrections=16
--truecrypt-keyfiles    File    要使用的密钥文件,用逗号分隔  --truecrypt-key=x.png
--veracrypt-keyfiles    File    要使用的密钥文件,用逗号分隔  --veracrypt-key=x.txt
--veracrypt-pim Num VeraCrypt个人迭代multiplier --veracrypt-pim=1000
-b, --benchmark     运行基准    
--speed-only        返回预期的攻击速度,然后退出  
--progress-only     返回理想的进度步骤和时间来处理 
-c, --segment-size      以MB为单位设置大小以从wordfile缓存到X    -c 32
--bitmap-min    Num 将位图允许的最小位设置为X   --bitmap-min=24
--bitmap-max    Num 将位图允许的最大位设置为X   --bitmap-max=24
--cpu-affinity  Str 锁定到CPU设备,用逗号分隔  --cpu-affinity=1,2,3
-I, --opencl-info       显示有关检测到的OpenCL平台/设备的信息  -I
--opencl-platforms  Str 使用OpenCL平台,用逗号分隔    --opencl-platforms=2
-d, --opencl-devices    Str 使用OpenCL设备,用逗号分隔    -d 1
-D, --opencl-device-types   Str 使用OpenCL设备类型,用逗号分隔  -D 1
--opencl-vector-width   Num 手动覆盖OpenCL矢量宽度到X    --opencl-vector=4
-w, --workload-profile  Num 启用特定的工作负载配置文件,请参阅下面的池   -w 3
-n, --kernel-accel  Num 手动调整工作负载,将外环步长设置为X  -n 64
-u, --kernel-loops  Num 手动调整工作负载,将内环步长设置为X  -u 256
--nvidia-spin-damp  Num 解决方法NVIDIA?(英伟达?)CPU烧录循环错误,以百分比表示   --nvidia-spin-damp=50
--gpu-temp-disable      禁用温度和fanspeed读取和触发器 
--gpu-temp-abort    Num 如果GPU温度达到X摄氏度,则中止   --gpu-temp-abort=100
--gpu-temp-retain   Num 尝试将GPU温度保持在X摄氏度 --gpu-temp-retain=95
--powertune-enable      启用功率调整。 完成|时恢复设置    
--scrypt-tmto   Num 手动覆盖scrypt的TMTO值为X  --scrypt-tmto=3
-s, --skip  Num 从一开始就跳过X个单词 -s 1000000
-l, --limit Num 限制X字从开始+跳过的单词   -l 1000000
--keyspace      显示密钥空间基础:mod值并退出    
-j, --rule-left Rule(规则)    单词规则应用于左词表| |中的每个单词 -j 'c'
-k, --rule-right    Rule    单词规则应用于右词表| |中的每个单词 -k '^-'
-r, --rules-file    File    多个规则应用于来自词表|的每个词    -r rules/best64.rule
-g, --generate-rules    Num 生成X随机规则 -g 10000
--generate-rules-func-min   Num 强制每个规则的最小X函数    
--generate-rules-func-max   Num 强制每个规则的最大X个函数   
--generate-rules-seed   Num 强制将RNG种子设置为X    
-1, --custom-charset1   CS  用户定义的字符集?1  -1 ?l?d?u
-2, --custom-charset2   CS  用户定义的字符集?2  -2 ?l?d?s
-3, --custom-charset3   CS  用户定义的字符集?3  
-4, --custom-charset4   CS  用户定义的字符集?4  
-i, --increment     启用屏蔽增量模式    
--increment-min Num 在X |开始掩码递增  --increment-min=4
--increment-max Num 在X |处停止屏蔽递增 --increment-max=8