目 录CONTENT

文章目录

红队行动Live-20241109

Administrator
2025-04-09 / 0 评论 / 0 点赞 / 5 阅读 / 0 字

1. 引言与本次目标

  • 核心内容: 聚焦于使用 John the Ripper (john)Hashcat 破解两个特定的哈希,并通过这个过程详细讲解相关的技术细节、工具使用、策略选择和常见误区。

  • 内容深度: 即使是看似简单的哈希破解,深入挖掘后也包含大量值得探讨的内容。本次主要涉及 John 和 Hashcat,未来可能穿插讲解其他相关工具(如 CrackMapExec、目录爆破工具等)。

2. 哈希破解实践一:简单 MD5 哈希 (vipsu)

2.1 哈希生成与准备

  • 目标哈希: 对明文字符串 "vipsu" 进行 MD5 计算得到的哈希值。

  • 生成命令 (Linux):

    └─# echo -n vipsu | md5sum
    9b38e2b1e8b12f426b0d208a7ab6cb98  -
    • echo -n: 输出字符串时不附加末尾的换行符。极其重要,因为换行符会改变哈希结果。

    • md5sum: 计算 MD5 哈希的工具。

    • 输出格式: 哈希值 - (- 表示从标准输入读取)。实际用于破解的是哈希值本身。

  • 目标值: 9b38e2b1e8b12f426b0d208a7ab6cb98 (示例,根据实际计算为准)

2.2 使用 John the Ripper (john) 进行初步尝试

  • 习惯性做法 (错误):

    # 尝试直接指定 md5 格式和 rockyou 字典
    john --wordlist=/usr/share/wordlists/rockyou.txt --format=md5 hash
    
    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# john --wordlist=/usr/share/wordlists/rockyou.txt --format=md5 hash    
    Unknown ciphertext format name requested
  • 问题诊断:

    • John 可能提示 "Unknown ciphertext format name requested"。

    • 需要识别正确的格式名。对于无特定前缀的纯 MD5 哈希,应使用 raw-md5

  • 修正后尝试:

    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hash
    Using default input encoding: UTF-8
    Loaded 1 password hash (Raw-MD5 [MD5 128/128 AVX 4x3])
    Warning: no OpenMP support for this hash type, consider --fork=4
    Press 'q' or Ctrl-C to abort, almost any other key for status
    0g 0:00:00:00 DONE (2025-04-09 13:18) 0g/s 27583Kp/s 27583Kc/s 27583KC/s  fuckyooh21..*7¡Vamos!
    Session completed. 
  • 结果: 失败。John 跑完 rockyou.txt 字典后,未能破解出密码。

2.3 破解失败分析:字典与思维误区

  • 直接原因: 明文 "vipsu" 确实不在 rockyou.txt 字典中(讲师现场 grep 确认)。


  • 常见误区: 破解失败后,首要想法是“字典不够大”

  • 讲师观点: 强烈反对将字典大小作为首要或唯一的考量因素。
    在考虑更换更大字典或升级硬件(提升速度)之前,有大量优化工作可以且应该做。

  • 过度依赖字典的弊端:

    • 忽略了其他关键因素:哈希类型识别错误、工具参数配置不当、未使用规则、密码本身的特性等。

    • 增加字典体积的边际效益递减:合并多个大字典时,重复条目极多,实际增加的有效覆盖率有限,但时间成本剧增。

    • 是一种初级行为,掩盖了技术细节和策略选择的重要性。

  • 科学流程: 应先进行其他方面的优化(参数、规则、类型确认等),若仍然失败,再考虑字典或硬件。

2.4 John 默认行为分析:内置字典与规则

  • 简化使用:

    # 不指定字典和格式,让 John 自行处理
    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# john hash                 
    Warning: detected hash type "LM", but the string is also recognized as "dynamic=md5($p)"
    Use the "--format=dynamic=md5($p)" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "HAVAL-128-4"
    Use the "--format=HAVAL-128-4" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "MD2"
    Use the "--format=MD2" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "mdc2"
    Use the "--format=mdc2" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "mscash"
    Use the "--format=mscash" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "mscash2"
    Use the "--format=mscash2" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "NT"
    Use the "--format=NT" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "Raw-MD4"
    Use the "--format=Raw-MD4" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "Raw-MD5"
    Use the "--format=Raw-MD5" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "Raw-MD5u"
    Use the "--format=Raw-MD5u" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "Raw-SHA1-AxCrypt"
    Use the "--format=Raw-SHA1-AxCrypt" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "ripemd-128"
    Use the "--format=ripemd-128" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "Snefru-128"
    Use the "--format=Snefru-128" option to force loading these as that type instead
    Warning: detected hash type "LM", but the string is also recognized as "ZipMonster"
    Use the "--format=ZipMonster" option to force loading these as that type instead
    Using default input encoding: UTF-8
    Using default target encoding: CP850
    Loaded 2 password hashes with no different salts (LM [DES 128/128 AVX])
    Warning: poor OpenMP scalability for this hash type, consider --fork=4
    Will run 4 OpenMP threads
    Proceeding with single, rules:Single
    Press 'q' or Ctrl-C to abort, almost any other key for status
    Almost done: Processing the remaining buffered candidate passwords, if any.
    Proceeding with wordlist:/usr/share/john/password.lst
    Proceeding with incremental:LM_ASCII
  • John 的智能处理:

    • 自动识别格式: John 会尝试多种哈希类型来加载哈希。

    • 使用默认资源: 如果用户未指定字典,John 会启用其内置的破解模式,通常包括:

      • 一个小的默认密码列表 (password.lst,路径通常在 /etc/john//usr/share/john/)。

      • 一套强大的内置规则集 (默认通常是 Single 规则)。

    • 日志分析: 观察 John 的输出日志至关重要。

      • 会显示加载的哈希数量和类型。

      • 会显示正在使用的破解模式和规则。

      • 可能会提示性能优化建议(如 Consider using --fork=6,表示当前哈希类型不支持 OpenMP 多线程,建议使用进程复制方式)。

  • 使用正确的指定格式 --format=Raw-MD5

    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# john --format=Raw-MD5 hash 
    Using default input encoding: UTF-8
    Loaded 1 password hash (Raw-MD5 [MD5 128/128 AVX 4x3])
    Warning: no OpenMP support for this hash type, consider --fork=4
    Proceeding with single, rules:Single
    Press 'q' or Ctrl-C to abort, almost any other key for status
    Almost done: Processing the remaining buffered candidate passwords, if any.
    Proceeding with wordlist:/usr/share/john/password.lst
    Proceeding with incremental:ASCII
    vipsu            (?)     
    1g 0:00:00:05 DONE 3/3 (2025-04-09 23:44) 0.1862g/s 33463Kp/s 33463Kc/s 33463KC/s vipok..viph 
    Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
    Session completed. 
  • 本次结果: 使用 john --format=Raw-MD5 hash 快速成功破解出 "vipsu"。

  • 原因探究:

    • 走了下面这三个阶段:

      1. Proceeding with single, rules:Single
        正在用 “Single 模式” + “Single 规则集” 来尝试破解哈希。(基于用户名或文件名派生常用密码)

      2. Wordlist 模式(John 内建小字典 + 规则)

      3. Incremental 模式(从短字符串开始暴力爆破,最终命中了 vipsu

    • 查看 password.lst (wc -l /usr/share/john/password.lst 显示只有约 3500 词条),发现 "vipsu" 依然不在其中

    • 结论:成功是内置规则 rules:Single 作用于内置字典(或其他 John 内部机制)的结果。

    • 什么是 Single Crack Mode

      Single 模式是 John 最独特也最强大的功能之一,主要用于 基于用户名或已有信息自动生成密码猜测组合。非常适合处理像 /etc/passwd 这样的真实用户环境。

      🔑 特点如下:

      特性

      说明

      🔗 利用用户名

      把用户名作为基础,生成变形密码(如:aliceAlice123, alice!, aLiCe2020

      🔍 自动规则

      使用规则 Single 变形用户名

      🚀 超快

      比起完整字典或暴力破解,速度更快

      🎯 针对性强

      在目标已知场景下(如用户名已知),命中率较高

2.5 规则 (Rules) 的重要性与应用

  • 规则的本质: 定义了一系列转换逻辑(大小写变换、添加前后缀、字符替换、leet speak 等),将字典中的基础词汇变形为大量可能的密码变体。

  • John 的规则配置: 位于 john.conf 文件中(如 /etc/john/john.conf)。[List.Rules:Single] 定义了默认使用的规则集。

  • 规则的威力:

    • 极大扩展覆盖面: 规则生成的密码变体远比原始字典丰富,且更贴近用户实际设置密码的习惯
      PasswordP@ssw0rd1
      aliceAlice123, alice!, aLiCe2020

    • 效率远超大字典: 用规则处理一个中等字典(如 rockyou.txt)可能比直接跑一个巨大字典效果更好、速度更快。

  • 实战启示: 破解时,规则的应用是与字典选择同等甚至更重要的策略。不能破解时,优先考虑调整或应用规则,而非盲目寻找更大字典。

2.6 处理已破解哈希:Potfile 机制

  • Potfile (.pot): John (和 Hashcat) 会将成功破解的 哈希:密码 对记录在一个名为 .pot 的文件中(John 默认在 ~/.john/john.pot)。

  • 默认行为: 如果再次运行 John 破解同一个哈希文件,它会检查 .pot 文件,如果哈希已存在,则会跳过,提示 "No password hashes left to crack"。

    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# john --format=Raw-MD5 hash --pot=john --session=john 
    Using default input encoding: UTF-8
    Loaded 1 password hash (Raw-MD5 [MD5 128/128 AVX 4x3])
    No password hashes left to crack (see FAQ)
                                                
    No password hashes left to crack (see FAQ)
    
    说明 John the Ripper 认为该 hash 已经 被破解,
    或者之前已经尝试过并把结果写入了 .pot 文件(你这里指定的是 --pot=john),所以它 不会重复破解。
    
                                                                                                
    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# rm john            
                                                                                                                                            
  • 查看已破解:

    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# john --show --format=raw-md5 hash
    ?:vipsu
    
    1 password hash cracked, 0 left
  • 强制重新破解/管理 Potfile:

    • John: 使用 --pot=<new_pot_filename> 将本次破解结果写入新文件,从而绕开旧记录。

      换一个新的 session 名称 + pot 文件

      ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
      └─# john --format=Raw-MD5 hash --pot=john --session=john
      Using default input encoding: UTF-8
      Loaded 1 password hash (Raw-MD5 [MD5 128/128 AVX 4x3])
      Warning: no OpenMP support for this hash type, consider --fork=4
      Proceeding with single, rules:Single
      Press 'q' or Ctrl-C to abort, almost any other key for status
      Almost done: Processing the remaining buffered candidate passwords, if any.
      Proceeding with wordlist:/usr/share/john/password.lst
      Proceeding with incremental:ASCII
      vipsu            (?)     
      1g 0:00:00:05 DONE 3/3 (2025-04-15 11:44) 0.1923g/s 34557Kp/s 34557Kc/s 34557KC/s vipok..viph 
      Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
      Session completed. 
                                                                                                                                              
      • 也可以手动编辑或删除 ~/.john/john.pot 文件。

      • 使用 --session=<session_name> 可以管理不同的破解会话,
        每个会话可能有自己的 .pot 文件和状态,这也是一种管理方式。

      • Hashcat: 使用 --show 查看;使用 --potfile-disable 禁用 potfile 检查,强制重新破解。

2.7 字典策略再思考:生成与选择

  • 自定义字典生成: 使用 cewl (发音 "cool") 工具可以爬取目标网站,提取关键词生成针对性的字典。

    cewl http://target.com -w custom_wordlist.txt
  • 结合规则:cewl 生成的字典与 John/Hashcat 的规则结合使用,效果更佳。特别是可以根据目标组织的密码策略(如果能获取到信息)定制规则

  • 字典选择策略:

    • rockyou.txt 作为基础字典,平衡性好。

    • 结合目标信息生成小而精的自定义字典。

    • 切换不同类型的字典(通用、弱密码、特定语言、技术词汇等)比一味追求大更有意义。

    • 规则优先: 优先尝试不同的规则组合。

3. 哈希破解实践二:Kerberos TGS 哈希 (krb5tgs)

3.1 哈希来源与格式分析

  • 目标哈希: 一个 Kerberos TGS (Ticket Granting Service) 票据相关的哈希。

  • 格式示例: $krb5tgs$23$*adfs_svc$0X0SECURITY.LOCAL$0x0security.local/adfs_svc$...

    这是一个 Kerberos TGS(Ticket Granting Service)票据哈希,类型是:Kerberos 5 TGS-REP etype 23

    $krb5tgs$23$*adfs_svc$0X0SECURITY.LOCAL$0x0security.local/adfs_svc*$672af07157bad1782bfd0dcd050e1e74$01d1fae3e771f12e35920b1ad09778490656130df7e499b80d3e5a4057a951585fa6d56d53acee5e52a12f0888ace02fb85d6c35eadf1ae8b27b9e2dc94285f54f091c1faf8540347f202ca8e5aa256259880a3abde649838d724b91b20859184c1eba708790bac76137972cb24fbf2384b859760010719bc0856627a40e3aa2dd17dfb1c7a7616f38cdd203ee32ac091f1bb9e7dda7fc8c04e64bd030d026388a42765e053c5bc4f56f959c76b3ced2b1e3ba885659603d4c2c0c2ae2a57cd878dab42004b1160a6f3b89ecd8e95ef65ac63ea69db121f0ed815cc3cc2af29a75b76fbb4155b24f4e06575c0f8ea80c2bc72863550e103d41b7bb890e494e3f5cf5210d6a601a858a3a18260728233aa87b8120df35306320da3e592c5baa22e88debae2fb93df77ba38e2d473f491bda8a1983385d9021130be73b7226a885e1629d613f75fe47fb2990e2934f497ddd2e0a7fdd6f85fa579a4c235c9c189b988e6192412e0d5dc92e5e9fd2695c5ccf8c2695a6a5ebe42e0cc2c5de7734c1f91d0cf9328fb8eb60d5c63427edd0cdfc11ed11d3d6c8bebabe4b92c2c0d64f43612f7f5e8ba50034f4dd14e005a4e0c5eee3c96e8b41ae0439868cdee399f63742691b6b49bd688fee8dc27ddf8b02f5c74759fe46efc1f6850c77fda3f47fa8a731809ecb746188acd54f0a3493c8254fc802c122a40ebe1ebecab8019cee503a6835631faf6dfbc81a402930a36ae36f661f7335b82cd3b69b0c339399e04e1a0e5a4652cb1e5a92414e784a781119e6ee1f64d45f221864c27b3407bdf10efef946e45d55d608aa8afc9972b4b7637592f2f0651ec05a15c4a7fa4736f2410c331b33738927468d64f7b5a541daa6d52346959049665a5a3fb41ce2743191b25fca21477bb9c52f8bc040fecce4f96fe5893e1eb9f2a8969460bf34f109a09d33bf58a738626f311d9096aaeae134dcf6f4edbcc9c071aa1c39f6358861acdd3ce68aa4536dfcb053b5af38492dca6793898a7cb81ee25e863b239f8eb9203b528dda072b9b0bed7fd21092fa8542bc31365fd371251993810d64413b359ff4ee3d44bedaf9ec293b0c5abd5c36d98efdfbb068cf2a0321ef9acba2c3d967128478730a0cd4597d666c673a4e196deca3a050e6261379536a3cc344c29ed41cf934340f5a81ef2e37778d9a0fac6310fbf5009274814200c83eca73a9f8f7d6f24adb5182b67c013861564e95ef7b5f6107aaa4f6bfa44a4cbff9e2075183b66098518d8ec9989326959ff2a160e9d3e5261fd6d04001ed07de06af81c850056ec3fd04c6e66fad0e8ebfb1ebb4bc759c
  • 格式解读:

    • $krb5tgs$: 明确标识为 Kerberos TGS 票据哈希。

    • 23: 加密类型 (etype)。23 代表 RC4-HMAC-MD5。这是破解的关键信息。

    • *user*domain*spn*: 票据相关的上下文信息,通常包含用户名、域名/领域 (Realm)、服务主体名称 (SPN)。示例中 SPN 可能为 ADFSsvc/... (ADFS 服务)。

    • $CHECKSUM$: 通常是哈希或校验和部分。

    • $ENCRYPTED_PART: 真正需要破解的部分,通常是用与服务账户关联的 NTLM 哈希加密的。破解目标是还原出服务账户的 NTLM 哈希或明文密码。

  • 上下文重要性: 获取哈希的方式(如使用 Rubeus、Mimikatz kerberoast 模块)通常会直接告诉你哈希类型和相关信息。

3.2 识别哈希类型 (Hashcat/John)

  • 目标: 将描述性的类型 (krb5tgs, etype 23) 映射到工具内部的 模式 ID (Mode ID)格式名称 (Format Name)

  • Hashcat:

    • hashcat --help 有所有的格式,但是太多了根本看不完

    • 使用 hashcat --help | grep -i kerbhashcat --help | grep -i tgshashcat --help | grep 23 进行搜索。

    • 找到对应的模式:13100 | Kerberos 5, etype 23, TGS-REP

  • John:

    • 使用 john --list=formats | grep -i krbjohn --list=formats | grep -i tgs 进行搜索。


    • 找到对应的格式名称:通常是 krb5tgs 或类似名称。

3.3 使用 Hashcat 进行破解尝试 (字典)

  • 命令:

    # 使用 rockyou 字典
    hashcat -m 13100 hash-service /usr/share/wordlists/rockyou.txt
    
    # 尝试 John 的默认字典
    hashcat -m 13100 hash-service /usr/share/john/password.lst
    
    # 尝试更大的字典 (示例:SecLists)
    hashcat -m 13100 hash-service /usr/share/seclists/Passwords/Leaked-Databases/rockyou-withcount.txt.tar.gz
    
    ┌──(root㉿kali)-[/usr/share/seclists/Passwords/Leaked-Databases]
    └─# wc -l /usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt.tar.gz 
    213627 /usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt.tar.gz
                                                                                                                                              
    ┌──(root㉿kali)-[/usr/share/seclists/Passwords/Leaked-Databases]
    └─# wc -l /usr/share/seclists/Passwords/Leaked-Databases/rockyou-withcount.txt.tar.gz 
    212904 /usr/share/seclists/Passwords/Leaked-Databases/rockyou-withcount.txt.tar.gz
  • 结果: 使用任何纯字典(包括 rockyou.txt 和更大的字典)进行尝试,均快速失败 (状态 Exhausted)。

    ┌──(root㉿kali)-[~/Desktop/APTLabs/credentials]
    └─# hashcat -m 13100 hash-service /usr/share/wordlists/rockyou.txt      
    
    hashcat (v6.2.6) starting
    
    OpenCL API (OpenCL 3.0 PoCL 6.0+debian  Linux, None+Asserts, RELOC, LLVM 17.0.6, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
    ============================================================================================================================================
    * Device #1: cpu-sandybridge-AMD Ryzen 9 9990HS w/ Radeon 990M Graphics, 2913/5891 MB (1024 MB allocatable), 8MCU
    
    Minimum password length supported by kernel: 0
    Maximum password length supported by kernel: 256
    
    Hashes: 1 digests; 1 unique digests, 1 unique salts
    Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
    Rules: 1
    
    Optimizers applied:
    * Zero-Byte
    * Not-Iterated
    * Single-Hash
    * Single-Salt
    
    ATTENTION! Pure (unoptimized) backend kernels selected.
    Pure kernels can crack longer passwords, but drastically reduce performance.
    If you want to switch to optimized kernels, append -O to your commandline.
    See the above message to find out about the exact limits.
    
    Watchdog: Temperature abort trigger set to 90c
    
    Host memory required for this attack: 2 MB
    
    Dictionary cache built:
    * Filename..: /usr/share/wordlists/rockyou.txt
    * Passwords.: 14344392
    * Bytes.....: 139921507
    * Keyspace..: 14344385
    * Runtime...: 1 sec
    
    Approaching final keyspace - workload adjusted.           
    
    Session..........: hashcat                                
    Status...........: Exhausted
    Hash.Mode........: 13100 (Kerberos 5, etype 23, TGS-REP)
    Hash.Target......: $krb5tgs$23$*adfs_svc$0X0SECURITY.LOCAL$0x0security...bc759c
    Time.Started.....: Tue Apr 15 12:10:04 2025 (5 secs)
    Time.Estimated...: Tue Apr 15 12:10:09 2025 (0 secs)
    Kernel.Feature...: Pure Kernel
    Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
    Guess.Queue......: 1/1 (100.00%)
    Speed.#1.........:  2712.5 kH/s (0.75ms) @ Accel:512 Loops:1 Thr:1 Vec:8
    Recovered........: 0/1 (0.00%) Digests (total), 0/1 (0.00%) Digests (new)
    Progress.........: 14344385/14344385 (100.00%)
    Rejected.........: 0/14344385 (0.00%)
    Restore.Point....: 14344385/14344385 (100.00%)
    Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
    Candidate.Engine.: Device Generator
    Candidates.#1....: $HEX[206b72697374656e616e6e65] -> $HEX[042a0337c2a156616d6f732103]
    Hardware.Mon.#1..: Util: 53%
    
    Started: Tue Apr 15 12:10:01 2025
    Stopped: Tue Apr 15 12:10:10 2025

3.4 服务账号 (Service Account) 密码的可破解性分析

  • 关键判断: 哈希关联的账户 (ADFSsvc) 看起来像是一个服务账号

  • 普遍规律: 现代 Windows 系统(Server 2012 及以后)管理的机器账户 (Machine Account)组管理服务账户 (gMSA/Managed Service Account, MSA) 的密码通常是:

    • 系统自动生成。

    • 极长(如 120 字符或更长)。

    • 高度随机。

    • 定期自动轮换。

    • 结论:这类密码基本无法通过爆破破解。

  • 例外情况(导致可破解的原因):

    • 人为设置密码: 管理员手动为服务账号设置了一个符合人类习惯的密码,且未启用自动轮换。这通常是为了应用兼容性或是管理上的疏忽,属于严重的安全风险

    • 用户账户用作服务: 将一个普通用户账户配置为运行服务,其密码策略可能遵循用户标准。

  • 如何判断:

    • 账户名: svc, service, $结尾(机器账户)等是明显标志。

    • 上下文: 该账户是否有对应的用户配置文件 (C:\Users\<accountname>)?是否能在 AD 用户和计算机中像普通用户一样管理?

    • 经验: 如果没有明确证据表明密码是人为设置或账户是用户类型,默认服务账号密码不可破解,应寻找其他攻击路径。

3.5 使用 Hashcat + 规则进行破解

  • 必要性: 纯字典失败后,必须考虑使用规则。

  • 规则选择:

    • hashcat 默认的规则

    - [ Basic Examples ] -
    
      Attack-          | Hash- |
      Mode             | Type  | Example command
     ==================+=======+==================================================================
      Wordlist         | $P$   | hashcat -a 0 -m 400 example400.hash example.dict
      Wordlist + Rules | MD5   | hashcat -a 0 -m 0 example0.hash example.dict -r rules/best64.rule
      Brute-Force      | MD5   | hashcat -a 3 -m 0 example0.hash ?a?a?a?a?a?a
      Combinator       | MD5   | hashcat -a 1 -m 0 example0.hash example.dict example.dict
      Association      | $1$   | hashcat -a 9 -m 500 example500.hash 1word.dict -r rules/best64.rule
    • 有许多优秀的规则集,如 InsidePro.rule, T0xic.rule, d3ad0ne.rule 等。

    • InsidePro.rule

    ┌──(root㉿kali)-[/usr/share/seclists/Passwords/Leaked-Databases]
    └─# cat /usr/share/hashcat/rules/InsidePro-PasswordsPro.rule | wc -l
    3368
  • 可以从 /usr/share/hashcat/rules/ 目录选择,

  • 命令: hashcat -m 13100 hash-service /usr/share/wordlists/rockyou.txt --rules=InsidePro-PasswordsPro.rule

    # 复制规则文件到当前目录以便使用(可选)
    cp /usr/share/hashcat/rules/InsidePro-PasswordsPro.rule .
    
    # 运行 hashcat,指定模式、哈希文件、字典和规则文件
    hashcat -m 13100 krb5tgs_hash.txt /usr/share/wordlists/rockyou.txt.gz -r InsidePro-PasswordsPro.rule
    
    hashcat -m 13100 hash-service /usr/share/wordlists/rockyou.txt --rules=InsidePro-PasswordsPro.rule 
  • 结果: 快速成功。Hashcat 在极短时间内破解出密码。

  • 破解出的密码: Security (或其变体,如 S -> $Secur!tySecurity@123 等,具体取决于哈希和规则),印证了这是一个被人为设置的、相对简单的密码。

  • 强制重新跑(忽略历史)--potfile-disable

    可以加上 --potfile-disable 参数,禁止使用历史破解缓存:

3.6 网上整合的规则集,如 OneRuleToRuleThemAll.rule

这是博客文章 https://www.notsosecure.com/one-rule-to-rule-them-all/ 的支持存储库

  • “我们的超级规则在我们所有的测试中都名列前茅,我们之后查看的其他测试也是如此。很遗憾让任何《指环王》的粉丝失望(“一个戒指统治他们所有人!”),但尽管我们的规则名称,但可能永远不会有一条规则来统治他们所有人,因为如果有其他基于规则的攻击,则不存在。执行密码攻击时应始终考虑所有变量,特别是可用时间、硬件资源、字典大小和算法。

    5万两千条规则

3.7 Hashcat 输出解读与参数优化

  • 关键输出信息:

    • Session: 当前破解会话名称。

    • Status: 破解状态 (Running, Exhausted, Cracked, Aborted)。

    • Hash.Type: 破解的哈希模式名称。

    • Hash.Target: 正在破解的哈希文件。

    • Time.Started/Time.Estimated: 开始时间和预计剩余时间。

    • Guess.Base/Guess.Mod: 使用的基础字典和规则。

    • Speed.#*: 各个设备的破解速度 (H/s)。

    • Recovered: 已破解的哈希数量 / 总哈希数量。

    • Progress: 已尝试的候选密码 / 总密钥空间大小 (百分比)。

    • Rejected: 因长度或其他原因被拒绝的候选密码数量。

    • Restore.Point: 恢复点(进度)。

    • Candidates.#*: 各设备生成的候选密码。

    • HWMon.*: 硬件监控(温度、利用率)。

  • 实时交互:s 查看状态,p 暂停,r 恢复,b 跳过当前词,q 退出。

  • 优化提示: Hashcat 启动时可能会根据硬件给出优化建议(如特定驱动版本、参数调整)。务必关注日志和提示

3.8 Hashcat 硬件利用与设备选择

  • 查看设备:

    hashcat -I  # (大写 i) 列出所有可用的计算设备 (CPU, GPU) 及其 ID
  • 指定设备:

    # 使用 ID 为 1 的设备 (通常是第一个 GPU)
    hashcat -m 13100 ... -d 1
    
    # 使用 ID 为 1 和 2 的设备
    hashcat -m 13100 ... -d 1,2
  • 重要性: 充分利用 GPU 资源是 hashcat 速度远超 john 的关键。在有 GPU 的环境下,应优先使用并确保正确配置。

3.9 使用 John 破解 Kerberos 哈希 (对比)

  • 命令:

    # 识别 John 的格式名 (假设为 krb5tgs)
    /usr/share/john/rules/InsidePro-PasswordsPro.rule
    
    # 使用与 Hashcat 相同的字典和规则
    john --format=krb5tgs hash-service --wordlist=/usr/share/wordlists/rockyou.txt --rules=InsidePro

    InsidePro


  • 结果: 可以破解,但速度极慢。讲师提到需要跑一个多小时,而 Hashcat 只需几秒钟。

  • 原因: John 主要基于 CPU 运算,对于计算密集型的哈希类型(如 Kerberos、NTLM 等),其效率远低于 hashcat 利用 GPU 的并行计算能力。

3.10 John vs Hashcat 对比总结

  • Hashcat:

    • 优点: 速度极快(尤其利用 GPU),是破解常见、计算密集型哈希(NTLM, Kerberos, WPA/WPA2 等)的首选。规则系统强大。

    • 缺点: 支持的哈希类型虽多,但可能不如 John 全面(特别是冷门类型)。

  • John the Ripper:

    • 优点: 支持的哈希类型极其广泛,对各种罕见、老旧、特定应用的哈希格式兼容性好。规则系统也很强大。

    • 缺点: 破解速度(尤其是对常见类型)远慢于 Hashcat(特别是无 GPU 时)。

  • 策略:

    • 优先使用 Hashcat

    • 如果 Hashcat 速度慢、不支持该类型、或优化后效果仍不佳,再尝试 John

    • 两者结合使用,利用各自优势。

4. 哈希类型识别深化

4.1 识别方法概述 (长度、字符集、格式、上下文)

  • 核心要素:

    • 长度: 不同算法产生的哈希长度通常固定(MD5: 32, SHA1: 40, SHA256: 64, SHA512: 128)。

    • 字符集: 是纯十六进制 (0-9a-f)?还是包含大小写字母、数字和特殊符号(如 Base64 编码 +, /)?

    • 格式/前缀: 是否有特定的前缀(如 NTLM 通常无前缀,LM 可能有 AAD...NO PASSWORD...,*nix shadow 文件中的哈希有 $id$ 前缀如 $1$ (MD5), $5$ (SHA256), $6$ (SHA512), $2a$/$2b$/$2y$ (bcrypt))。

    • 上下文: 哈希是从哪里获得的?(数据库类型、操作系统、应用程序、特定漏洞利用工具的输出)。上下文信息往往是最可靠的判断依据。

4.2 常见哈希类型特征与示例表

  • 重要性: 熟悉常见哈希的特征有助于快速缩小范围。讲师展示了一个包含多种哈希及其特征(长度、字符集、前缀)的表格。

  • 学习方法:

    • 理解而非死记: 通读表格,理解不同算法的特点,特别是自己常用或目标环境中常见的类型。

    • 关注特征: 注意特殊前缀 ($1$, $6$, $2a$)、长度(32, 40, 64, 128)、特殊字符(bcrypt 中的 ./)。

      MD5 哈希值:5f4dcc3b5aa765d61d8327deb882cf99

      SHA-1 哈希值:2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

      bcrypt 哈希值:$2y$12$wI7V8x.xGMDc/4YIExE6aOJ2F4jvZLg6rFz5x/u0cL2bkjZBKzE6.

    • 建立敏感度: 目标是看到一个哈希字符串时,能大致判断其可能的类型或排除某些类型。

4.3 理解算法与上下文的重要性

  • 超越识别: 深入理解特定系统/应用为什么使用某种加密算法(历史原因、安全考虑、性能权衡),有助于更准确地判断和处理哈希。

  • 实例: WordPress 使用 phpass (基于 Blowfish/bcrypt),macOS 使用特定的 salted SHA512 变体。了解这些背景知识能在遇到相应哈希时直接确定类型和处理方式。


  • 破解可能性判断: 理解算法特性(如是否加盐、迭代次数)和上下文(如是否为系统管理的强密码)能帮助判断是否值得投入资源进行破解避免在几乎不可能破解的哈希上浪费时间(如现代系统服务账号密码)是关键决策点。

4.4 识别工具介绍 (命令行与在线)

  • 命令行工具:

    • hash-identifier: 较老,准确性可能下降。

    • hashid: 另一个识别工具。

    • name-that-hash (nth): 推荐。更新较新,信息较
      全,准确度相对较高。支持文件输入 (nth -f hashfile.txt)。

      也可以用简化命令nth --file hash


    • 优势: 可用于脚本化处理大量哈希。

  • 在线工具:

  • 策略:

    • 交叉验证: 使用多个工具(本地+在线)进行识别,提高准确性。

    • 理解局限: 工具识别基于模式匹配,可能不准或无法识别未知/复杂类型。上下文信息和人工判断仍是关键

4.5 复杂场景下的识别策略

  • 特征不明显时:

    • 依赖上下文信息。

    • 尝试性破解: 根据可能的类型范围,使用工具(如 John)尝试加载,观察哪个格式能成功加载。

    • 正向生成比对: 如果怀疑是某种对称/非对称加密(如 AES),且掌握部分密钥信息,可以尝试用已知明文+猜测的密钥/模式正向加密,看生成的密文特征(长度、字符集)是否与目标哈希匹配。

4.6 案例机器推荐:BlackRose (深入密码学)

  • 靶机平台: VulnHub
    https://www.vulnhub.com/entry/blackrose-1,509/

  • 特点: 涉及较复杂的密码学应用(如 AES),需要深入理解算法和上下文才能解决。网上的 Writeup 可能不完全准确或有误导。

  • 目的: 锻炼在面对非标准、复杂加密场景时的分析和破解能力。

5. 高级字典与规则技术

5.1 键盘漫步 (Keyboard Walk) 生成器

  • 工具: kwp (Keyboard Walk Processor) 或 kwprocessor,属于 hashcat-utils 工具集。

    高级键盘行走生成器,具有可配置的 basechars、keymap 和路由

    有时人们会得出结论,键盘行走是一种“中等”安全解决方案。像“q2w3e4r”这样的密码来救援,对于那些不破解密码的人来说,它看起来很随机,随机很好,不是吗。通过一些 shift-pressing 模式,它甚至可以匹配一些更难的密码策略。无论如何,这为如何使用我的键盘行走生成器(从现在开始称为 KWP)以及如何配置它提供了一个良好的开端。密码 “q2w3e4r” 是锯齿状图案。如果你在键盘上点击它,它看起来像这样:

    这里有一些重要的部分。

    • 这是一种模式。键盘行走生成器应该自动生成这样的模式。Pattern 是用户使用 keyboard-walks 的原因,因为它们很容易记住。只有当它们简单时,它们才容易记住。

    • 这是一种明确适用于相邻磁贴的模式。键盘行走生成器应该只生成这些。创建特定模式所需的任何跳转都应该在后处理中完成。

    上面的模式可以被分配一个名称,它是一个已知的模式,我们可以 “识别” 它。但它甚至不应该成为配置的一部分。但是,这种已知模式还有另一个属性,我们将在配置中大量使用该属性。了解如何配置 KWP 时,必须了解此概念:

    但更重要的是模式是什么样子的。我为他们中的一些人拍了照片,以便更好地感受它。以下键盘走动显示了一些不错的模式:



  • 原理: 基于键盘布局生成密码。模拟用户在键盘上按特定路径(直线、对角线、形状)敲击生成的字符串(如 qwerty, asdfg, !@#$)。

  • 目的: 覆盖那些非单词、但基于键盘位置习惯设置的密码。

  • 应用: 生成的列表可以作为补充字典使用。

5.2 规则文件的进一步应用与管理 (John & Hashcat)

  • 规则嵌套/引用: John 的规则文件 (john.conf) 可以定义和引用其他规则集或 section。

  • 规则共享: 许多流行的规则(如 InsidePro.rule)被 John 和 Hashcat 共同收录和支持。路径通常在各自的安装目录下 (/usr/share/john/, /usr/share/hashcat/rules/)。

  • 熟悉规则库: 建议花时间浏览工具自带的规则文件,了解不同规则文件的命名、大小、大致功能(即使不完全理解每条规则的语法)。

5.3 "OneRuleToRuleThemAll" 综合规则集

  • 来源: 社区贡献,将多个流行规则集合并、去重后形成的一个超大规则文件(如 5 万多条规则)。

  • 目的: 提供最大的规则覆盖面,简化选择。

  • 使用: 可以下载并在 Hashcat/John 中使用,但需注意其庞大体积可能带来的性能影响。

6. 爆破策略总结与后续内容

6.1 核心爆破策略回顾

  • 工具选择: Hashcat 优先(速度快,GPU 支持),John 次之(类型广,兼容性好)。

  • 字典策略: Rockyou 为基础,结合目标信息生成小字典,规则应用优先于盲目增大字典

  • 规则应用: 必须掌握,是提升效率和成功率的关键。尝试不同规则集。

  • 上下文判断: 区分用户密码与服务密码,判断可破解性。

  • 持续优化: 观察日志,调整参数(线程、设备),切换工具/字典/规则,不接受过长的破解时间。

  • 心态: 爆破有不确定性,即使尽力也可能失败。最可怕的是在无法破解的哈希上浪费过多时间。

6.2 其他爆破工具提及 (NXC/CrackMapExec)

  • 工具: nxc (NetExec) / crackmapexec (CME)。

  • 用途: 主要用于域环境下的横向移动和凭据操作,包括:

    • 密码喷洒 (Password Spraying)

    • 哈希传递 (Pass the Hash - PtH)

    • 凭据枚举与爆破 (SMB, WinRM, LDAP 等)

  • 后续讲解: 将在后续课程中遇到相关场景时详细介绍。

6.3 Burp Suite 字典爆破局限性

  • 问题: Burp Suite Intruder 进行 Web 登录爆破时,如果目标使用复杂的、与会话绑定的 Token(如 CSRF Token),hydra 和 Burp Intruder 的简单爆破模式可能失效。

  • 原因: Token 每次请求都变化,需要动态获取并包含在后续请求中。

  • 解决: 需要编写自定义脚本(如 Burp 的宏或扩展)来处理 Token 的动态更新。

  • 与 Hydra 类似: hydra 在处理这类带 Token 的场景时也存在类似局限,需要额外脚本支持。

7. Q&amp;A 与环境配置问题

7.1 John vs Hashcat 的稳定性与效率讨论

  • John: 代码结构相对单一,执行时可能加载较多模块,效率较低。有时小语法问题可能导致意外行为。

  • Hashcat: 采用模块化设计(-m 指定模式),针对性强,效率高。通常更稳定。

7.2 John 规则的深入应用 (Section, Stacking)

  • John 的规则系统支持更复杂的操作,如:

    • 仅使用规则文件中的特定部分 (Section)

    • 将多个规则堆叠 (Stacking) 应用。

7.3 PowerShell Remoting 连接问题排查 (Enter-PSSession)

  • 场景: 学员在 Kali Linux 上使用 pwsh 连接 Windows 目标时遇到 Enter-PSSession 失败。

  • 关键配置 (Windows 端):

    • 启用 PowerShell Remoting: Enable-PSRemoting -Force

    • 配置 WinRM 服务: 确保服务运行,防火墙允许相应端口 (默认 5985/HTTP, 5986/HTTPS)。

    • 信任主机配置 (如果不在同一域或使用 IP 连接): Set-Item wsman:\localhost\Client\TrustedHosts -Value '*' -Force (注意安全风险)。

  • 关键配置 (Linux 端):

    • 安装 powershell (pwsh)。

    • 安装 WSMan 客户端库: 可能需要安装 gss-ntlmssp 或类似包来支持 NTLM/Kerberos 认证。

    • (讲师提及) 安装 pswsman 包 (Install-Module -Name pswsman 在 pwsh 内执行?或系统包管理器安装相关依赖?需确认)。

  • 命令:

    # 创建凭据对象
    $cred = Get-Credential
    
    # 尝试连接
    Enter-PSSession -ComputerName <TargetIP_or_Hostname> -Credential $cred -Authentication Negotiate # 或 Kerberos, Basic 等
  • 排查点: 认证方式、凭据、网络连接、防火墙、WinRM 服务状态、TrustedHosts 配置、Linux 端依赖库。

-.-

0

评论区