当前位置: 首页 > news >正文

常见哈希格式类型及其在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
      
  • 优化
    • 检查迭代次数:低于100,000次时,爆破可行。
    • 针对弱密码:尝试常见密码(如admin123password1)。
    • 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。示例:
      hashcat -m 3200 -a 0 hash.txt wordlist.txt --force
      
      注:bcrypt爆破极慢,需高性能硬件。
    • John the Ripper:格式bcrypt
      john --format=bcrypt hash.txt --wordlist=wordlist.txt
      
  • 优化
    • 检查成本因子:低于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
      
  • 优化
    • 检查参数:较低的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:支持有限,需最新版本(实验性模式)。
  • 优化
    • 检查参数:低N值(如<16)可降低破解难度。
    • 优先字典攻击:内存和计算成本高,穷举不可行。
    • 硬件需求:高内存和CPU资源是关键。
4.3 伪造可能性
  • 可行性:可生成新哈希替换。
  • 方法:使用mkpasswd生成:
    mkpasswd -m yescrypt -S <salt> <password>
    
    或Python库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格式。
  • 优化
    • 检查内存参数:低内存(如<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对比(进攻视角)

特性PBKDF2bcryptscryptyescryptArgon2
爆破难度中等(GPU加速快)高(抗并行化)高(内存密集)极高(内存+CPU)极高(内存+CPU)
伪造可能性需替换哈希,复杂可直接替换,简单需替换,稍复杂需替换,复杂需替换,复杂
识别方式pbkdf2:iter...$2a$/$2y$开头scrypt$ln=...$y$开头$argon2id$开头
工具支持Hashcat、JohnHashcat、JohnHashcat、JohnJohn(有限)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
      
    • 效率:秒级破解,适合弱密码。
  • 伪造:生成新哈希替换:
    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
      
  • 伪造:优先爆破,伪造成本高。

3. $6$ — SHA-512-Crypt

  • 特点:SHA-512,5000次迭代,较慢。
  • 识别:以$6$开头。
  • 破解
    • 工具:Hashcat(-m 1800)、John(sha512crypt)。
    • 命令
      hashcat -m 1800 hash.txt wordlist.txt --force
      
  • 伪造:专注爆破。

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
      
  • 伪造:优先爆破,伪造需替换.htpasswd文件。


四、其他常见哈希类型及进攻策略

1. NTLM(Windows用户密码)

  • 特点:基于MD4,无盐,32位十六进制。
  • 识别:如aad3b435b51404eeaad3b435b51404ee
  • 破解
    • 工具:Hashcat(-m 1000)、John(nt)。
    • 命令
      hashcat -m 1000 hash.txt wordlist.txt --force
      
    • 效率:无盐设计,秒级破解。
  • 伪造:替换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
      
  • 伪造:生成新哈希:
    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
      
  • 伪造:替换数据库字段:
    from phpass import PasswordHash
    phpass = PasswordHash(8, False)
    password = "new_password"
    hashed = phpass.hash_password(password)
    # 替换数据库中的哈希
    

五、哈希破解相关工具

  1. Hashcat

    • 优势:GPU加速,多格式支持,速度快。
    • 适用:MD5、SHA、NTLM、bcrypt、scrypt、Argon2等。
    • 优化:使用--increment--mask进行混合攻击。
  2. John the Ripper

    • 优势:多格式支持,规则丰富,适合慢速哈希。
    • 适用:bcrypt、yescrypt、Argon2等。
    • 优化:自定义规则文件(如custom.rule)。
  3. mkpasswd / htpasswd

    • 用途:生成MD5-Crypt、SHA-512-Crypt、yescrypt等哈希。
    • 示例
      mkpasswd -m yescrypt -S <salt> <password>
      
  4. Custom Scripts

    • bcrypthashlibpasslibscryptargon2-cffi
    • 用途:生成哈希或验证伪造结果。

六、实战案例

案例1:破解/etc/shadow中的yescrypt哈希

  • 场景:获取/etc/shadow,发现$y$哈希。
  • 步骤
    1. 提取哈希:unshadow passwd shadow > hash.txt
    2. 使用John the Ripper:
      john --format=yescrypt hash.txt --wordlist=rockyou.txt
      
    3. 若失败,尝试掩码攻击:
      john --format=yescrypt hash.txt --mask=?l?l?l?l?d?d?d
      

案例2:伪造WordPress用户认证

  • 场景:SQL注入获取WordPress用户表,需伪造管理员登录。
  • 步骤
    1. 生成新哈希:
      from phpass import PasswordHash
      phpass = PasswordHash(8, False)
      hashed = phpass.hash_password("new_password")
      
    2. 更新数据库:
      UPDATE wp_users SET user_pass = 'hashed' WHERE user_login = 'admin';
      
    3. 使用new_password登录。

案例3:破解Argon2哈希

  • 场景:从Web应用数据库获取Argon2id哈希。
  • 步骤
    1. 确认参数(内存、迭代次数、并行度)。
    2. 使用Hashcat:
      hashcat -m 18000 -a 0 hash.txt wordlist.txt --force
      
    3. 优化:针对低内存参数使用字典攻击。

七、优化建议与注意事项

  1. 字典选择

    • 使用高质量字典(如rockyou.txt、弱密码列表)。
    • 结合规则(如d3ad.rule)生成变种。
  2. 硬件优化

    • 高性能GPU(如NVIDIA A100)适合MD5、NTLM等。
    • 高内存CPU适合scrypt、yescrypt、Argon2。
  3. 伪造优先级

    • 对于bcrypt、WordPress等,伪造效率高于爆破。
    • 确保参数(如盐、迭代次数)与目标一致。
  4. 防御视角

    • 使用高迭代次数(PBKDF2>100,000、bcrypt>12、Argon2>3)。
    • 优先Argon2或yescrypt,安全性更高。

八、总结

哈希破解和伪造是CTF和渗透测试中的核心技能。MD5、NTLM等传统算法因速度快易被破解,而bcrypt、scrypt、yescrypt和Argon2因高计算/内存成本更安全。进攻时需根据哈希类型选择合适的工具(如Hashcat、John)和策略(字典、规则、掩码)。伪造认证需精确匹配参数,优先于慢速哈希的爆破。通过合理优化硬件和字典,可显著提升效率。

相关文章:

  • Spring Boot分布式锁深度优化:彻底解决达梦数据库高并发死锁问题
  • 【C++11】智能指针——unique_ptr, shared_ptr和weak_ptr
  • DBeaver数据库管理工具的简介、下载安装与优化配置
  • 【Dify精讲】第10章:会话管理与上下文保持【知识卡片】
  • Nginx入门篇
  • 【计算机网络】:get与post
  • 基于协同过滤的新高考志愿个性化智能推荐系统前后端讲解
  • 座舱监控系统(In-Cabin Monitoring System,IMS)相关知识
  • Gartner发布终端安全项目路线图:保护终端免受复杂网络攻击
  • 前端项目如何部署为https
  • 每天一个前端小知识 Day 3 - JavaScript 的作用域与闭包
  • C++指针的使用
  • 计算机网络 期末实训 eNSP 校园网
  • AI 在智慧农业领域的 10 大应用:从作物监测到精准营销
  • React前端与React Native移动端开发须知差异
  • NLP学习路线图(四十九):spaCy
  • 第二届图像处理、机器学习与模式识别国际学术会议(IPMLP 2025)
  • 支持 TDengine 的数据库管理工具—qStudio
  • 细说STM32单片机SPI-Flash芯片的FatFS移植
  • Kafka Connect生产实践:性能优化与高可用架构构建
  • 电子商务网站建设心得/提高网站权重的方法
  • 建设网页建设/黑帽seo培训大神
  • 做网站需要什么证件吗/网络推广app是违法的吗
  • 网站开发公司售后服务/seo网站排名厂商定制
  • 网站建设需要了解的/千锋教育培训机构可靠吗
  • 做网站买空间用共享ip/太原seo网络优化招聘网