常见哈希格式类型及其在CTF与渗透测试中的爆破与伪造策略(PBKDF2、bcrypt...)
一、引言
在CTF比赛或渗透测试中,获取并利用目标系统的密码哈希是常见的场景。例如,通过Web应用漏洞提取数据库中的用户密码哈希,或通过提权漏洞获取/etc/shadow
文件中的系统用户哈希。这些哈希通常采用不同加密算法,如MD5、SHA-256、bcrypt、PBKDF2、scrypt、yescrypt或Argon2。每种算法在安全性、计算复杂度和抗破解能力上有着显著差异,直接影响到爆破难度和伪造可行性。理解哈希算法特性、识别哈希类型并选择合适的攻击策略,是提升进攻效率的关键。
本文将系统介绍主流密钥派生函数(KDF)和类Unix系统中常见的哈希格式,深入探讨其加密原理、破解方法和伪造技巧。
二、密钥派生函数(KDF):主流算法分析
1. PBKDF2(Password-Based Key Derivation Function 2)
1.1 原理
PBKDF2是一种基于密码的密钥派生函数(RFC 8018),广泛用于密码存储和密钥生成。其通过重复哈希运算(迭代)和随机盐(salt)增加暴力破解成本,抵御彩虹表和简单暴力攻击。工作流程如下:
- 输入:密码、盐、迭代次数、输出长度、伪随机函数(如HMAC-SHA256)。
- 过程:密码与盐结合,通过伪随机函数迭代生成固定长度哈希。
- 输出:可变长度哈希,常见于数据库密码存储。
1.2 破解策略
PBKDF2的CPU密集型设计使其易被GPU加速,爆破速度较快,尤其在低迭代次数(如<100,000)时。
- 识别:格式通常为
pbkdf2:iterations:salt:hash
,如pbkdf2:100000:deadbeef:abcd1234...
。 - 工具:
- Hashcat:模式
-m 10000
(PBKDF2-HMAC-SHA256)。示例:
使用高质量字典(如hashcat -m 10000 -a 0 hash.txt wordlist.txt --force
rockyou.txt
)或规则(如best64.rule
)加速。 - John the Ripper:支持格式
pbkdf2-hmac-sha256
:john --format=pbkdf2-hmac-sha256 hash.txt --wordlist=wordlist.txt
- Hashcat:模式
- 优化:
- 检查迭代次数:低于100,000次时,爆破可行。
- 针对弱密码:尝试常见密码(如
admin123
、password1
)。 - GPU加速:高性能GPU(如RTX 4090)可显著提升效率。
1.3 伪造可能性
- 可行性:无法直接伪造认证,需原始密码与盐重新计算哈希。
- 方法:若控制数据库,可生成新哈希替换。Python示例:
from hashlib import pbkdf2_hmac import os password = "new_password" salt = os.urandom(16) iterations = 100000 hash_value = pbkdf2_hmac('sha256', password.encode(), salt, iterations) # 存入数据库:pbkdf2:100000:<salt>:<hash_value>
- 注意:需确保迭代次数和盐与目标系统一致。
2. bcrypt
2.1 原理
bcrypt基于EksBlowfish算法,专为密码哈希设计,通过随机盐和可调成本因子(cost factor)增加破解成本。哈希格式为$2a$cost$salt$hash
或$2y$cost$salt$hash
:
$2a$/$2y$
:版本标识($2y$
更现代)。cost
:成本因子(如12,表示2^12次迭代)。salt
:16字节随机盐。hash
:24字节哈希值。
bcrypt的指数级计算成本使其抗GPU并行化,破解难度较高。
2.2 破解策略
- 识别:以
$2a$
或$2y$
开头,固定长度约60字符,如$2y$12$6b3...
。 - 工具:
- Hashcat:模式
-m 3200
。示例:
注:bcrypt爆破极慢,需高性能硬件。hashcat -m 3200 -a 0 hash.txt wordlist.txt --force
- John the Ripper:格式
bcrypt
:john --format=bcrypt hash.txt --wordlist=wordlist.txt
- Hashcat:模式
- 优化:
- 检查成本因子:低于10时爆破稍可行。
- 优先字典攻击:使用
rockyou.txt
或定制弱密码列表。 - 避免穷举:计算成本高,穷举几乎不可行。
2.3 伪造可能性
- 可行性:若控制数据库,可生成新哈希替换,验证通过。
- 方法:使用Python的
bcrypt
库:
验证:import bcrypt password = "new_password" hashed = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt(rounds=12)) # 替换数据库中的哈希
bcrypt.checkpw(password.encode('utf-8'), hashed)
返回True
。 - 场景:适用于Web应用(如WordPress、Laravel)。
3. scrypt
3.1 原理
scrypt是一种内存密集型KDF(RFC 7914),专为抵御ASIC和GPU加速攻击设计。它通过高内存需求(可调参数N、r、p)增加破解成本,广泛用于加密货币和现代密码存储。
- 输入:密码、盐、内存参数(N、r、p)、输出长度。
- 过程:结合密码和盐,通过内存密集运算生成哈希。
- 输出:固定长度哈希。
3.2 破解策略
- 识别:格式如
scrypt$ln=<N>$r=<r>$p=<p>$<salt>$<hash>
,或直接二进制/十六进制。 - 工具:
- Hashcat:模式
-m 8900
。示例:hashcat -m 8900 -a 0 hash.txt wordlist.txt --force
- John the Ripper:支持
scrypt
格式:john --format=scrypt hash.txt --wordlist=wordlist.txt
- Hashcat:模式
- 优化:
- 检查参数:较低的N(如<14)可降低内存需求。
- 优先字典攻击:内存需求限制并行化,穷举难度极高。
- 硬件限制:普通GPU可能因内存不足而受限。
3.3 伪造可能性
- 可行性:需替换哈希,验证通过原始密码计算。
- 方法:使用Python的
scrypt
库:import scrypt password = "new_password" salt = os.urandom(16) hashed = scrypt.hash(password.encode(), salt, N=1<<14, r=8, p=1) # 存入数据库
- 注意:参数N、r、p需与目标系统一致。
4. yescrypt
4.1 原理
yescrypt是scrypt的增强版,广泛用于现代Linux系统(如Debian 10+)的/etc/shadow
。它结合内存密集和CPU密集特性,支持更高安全性参数(如ROM依赖),抗ASIC攻击。
- 格式:以
$y$
开头,如$y$j9T$<salt>$<hash>
。 - 参数:包括N(内存)、r(块大小)、p(并行度)等。
4.2 破解策略
- 识别:以
$y$
开头,常见于/etc/shadow
。 - 工具:
- John the Ripper:支持
yescrypt
格式:john --format=yescrypt hash.txt --wordlist=wordlist.txt
- Hashcat:支持有限,需最新版本(实验性模式)。
- John the Ripper:支持
- 优化:
- 检查参数:低N值(如<16)可降低破解难度。
- 优先字典攻击:内存和计算成本高,穷举不可行。
- 硬件需求:高内存和CPU资源是关键。
4.3 伪造可能性
- 可行性:可生成新哈希替换。
- 方法:使用
mkpasswd
生成:
或Python库mkpasswd -m yescrypt -S <salt> <password>
libscrypt
(需扩展支持yescrypt)。
5. Argon2
5.1 原理
Argon2是2015年密码哈希竞赛的获胜算法,分为Argon2d、Argon2i和Argon2id,广泛用于现代应用。它平衡内存和计算需求,抗侧信道攻击。
- 参数:内存大小、迭代次数、并行度、盐、输出长度。
- 格式:如
$argon2id$v=19$m=65536,t=3,p=4$<salt>$<hash>
。
5.2 破解策略
- 识别:以
$argon2i$
,$argon2d$
或$argon2id$
开头。 - 工具:
- Hashcat:模式
-m 18000
(Argon2id)。示例:hashcat -m 18000 -a 0 hash.txt wordlist.txt --force
- John the Ripper:支持
argon2
格式。
- Hashcat:模式
- 优化:
- 检查内存参数:低内存(如<64MB)可加快爆破。
- 优先字典攻击:高内存需求限制并行化。
- 硬件:高内存GPU或CPU集群。
5.3 伪造可能性
- 可行性:可替换哈希。
- 方法:使用Python的
argon2-cffi
:from argon2 import PasswordHasher ph = PasswordHasher(memory_cost=65536, time_cost=3, parallelism=4) password = "new_password" hashed = ph.hash(password) # 替换数据库中的哈希
- 场景:适用于现代Web应用。
6. KDF对比(进攻视角)
特性 | PBKDF2 | bcrypt | scrypt | yescrypt | Argon2 |
---|---|---|---|---|---|
爆破难度 | 中等(GPU加速快) | 高(抗并行化) | 高(内存密集) | 极高(内存+CPU) | 极高(内存+CPU) |
伪造可能性 | 需替换哈希,复杂 | 可直接替换,简单 | 需替换,稍复杂 | 需替换,复杂 | 需替换,复杂 |
识别方式 | pbkdf2:iter... | $2a$/$2y$ 开头 | scrypt$ln=... | $y$ 开头 | $argon2id$ 开头 |
工具支持 | Hashcat、John | Hashcat、John | Hashcat、John | John(有限) | Hashcat、John |
进攻重点 | 低迭代,GPU爆破 | 优先伪造,优化字典 | 低N,字典攻击 | 低N,字典攻击 | 低内存,字典攻击 |
三、类Unix系统中常见哈希类型
/etc/shadow
中的哈希格式为$id$salt$hash
。以下为常见类型及进攻策略:
1. $1$
— MD5-Crypt
- 特点:基于MD5,弱加密,速度快。
- 识别:以
$1$
开头,如$1$abc123$def456...
。 - 破解:
- 工具:Hashcat(
-m 500
)、John(md5crypt
)。 - 命令:
hashcat -m 500 hash.txt wordlist.txt --force
- 效率:秒级破解,适合弱密码。
- 工具:Hashcat(
- 伪造:生成新哈希替换:
mkpasswd -m md5crypt -S <salt> <password>
2. $5$
— SHA-256-Crypt
- 特点:SHA-256,5000次迭代,中等难度。
- 识别:以
$5$
开头。 - 破解:
- 工具:Hashcat(
-m 7400
)、John(sha256crypt
)。 - 命令:
hashcat -m 7400 hash.txt wordlist.txt --rules=best64.rule
- 工具:Hashcat(
- 伪造:优先爆破,伪造成本高。
3. $6$
— SHA-512-Crypt
- 特点:SHA-512,5000次迭代,较慢。
- 识别:以
$6$
开头。 - 破解:
- 工具:Hashcat(
-m 1800
)、John(sha512crypt
)。 - 命令:
hashcat -m 1800 hash.txt wordlist.txt --force
- 工具:Hashcat(
- 伪造:专注爆破。
4. $y$
— yescrypt
- 特点:内存和CPU密集,现代Linux默认。
- 破解:见yescrypt破解策略。
- 伪造:生成新哈希替换。
5. $apr1$
— Apache MD5
-
特点: globular
-
识别:以
$apr1$
开头,常见于.htpasswd
。 -
破解:
- 工具:Hashcat(
-m 1600
)、John(apr1
)。 - 命令:
hashcat -m 1600 hash.txt wordlist.txt --force
- 工具:Hashcat(
-
伪造:优先爆破,伪造需替换
.htpasswd
文件。
四、其他常见哈希类型及进攻策略
1. NTLM(Windows用户密码)
- 特点:基于MD4,无盐,32位十六进制。
- 识别:如
aad3b435b51404eeaad3b435b51404ee
。 - 破解:
- 工具:Hashcat(
-m 1000
)、John(nt
)。 - 命令:
hashcat -m 1000 hash.txt wordlist.txt --force
- 效率:无盐设计,秒级破解。
- 工具:Hashcat(
- 伪造:替换SAM文件哈希:
impacket-psexec -hashes :new_ntlm_hash user@target
2. MySQL Hashes
- 旧版(pre-4.1):16字节HEX,两次SHA1。
- 新版(5+):
*40字节HEX
,如*2d2...
。 - 破解:
- 工具:Hashcat(
-m 300
)、John(mysql-sha1
)。 - 命令:
hashcat -m 300 hash.txt wordlist.txt --force
- 工具:Hashcat(
- 伪造:生成新哈希:
from hashlib import sha1 password = "new_password" hashed = sha1(sha1(password.encode()).digest()).hexdigest() print(f"*{hashed.upper()}")
3. CMS特有格式(phpBB、WordPress、Drupal)
- phpBB3:
$H$
开头,MD5+迭代。 - WordPress:
$P$
开头,类似phpBB。 - Drupal:
$S$
开头,SHA-512+迭代。 - 破解:
- 工具:Hashcat(
-m 400
for WordPress,-m 7900
for Drupal)、John。 - 命令:
hashcat -m 400 hash.txt wordlist.txt --force
- 工具:Hashcat(
- 伪造:替换数据库字段:
from phpass import PasswordHash phpass = PasswordHash(8, False) password = "new_password" hashed = phpass.hash_password(password) # 替换数据库中的哈希
五、哈希破解相关工具
-
Hashcat:
- 优势:GPU加速,多格式支持,速度快。
- 适用:MD5、SHA、NTLM、bcrypt、scrypt、Argon2等。
- 优化:使用
--increment
或--mask
进行混合攻击。
-
John the Ripper:
- 优势:多格式支持,规则丰富,适合慢速哈希。
- 适用:bcrypt、yescrypt、Argon2等。
- 优化:自定义规则文件(如
custom.rule
)。
-
mkpasswd / htpasswd:
- 用途:生成MD5-Crypt、SHA-512-Crypt、yescrypt等哈希。
- 示例:
mkpasswd -m yescrypt -S <salt> <password>
-
Custom Scripts:
- 库:
bcrypt
、hashlib
、passlib
、scrypt
、argon2-cffi
。 - 用途:生成哈希或验证伪造结果。
- 库:
六、实战案例
案例1:破解/etc/shadow
中的yescrypt哈希
- 场景:获取
/etc/shadow
,发现$y$
哈希。 - 步骤:
- 提取哈希:
unshadow passwd shadow > hash.txt
。 - 使用John the Ripper:
john --format=yescrypt hash.txt --wordlist=rockyou.txt
- 若失败,尝试掩码攻击:
john --format=yescrypt hash.txt --mask=?l?l?l?l?d?d?d
- 提取哈希:
案例2:伪造WordPress用户认证
- 场景:SQL注入获取WordPress用户表,需伪造管理员登录。
- 步骤:
- 生成新哈希:
from phpass import PasswordHash phpass = PasswordHash(8, False) hashed = phpass.hash_password("new_password")
- 更新数据库:
UPDATE wp_users SET user_pass = 'hashed' WHERE user_login = 'admin';
- 使用
new_password
登录。
- 生成新哈希:
案例3:破解Argon2哈希
- 场景:从Web应用数据库获取Argon2id哈希。
- 步骤:
- 确认参数(内存、迭代次数、并行度)。
- 使用Hashcat:
hashcat -m 18000 -a 0 hash.txt wordlist.txt --force
- 优化:针对低内存参数使用字典攻击。
七、优化建议与注意事项
-
字典选择:
- 使用高质量字典(如
rockyou.txt
、弱密码列表)。 - 结合规则(如
d3ad.rule
)生成变种。
- 使用高质量字典(如
-
硬件优化:
- 高性能GPU(如NVIDIA A100)适合MD5、NTLM等。
- 高内存CPU适合scrypt、yescrypt、Argon2。
-
伪造优先级:
- 对于bcrypt、WordPress等,伪造效率高于爆破。
- 确保参数(如盐、迭代次数)与目标一致。
-
防御视角:
- 使用高迭代次数(PBKDF2>100,000、bcrypt>12、Argon2>3)。
- 优先Argon2或yescrypt,安全性更高。
八、总结
哈希破解和伪造是CTF和渗透测试中的核心技能。MD5、NTLM等传统算法因速度快易被破解,而bcrypt、scrypt、yescrypt和Argon2因高计算/内存成本更安全。进攻时需根据哈希类型选择合适的工具(如Hashcat、John)和策略(字典、规则、掩码)。伪造认证需精确匹配参数,优先于慢速哈希的爆破。通过合理优化硬件和字典,可显著提升效率。