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获取压缩包的特征。
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 <攻击模式>:
首选,有两种主要的攻击方式,
- 字典攻击(Dictionary Attack):尝试所有字典中的单词,这是一种比较简单的攻击模式。但是通常通过社会工程学,能够统计出较多人使用的密码顺序。在某些情况下,能够大大加速碰撞效率
- 字符攻击(Character Attack):通过程序按照给定规则生成密码,尝试所有可能的字符组合。效率不那么高,但是简单有效。
例如 -a 0 表示字典攻击,-a 3 表示组合攻击,完整攻击模式列表可以使用 -h 命令查看。
模式 | 类型 |
---|---|
0 | Straight,用从给定的字典中逐个尝试破解密码 |
1 | Combination,组合破解模式,使用多个字典之中的单词进行组合。 |
3 | Brute-force,默认破解模式,暴力破解模式,尝试所有可能的字符组合。 |
6 | Hybrid wordlist + mask,字典+掩码破解模式,将字典和掩码结合在一起使用。 |
7 | Hybrid mask + wordlist,掩码+字典破解模式,将掩码和字典结合在一起使用。 |
9 | Association,目前我也不了解这个格式 |
-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:
输出帮助文件
在运行过程中
按s键 可以查看破解的状态,
按p键 暂停
按r键 继续运算
按q键 退出运算
解码案例
字典破解
在命令行输入以下格式命令开启字典破解
首先,1q2w3e4r 的MD5值为 5416d7cd6ef195a0f7622a9c56b55e84
hashcat -a 0 -m 0 "5416d7cd6ef195a0f7622a9c56b55e84" hashpass.txt -o success.txt
-a 0 -m 0 选择逆向md5码,使用字典解密
使用hashpass.txt作为字典,依次尝试解密
-o 成功后保存到success.txt
如果命令行输出
INFO: All hashes found in potfile! Use --show to display them.
表示之前已经成功解出,在命令后加上--show显示内容
使用--remove从记录中删除,一般记录在~/.hashcat/hashcat.potfile文件中
批量破解
hashcat -a 0 -m 0 hash.txt hashpass.txt -o success.txt
使用文件代替文本(5416d7cd6ef195a0f7622a9c56b55e84),可以批量破解。
解码结束后会依次写入文件
掩码+字典碰撞
hashcat -a 7 -m 0 "7fef6171469e80d32c0559f88b377245" "admi?l?d?d?d" hashpass.txt -O
掩码的使用可以一起使用,掩码代表的类型见附件。如果需要组合可以使用 -1 -2 -3 -4 自定义
8位大小写字母MD5碰撞
PassWord 的md5为a9d402bfcde5792a8b531b3a82669585
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
hashcat -a 3 -m 0 -1 "?l?u?d" "a9991129897a44e0d1c2855c3d7dccc4" "admin?1?1?1?1?1" -O
1-7 位 MD5 加密的大小写字母 + 数字碰撞
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掩码规则
? | 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 # 可能是用来匹配像空格这种密码的
内置字符集
?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参数
- [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