[密码攻击] OSCP密码攻击实战:从哈希识别到域渗透的完整理论体系

50 0
Honkers 11 小时前 来自手机 | 显示全部楼层 |阅读模式

很多人备考OSCP的时候,对密码攻击这一块的认知往往停留在“拿个字典跑一跑”的层面。真正上了靶场或者面对考试里的密码攻击题,才会发现:密码破解不是一个单纯跑工具的动作,而是一套从识别、选型、施压到验证的完整理论体系。这篇研记是密码破解理论的收尾部分,重点讲清楚“拿到一个目标之后,你的脑子应该怎么转”,以及那些文档里不会明说、但实战里决定成败的细节。

适合正在刷OSCP的备考者,也适合已经拿到证、想系统梳理密码攻击知识树的从业者。上一篇已经把离线破解的底层原理和工具选型讲完了,这篇我们直接进入实战层面:哈希识别、攻击向量组合、Windows域环境下的三板斧、在线爆破的节奏感,以及效率优化和翻车点。

1. 哈希识别的第一课:连目标是什么都不知道,谈何破解

很多人拿到一个包含哈希的文件,第一反应就是直接丢进hashcat里跑。这个习惯在OSCP的靶机练习中会浪费大量时间——因为hashcat对输入格式极为敏感,选错模式、写错格式,轻则跑不出结果,重则直接报错。更关键的是,你连这个哈希是什么算法生成的都不知道,就无从判断该用什么字典、什么掩码、多少算力。

哈希识别的本质,是确认两个信息:算法类型和存储格式。这两者经常被混为一谈,但它们决定的破解参数完全不同。算法类型决定了用哪个hashcat模块(-m参数),存储格式决定了你要不要预处理哈希。

1.1 从$6$开头的字符串说起:Linux影子文件的密码结构

Linux的/etc/shadow文件是OSCP认证中几乎必见的目标。典型的行格式长这样:

  1. 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 都能对给定哈希做快速识别。用法很简单:

  1. hashid 'Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::'
  2. 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的规则引擎支持插入、删除、替换、大小写翻转、键盘位移、重复片段等几十种操作,一条规则可以产生几百个变体。

举一个最直观的例子:

  1. # 对字典中的每个词,尝试首字母大写 + 在末尾追加两位数字
  2. hashcat -m 1800 hash.txt words.txt -r rule_capitalize.rule
  3. # 内置规则best64,包含64条精心挑选的高频变形规则
  4. 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哈希直接参与挑战响应计算,服务器侧验证的也是哈希值本身——服务器根本不需要知道明文密码。

哈希传递在工具层面非常成熟:

  1. # 用哈希直接认证SMB
  2. crackmapexec smb 192.168.1.0/24 -u administrator -H 31d6cfe0d16ae931b73c59d7e0c089c0
  3. # 开启一个交互式会话
  4. 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,就可以在本地离线破解服务账户的密码——全程不触发服务账户的任何登录事件,也不容易引发告警。

实操流程大致是:

  1. # 枚举SPN和对应账户
  2. impacket-GetUserSPNs -dc-ip 10.10.10.10 -request 'domain.local/user:password' -outputfile tgs.txt
  3. # 离线破解TGS哈希,hashcat mode 13100为TGS-REP,18200为AS-REP
  4. 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的授权测试环境中,这种行为会被视为不专业。

侦察方式取决于你能拿到什么权限。域环境下可以尝试查询组策略对象,或者直接看域控制器的默认域策略:

  1. # 通过域控制器查询账户策略(需要一定权限)
  2. net accounts /domain
复制代码

在没有域权限时,你可以利用LDAP匿名查询(如果开启了匿名访问)来尝试读取锁定阈值参数。读不到就直接按保守值假设:通常Windows域默认是10次锁定,锁定阈值30分钟。按这个假设去做喷洒,每次只试1-2个密码,就基本安全。

4.2 喷洒的节奏与工具选择

密码喷洒的核心纪律是:一个密码打全网,换密码,再打全网。比如目标网段有300个有效用户,你第一天只试 Summer2024! 这一个密码,第二天再试 Autumn2024! 。每个用户每个密码只碰一次,这样即使锁定阈值是3,你也完全不会触发锁定。

工具层面,crackmapexec、kerbrute、Impacket的 lookupsid 和 wmiexec 都可以做喷洒,但注意协议差异。

  1. # SMB喷洒
  2. crackmapexec smb 192.168.1.0/24 -u users.txt -p 'Summer2024!' --continue-on-success
  3. # Kerberos预认证喷洒(优势是不易触发账户锁定,因为不接触NTLM失败计数)
  4. kerbrute passwordspray -d domain.local users.txt 'Summer2024!'
复制代码

Kerberos喷洒有一个技术优势:它走的是AS-REQ预认证,失败的登录尝试不会在目标主机上产生交互式登录失败事件,也不影响账户锁定计数器,这在严格监听的场景下隐蔽性更好。但注意,Kerberos用户枚举会产生AS-REP错误,工具会直接告诉你哪些用户名存在、哪些不存在,这个信息本身就有价值。

在线爆破还有一个维度是密码构造顺序:不要从 Password1 这种字典第一条开始,而是先看目标所在行业。医疗行业偏爱带年份的问候语,学校偏爱校名缩写加年份,企业内网偏爱“公司名+年份+符号”的组合。密码喷洒的本质不是技术对抗,而是社会工程学的技术化执行。

5. 破解效率的底层博弈:GPU、掩码与Markov链

离线破解的效率,很大程度上取决于你对硬件的理解。OSCP考试环境虽然是远程的,但破解通常在你的本地机器上跑。搞清楚几个关键数字,能让你在算力不足的情况下依然做出正确的战术选择。

5.1 用benchmark重新认识你的硬件

hashcat的 --benchmark 是每个破解者都应该先跑一遍的动作。它能告诉你当前设备在不同算法下的每秒破解速度,这个数字直接决定了你的破解策略。

  1. # 跑NTLM和SHA-512crypt两类哈希的基准
  2. hashcat -b -m 1000
  3. 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考试里的回报率极高。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行天