很多人备考OSCP的时候,对密码攻击这一块的认知往往停留在“拿个字典跑一跑”的层面。真正上了靶场或者面对考试里的密码攻击题,才会发现:密码破解不是一个单纯跑工具的动作,而是一套从识别、选型、施压到验证的完整理论体系。这篇研记是密码破解理论的收尾部分,重点讲清楚“拿到一个目标之后,你的脑子应该怎么转”,以及那些文档里不会明说、但实战里决定成败的细节。
适合正在刷OSCP的备考者,也适合已经拿到证、想系统梳理密码攻击知识树的从业者。上一篇已经把离线破解的底层原理和工具选型讲完了,这篇我们直接进入实战层面:哈希识别、攻击向量组合、Windows域环境下的三板斧、在线爆破的节奏感,以及效率优化和翻车点。
1. 哈希识别的第一课:连目标是什么都不知道,谈何破解
很多人拿到一个包含哈希的文件,第一反应就是直接丢进hashcat里跑。这个习惯在OSCP的靶机练习中会浪费大量时间——因为hashcat对输入格式极为敏感,选错模式、写错格式,轻则跑不出结果,重则直接报错。更关键的是,你连这个哈希是什么算法生成的都不知道,就无从判断该用什么字典、什么掩码、多少算力。
哈希识别的本质,是确认两个信息:算法类型和存储格式。这两者经常被混为一谈,但它们决定的破解参数完全不同。算法类型决定了用哪个hashcat模块(-m参数),存储格式决定了你要不要预处理哈希。
1.1 从$6$开头的字符串说起:Linux影子文件的密码结构
Linux的/etc/shadow文件是OSCP认证中几乎必见的目标。典型的行格式长这样:
- root:$6$S6hW4nK9Xc1$aB3dEfGhIjKlMnOpQrStUvWxYz0123456789abcdefghijklmnopqrstuvwxyz:18032:0:99999:7:::
复制代码
用户名后面第一段,
$6$
,就是算法标识。这个数字对应关系非常固定:
$1$
是MD5crypt,
$2a$
/
$2b$
/
$2y$
是bcrypt系列,
$5$
是SHA-256crypt,
$6$
是SHA-512crypt。看到
$6$
,你立刻应该反应出:这是SHA-512的crypt实现,在hashcat里对应
-m 1800
,在John里对应
shadow
格式。
第二段盐值(salt)在
$6$
和下一个
$
之间,后面的长字符串是密码哈希主体。盐值的作用是防止彩虹表预计算,并确保两个相同密码的用户产生的哈希完全不同。很多人第一次看到shadow文件会问:为什么root的哈希格式和普通用户一样?因为Linux的crypt实现是统一的,区别只在算法轮数上,SHA-512crypt默认5000轮,bcrypt默认工作在
$2b$
且成本因子由盐值决定。
判断过程其实可以更快。拿工具的自动识别功能作为初步判断,但不要盲目信任。
1.2 hashid、hashcat --identify与人工复核
工具层面,hashid和hashcat自带的
--identify
都能对给定哈希做快速识别。用法很简单:
- hashid 'Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::'
- hashcat --identify '31d6cfe0d16ae931b73c59d7e0c089c0'
复制代码
这里我要特别提醒一个高频翻车点:NTLM哈希和纯MD5哈希都是32位十六进制字符串,外观上完全一样。但NTLM的算法本质是
MD4(UTF-16LE(密码))
,和标准MD5完全不同。如果只看长度就当成MD5去跑,结果必然是错的。区分方法有两个:一是看哈希来源,从Windows SAM或NTDS.dit提取的基本是NTLM;二是用已知密码做验证——比如你自己用Linux的
ntlm
命令或者Python脚本算一下,确认格式。
人工复核这一步,在OSCP环境下几乎必不可少。我自己的习惯是:任何一个32位十六进制哈希,先当成NTLM跑一轮常见密码,如果没有任何命中再考虑MD5。因为Windows内网环境里NTLM的出现频率远高于裸MD5,优先级的排序本身就是一种效率策略。
2. 攻击向量分层:字典、规则、掩码不是选择题而是组合题
我见过太多人把字典攻击、规则攻击、掩码攻击当成三种互斥的破解方式,实际上它们是层层递进的三层过滤网。任何一个有经验的破解者,都不会只押注一种向量,而是按照“成本从低到高、命中率从高到低”的顺序逐层施压。
2.1 字典攻击的效率黑洞在哪
字典攻击的核心是:猜测别人已经猜过的密码。rockyou.txt是OSCP圈子里最常用的入门字典,1400万条密码,解压后133MB。但直接拿它跑一个SHA-512crypt哈希,速度大概只有每秒几万次,全量跑一遍可能需要几小时到几天,这在考试场景里完全不现实。
所以字典攻击的关键不在字典大小,而在字典和目标的匹配度。我通常的做法是:先用小规模的高质量字典(比如SecLists里的
top_10_million_passwords
或rockyou的前10万条)快速试探,再结合目标信息做定向字典。定向字典的来源很多:公司名、人名、域名缩写、年份组合、常见体育队名,这些都可以通过cewl从目标网站爬取,或者用crunch按规则生成。
比如说目标公司叫"BlueCorp",域名是bluecorp.local,那我生成字典时会同时包含
BlueCorp
、
bluecorp
、
Bluecorp
这些大小写变体,再拼上常见年份和特殊符号。这种字典可能只有几千条,但命中率往往比1400万条的全量字典高得多。
2.2 规则引擎:用最小代价把字典价值放大百倍
规则攻击的本质,是对字典中的每一条密码施加一组变形操作。hashcat的规则引擎支持插入、删除、替换、大小写翻转、键盘位移、重复片段等几十种操作,一条规则可以产生几百个变体。
举一个最直观的例子:
- # 对字典中的每个词,尝试首字母大写 + 在末尾追加两位数字
- hashcat -m 1800 hash.txt words.txt -r rule_capitalize.rule
- # 内置规则best64,包含64条精心挑选的高频变形规则
- hashcat -m 1800 hash.txt words.txt -r best64.rule
复制代码
规则放在左边是攻击前变形(预处理字典),放在右边是攻击后变形(应用于每个候选词)。这个正交关系很容易被忽略,但理解了它,你就理解了为什么
-j
(左侧规则)和
-r
(右侧规则)可以同时使用,也就能设计出“先小写化再追加数字”这种组合变形。
规则的价值在于性价比。一条
best64.rule
只有几KB,却能把rockyou的有效覆盖率提升数倍。实战中,我遇到低难度哈希(NTLM、MD5)会直接上
d3ad0ne.rule
或
OneRuleToRuleThemAll
这种重型规则集,遇到高难度哈希(bcrypt、sha512crypt)则只用
best64
,因为重型规则的每次运算都是算力开销,必须按哈希成本量入为出。
2.3 掩码攻击的真正定位
掩码攻击不是用来大海捞针的,它是用来在已知密码结构中收尾的。hashcat里
?l
代表小写字母,
?u
代表大写字母,
?d
代表数字,
?s
代表特殊符号。当你知道目标的密码策略是“首字母大写+小写+两位数字”时,一个掩码
?u?l?l?l?l?l?d?d
就可以精准覆盖这个结构。
掩码攻击的算力评估有一条基本经验:每增加一位字符集,候选空间指数级增长。这是穷举的物理边界,即使你有顶级GPU也不可能无限扩展。所以在OSCP的实战中,掩码攻击只针对两类情况:一是密码长度结构已经明确,二是其他攻击向量全部失败后的最后手段。配合
--increment
参数可以让hashcat从短掩码自动增长到长掩码,避免一开始就跑超长空间。
一句话总结攻击向量的组合逻辑:字典打底,规则扩展,掩码收尾。顺序错了,效率就会断崖式下跌。
3. Windows与AD域的密码攻防:真正拉开分差的地方
OSCP考试中,Windows和Active Directory环境出现的频率越来越高。密码攻击在域环境里不再是“破解一个哈希”这么简单,而是形成了一整套围绕认证机制的攻击链。这里面的核心知识你逃不开:NTLM哈希的传递与破解,Kerberos协议下的票据攻击。
3.1 NTLM哈希的传递与破解
拿到一份Windows哈希后,你要做个判断:这哈希值到底需不需要破解?密码破解不是唯一出路,NTLM哈希本身就能在很多场景直接完成认证,这就是哈希传递(Pass-the-Hash)。它的原理在于,Windows的NTLM认证协议中,客户端用密码的NT哈希直接参与挑战响应计算,服务器侧验证的也是哈希值本身——服务器根本不需要知道明文密码。
哈希传递在工具层面非常成熟:
- # 用哈希直接认证SMB
- crackmapexec smb 192.168.1.0/24 -u administrator -H 31d6cfe0d16ae931b73c59d7e0c089c0
- # 开启一个交互式会话
- pth-winexe -U administrator%31d6cfe0d16ae931b73c59d7e0c089c0 //192.168.1.10 cmd
复制代码
什么时候哈希传递会失败?这是我和很多人反复踩过的坑:如果目标是本地账户,并且开启了UAC远程限制(LocalAccountTokenFilterPolicy未被配置),那么非交互式登录中的本地管理员账户会被过滤掉高完整性令牌,导致哈希传递失败。域管理员账户则通常不受此限制。另一个限制是,如果目标是启用了“受保护的用户”组的域用户,或者开启了Credential Guard,哈希传递也会失效。
所以正确的策略是:拿到NTLM哈希后,先做哈希传递测试,测试失败再考虑离线破解。离线破解NTLM非常快,消费级GPU都能跑到每秒数十亿次,这得益于MD4算法本身的设计简单。正因如此,任何以NTLM哈希为载体的密码,本质上都可以视为“明文已暴露”,只是需要一点时间成本。
3.2 Kerberoasting与AS-REP Roasting
Kerberoasting是我认为OSCP域渗透中最值得优先尝试的攻击手段。它的原理并不复杂:域内任何已认证用户都可以向域控制器请求注册了服务主体名称(SPN)的账户的服务票据(TGS),而这张票据是用服务账户的密码哈希加密的。如果你拿到这张TGS,就可以在本地离线破解服务账户的密码——全程不触发服务账户的任何登录事件,也不容易引发告警。
实操流程大致是:
- # 枚举SPN和对应账户
- impacket-GetUserSPNs -dc-ip 10.10.10.10 -request 'domain.local/user:password' -outputfile tgs.txt
- # 离线破解TGS哈希,hashcat mode 13100为TGS-REP,18200为AS-REP
- hashcat -m 13100 tgs.txt wordlist.txt -r best64.rule
复制代码
TGS的加密方式有RC4和AES两种,加密类型直接影响破解速度。RC4加密的TGS可用
-m 13100
直接快速破解,而AES加密的TGS虽然也能碰运气,但速度慢得多。所以枚举SPN时,尽量优先锁定那些服务账户配置了RC4加密的,或者先跑一轮全量,从破解成本低的开始。
AS-REP Roasting则是另一条思路:如果某个域用户没有启用Kerberos预认证(“Do not require Kerberos preauthentication”选项),攻击者就可以模拟该用户向域控制器请求AS-REP,得到用该用户密码哈希加密的响应,进而离线破解。这个攻击不需要用户密码,只需要用户名。域环境下常见的运维失误就是给服务账户关闭预认证,而这类账户往往还拥有高权限。
这两种攻击的共同点,是把在线攻防转换为离线破解。在OSCP考试里,这意味着你只要能拿到结构合理的票据哈希,CPU就能在后台慢慢跑,而你继续推进其他攻击路径。永远不要挂着破解等待——并行是密码攻击的核心工作方式。
4. 在线爆破与密码喷洒:别把账号锁成仇人
离线破解是安静的对决,但很多场景下你手里根本没有哈希,只有一个登录入口。这时候就必须面对在线攻击。在线攻击的危险在于:每一次尝试都会在服务器上留下日志,每一次失败都可能触发账号锁定。密码喷洒策略(Password Spraying)正是为了规避锁定而设计的方法论。
4.1 锁定策略侦察:动手之前的必修课
不知道目标账号锁定策略就开跑,是新手最容易犯的错误。锁定阈值如果是5次,你一个账号猜6次,这个账号就直接锁定,不仅这次测试失败,还会对目标系统造成实际影响。在OSCP的授权测试环境中,这种行为会被视为不专业。
侦察方式取决于你能拿到什么权限。域环境下可以尝试查询组策略对象,或者直接看域控制器的默认域策略:
- # 通过域控制器查询账户策略(需要一定权限)
- net accounts /domain
复制代码
在没有域权限时,你可以利用LDAP匿名查询(如果开启了匿名访问)来尝试读取锁定阈值参数。读不到就直接按保守值假设:通常Windows域默认是10次锁定,锁定阈值30分钟。按这个假设去做喷洒,每次只试1-2个密码,就基本安全。
4.2 喷洒的节奏与工具选择
密码喷洒的核心纪律是:一个密码打全网,换密码,再打全网。比如目标网段有300个有效用户,你第一天只试
Summer2024!
这一个密码,第二天再试
Autumn2024!
。每个用户每个密码只碰一次,这样即使锁定阈值是3,你也完全不会触发锁定。
工具层面,crackmapexec、kerbrute、Impacket的
lookupsid
和
wmiexec
都可以做喷洒,但注意协议差异。
- # SMB喷洒
- crackmapexec smb 192.168.1.0/24 -u users.txt -p 'Summer2024!' --continue-on-success
- # Kerberos预认证喷洒(优势是不易触发账户锁定,因为不接触NTLM失败计数)
- kerbrute passwordspray -d domain.local users.txt 'Summer2024!'
复制代码
Kerberos喷洒有一个技术优势:它走的是AS-REQ预认证,失败的登录尝试不会在目标主机上产生交互式登录失败事件,也不影响账户锁定计数器,这在严格监听的场景下隐蔽性更好。但注意,Kerberos用户枚举会产生AS-REP错误,工具会直接告诉你哪些用户名存在、哪些不存在,这个信息本身就有价值。
在线爆破还有一个维度是密码构造顺序:不要从
Password1
这种字典第一条开始,而是先看目标所在行业。医疗行业偏爱带年份的问候语,学校偏爱校名缩写加年份,企业内网偏爱“公司名+年份+符号”的组合。密码喷洒的本质不是技术对抗,而是社会工程学的技术化执行。
5. 破解效率的底层博弈:GPU、掩码与Markov链
离线破解的效率,很大程度上取决于你对硬件的理解。OSCP考试环境虽然是远程的,但破解通常在你的本地机器上跑。搞清楚几个关键数字,能让你在算力不足的情况下依然做出正确的战术选择。
5.1 用benchmark重新认识你的硬件
hashcat的
--benchmark
是每个破解者都应该先跑一遍的动作。它能告诉你当前设备在不同算法下的每秒破解速度,这个数字直接决定了你的破解策略。
- # 跑NTLM和SHA-512crypt两类哈希的基准
- hashcat -b -m 1000
- hashcat -b -m 1800
复制代码
举个实际例子:我的笔记本上,NTLM(-m 1000)能跑到约80亿次每秒,SHA-512crypt(-m 1800)大约只有30万次每秒,bcrypt(-m 3200)更是低到几万次每秒。这意味着什么?跑一个8位纯数字的NTLM组合(1亿个候选),1秒多就完了;但同样一个组合放到bcrypt上,要跑几十分钟。算力不同,选择攻击向量时的策略就必须不同。
所以拿到哈希时的第一动作应该是:判断算法,查基准速度,估算候选空间大小,再决定用字典还是掩码。这个过程应该像条件反射一样快。
5.2 掩码攻击的优先级设计
掩码设计是破解效率的分水岭。同样是8位密码,
?d?d?d?d?d?d?d?d
只有1亿个组合,
?l?l?l?l?l?l?l?l
约2000亿个组合,而
?a?a?a?a?a?a?a?a
则是天文数字。所以掩码攻击必须从信息熵最低的候选空间开始。
这里Markov链能帮上忙。hashcat的
--markov-hcstat2
参数会基于内置的密码统计模型,从最可能的前缀开始穷举,而不是机械地从
aaaaaaa
开始。这个模型来自大量真实密码泄露数据分析,比纯顺序穷举的命中率高几个数量级。实际使用时的建议是:长度6-8位的小写字母+数字组合,先用带Markov的掩码攻击跑一轮,绝大部分“格式简单”的密码都能在这个阶段暴露。
GPU数量和显存大小也决定多路并行策略。多GPU环境下,hashcat支持按字典分片、按规则分片、按掩码分片,
--opencl-device-types
可以控制是否使用CPU。我自己的经验是:优先让GPU跑低难度哈希,CPU可以同时跑一个高难度哈希(比如bcrypt),因为GPU跑bcrypt的效率优势并不明显,CPU的多核反而能分摊。这个“异构并行”的思路,在OSCP考试中能节省大量真实时间。
6. 实战中容易翻车的几个细节
最后这部分,是给所有准备上OSCP考场的人看的警示牌。密码攻击本身不难,难的是在一个高压环境下不犯低级错误。
6.1 哈希格式搞错的代价
hashcat对哈希格式的严格要求,超出很多人想象。NTLM哈希需要去掉用户名前缀,只保留32位十六进制值;Kerberos票据需要完整的
$krb5tgs$
格式,不能截断;bcrypt需要完整保留
$2y$
前缀和盐值。
最常见的翻车是:从Mimikatz导出的哈希带了
Username:RID:LMHASH:NTHASH:::
的全格式,你没拆就直接丢给hashcat。报错是小问题,更坑的是hashcat会静默忽略无法解析的行——你以为跑完了没结果,其实是格式错了根本没分析你的文件。每次开跑前,务必用
--show
或者先跑一个已知明文样例的哈希验证工具链是否通畅。
6.2 爆破目标的选择顺序
拿到一堆哈希时,先跑哪个?我一直遵循这个优先级:管理员账户和管理员组、服务账户、最近活跃的账户、普通用户。服务账户因为往往设置了很长的密码,容易被人忽略,但恰恰因为它们常被配置为“密码永不过期”,一旦破解就能长期维持访问。普通用户放在最后,而且一旦某个普通用户密码被破解,要立刻测试它是否复用在管理员或服务账户上。
密码复用是OSCP中极其常见的得分点。你破解了
jdoe
的密码,别停在拿到一个shell。用这个密码去试
administrator
、
sqlservice
、
backup
这些账号,能撞出系统管理员权限的情况我见过太多次了。密码破解只是过程,权限扩展才是目的,这个观念贯穿整个密码攻击理论体系。
还有一个需要养成肌肉记忆的习惯:每破解出一个密码,立刻整理进自己的密码表,标记来源和用途。考试时间越长,这张表的价值越大,因为目标环境中不同系统的密码复用率通常高得惊人。这个习惯不需要任何工具,一个文本文件就够,但它在OSCP考试里的回报率极高。