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_ASCIIJohn 的智能处理:
自动识别格式: 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"。原因探究:
走了下面这三个阶段:
Proceeding with single, rules:Single
正在用 “Single 模式” + “Single 规则集” 来尝试破解哈希。(基于用户名或文件名派生常用密码)Wordlist模式(John 内建小字典 + 规则)✅
Incremental模式(从短字符串开始暴力爆破,最终命中了vipsu)
查看
password.lst(wc -l /usr/share/john/password.lst显示只有约 3500 词条),发现 "vipsu" 依然不在其中。结论:成功是内置规则 rules:Single 作用于内置字典(或其他 John 内部机制)的结果。
什么是 Single Crack Mode
Single 模式是 John 最独特也最强大的功能之一,主要用于 基于用户名或已有信息自动生成密码猜测组合。非常适合处理像
/etc/passwd这样的真实用户环境。🔑 特点如下:
2.5 规则 (Rules) 的重要性与应用
规则的本质: 定义了一系列转换逻辑(大小写变换、添加前后缀、字符替换、leet speak 等),将字典中的基础词汇变形为大量可能的密码变体。
John 的规则配置: 位于
john.conf文件中(如/etc/john/john.conf)。[List.Rules:Single]定义了默认使用的规则集。
规则的威力:
极大扩展覆盖面: 规则生成的密码变体远比原始字典丰富,且更贴近用户实际设置密码的习惯
如Password→P@ssw0rd1
如alice→Alice123,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 kerb或hashcat --help | grep -i tgs或hashcat --help | grep 23进行搜索。
找到对应的模式:
13100 | Kerberos 5, etype 23, TGS-REP
John:
使用
john --list=formats | grep -i krb或john --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!ty或Security@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=InsideProInsidePro

结果: 可以破解,但速度极慢。讲师提到需要跑一个多小时,而 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 哈希值:5f4dcc3b5aa765d61d8327deb882cf99SHA-1 哈希值:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12bcrypt 哈希值:
$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
优势: 可用于脚本化处理大量哈希。
在线工具:
众多在线哈希识别网站
https://hashes.com/en/decrypt/hash
https://www.tunnelsup.com/hash-analyzer
https://crackstation.net
MD5 在线破解网站(如
cmd5.com)通常能直接破解常见的 MD5 值,因其背后有庞大的彩虹表 (Rainbow Table) 或泄露数据库。彩虹表: 预先计算好的哈希链,用空间换时间,能快速查找某些类型哈希(特别是未加盐的)对应的原文。对加盐哈希效果差。
策略:
交叉验证: 使用多个工具(本地+在线)进行识别,提高准确性。
理解局限: 工具识别基于模式匹配,可能不准或无法识别未知/复杂类型。上下文信息和人工判断仍是关键。
4.5 复杂场景下的识别策略
特征不明显时:
依赖上下文信息。
尝试性破解: 根据可能的类型范围,使用工具(如 John)尝试加载,观察哪个格式能成功加载。
正向生成比对: 如果怀疑是某种对称/非对称加密(如 AES),且掌握部分密钥信息,可以尝试用已知明文+猜测的密钥/模式正向加密,看生成的密文特征(长度、字符集)是否与目标哈希匹配。
4.6 案例机器推荐:BlackRose (深入密码学)
特点: 涉及较复杂的密码学应用(如 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&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 端依赖库。
-.-
评论区