1. 1. Active Directory持久化排查 - Golden/Silver Ticket与高级AD攻击
  2. 2. 一、Kerberos认证基础(应急响应视角)
    1. 2.1. 1.1 Kerberos核心组件
    2. 2.2. 1.2 简化的Kerberos认证流程
    3. 2.3. 1.3 关键安全边界
  3. 3. 二、Golden Ticket (黄金票据)
    1. 3.1. 2.1 原理详解
    2. 3.2. 2.2 攻击前提条件
    3. 3.3. 2.3 攻击工具示例(Mimikatz)
    4. 3.4. 2.4 Golden Ticket检测方法
      1. 3.4.1. 检测方法1: Event 4769 异常分析
      2. 3.4.2. 检测方法2: TGT有效期异常
      3. 3.4.3. 检测方法3: 加密类型降级
      4. 3.4.4. 检测方法4: 域字段不匹配
      5. 3.4.5. 检测方法5: 不存在的用户使用票据
    5. 3.5. 2.5 Golden Ticket应急响应
  4. 4. 三、Silver Ticket (白银票据)
    1. 4.1. 3.1 原理详解
    2. 4.2. 3.2 攻击前提条件
    3. 4.3. 3.3 攻击示例(Mimikatz)
    4. 4.4. 3.4 Silver Ticket检测方法
      1. 4.4.1. 检测方法1: PAC验证
      2. 4.4.2. 检测方法2: 事件关联分析
      3. 4.4.3. 检测方法3: 加密类型异常
    5. 4.5. 3.5 Silver Ticket应急响应
  5. 5. 四、DCSync攻击
    1. 5.1. 4.1 原理详解
    2. 5.2. 4.2 攻击方式
    3. 5.3. 4.3 DCSync检测
      1. 5.3.1. 核心检测: Event 4662
      2. 5.3.2. 检测: 非DC发起的复制请求
      3. 5.3.3. 检查异常的复制权限授予
    4. 5.4. 4.4 DCSync应急响应
  6. 6. 五、Skeleton Key攻击
    1. 6.1. 5.1 原理详解
    2. 6.2. 5.2 攻击方式
    3. 6.3. 5.3 Skeleton Key检测
      1. 6.3.1. Event 4673 (特权服务调用)
      2. 6.3.2. Event 7045 (新服务安装)
      3. 6.3.3. LSASS内存分析
      4. 6.3.4. 网络层检测
    4. 6.4. 5.4 Skeleton Key应急响应
  7. 7. 六、AdminSDHolder持久化
    1. 7.1. 6.1 原理详解
    2. 7.2. 6.2 攻击示例
    3. 7.3. 6.3 AdminSDHolder检测
    4. 7.4. 6.4 AdminSDHolder应急响应
  8. 8. 七、域控日志分析要点
    1. 8.1. 7.1 关键安全事件ID
    2. 8.2. 7.2 高级审计策略配置
    3. 8.3. 7.3 KRBTGT密码重置操作规程
  9. 9. 八、MITRE ATT&CK映射
  10. 10. 九、综合排查流程
    1. 10.1. 9.1 AD持久化排查优先级
    2. 10.2. 9.2 快速排查脚本
  11. 11. 十、总结

Windows应急响应 - 28 AD持久化-Golden-Silver-Ticket

Active Directory持久化排查 - Golden/Silver Ticket与高级AD攻击

本篇聚焦Active Directory环境中的持久化技术,包括Golden Ticket、Silver Ticket、DCSync、Skeleton Key、AdminSDHolder等

AD持久化是最难检测和清除的持久化类型,攻击者一旦获得域控权限,可长期潜伏

相关参考: 05-账户安全排查, 15-横向移动检测

一、Kerberos认证基础(应急响应视角)

1.1 Kerberos核心组件

理解AD持久化攻击必须先理解Kerberos认证流程

KDC (Key Distribution Center): 密钥分发中心,运行在域控制器(DC)上

AS (Authentication Service): 认证服务,负责验证用户身份并颁发TGT

TGS (Ticket Granting Service): 票据授予服务,根据TGT颁发服务票据

TGT (Ticket Granting Ticket): 票据授予票据,用户身份证明,用KRBTGT密钥加密

Service Ticket (TGS Ticket): 服务票据,用于访问特定服务,用服务账户密钥加密

KRBTGT账户: 域中特殊内置账户,其密码Hash用于加密所有TGT

1.2 简化的Kerberos认证流程

步骤1: 用户 -> AS-REQ -> KDC (提交用户凭据)

步骤2: KDC -> AS-REP -> 用户 (返回TGT,用KRBTGT Hash加密)

步骤3: 用户 -> TGS-REQ -> KDC (提交TGT,请求访问某服务)

步骤4: KDC -> TGS-REP -> 用户 (返回Service Ticket,用服务账户Hash加密)

步骤5: 用户 -> AP-REQ -> 服务器 (提交Service Ticket)

步骤6: 服务器验证Service Ticket并授权访问

关键安全假设: 只有KDC知道KRBTGT的密码Hash,只有目标服务知道自己的Hash

1.3 关键安全边界

TGT安全性: 依赖于KRBTGT账户的Hash保密性

Service Ticket安全性: 依赖于服务账户的Hash保密性

如果KRBTGT Hash泄露 -> 攻击者可以伪造任意TGT -> Golden Ticket

如果服务账户Hash泄露 -> 攻击者可以伪造特定服务票据 -> Silver Ticket

PAC (Privilege Attribute Certificate): 包含在票据中的用户权限信息,包含组成员、SID等

二、Golden Ticket (黄金票据)

2.1 原理详解

Golden Ticket = 使用KRBTGT Hash伪造的TGT

攻击者获得KRBTGT账户的NTLM Hash后,可以为任意用户(包括不存在的用户)伪造TGT

伪造的TGT包含任意权限声明(如Domain Admins组成员)

KDC无法区分伪造TGT和合法TGT,因为加密密钥相同

有效期可设为任意值(攻击者通常设为10年)

即使用户密码被重置,Golden Ticket仍然有效(因为不依赖用户密码)

2.2 攻击前提条件

攻击者需要以下信息:

KRBTGT账户的NTLM Hash (最关键)

域名 (Domain Name)

域SID (Domain SID)

要伪造的用户名 (通常伪造为域管理员)

获取KRBTGT Hash的方式:

DCSync攻击 (见后文)

域控上的ntds.dit提取

域控内存中的LSASS dump

2.3 攻击工具示例(Mimikatz)

使用Mimikatz生成Golden Ticket(用于理解检测逻辑):

1
2
3
4
5
6
7
8
9
10
11
12
# Mimikatz生成Golden Ticket
kerberos::golden /user:Administrator /domain:corp.example.com /sid:S-1-5-21-1234567890-1234567890-1234567890 /krbtgt:aabbccdd11223344aabbccdd11223344 /ticket:golden.kirbi

# 参数说明:
# /user - 要伪造的用户名
# /domain - 域名
# /sid - 域SID
# /krbtgt - KRBTGT账户的NTLM Hash
# /ticket - 输出票据文件
# /ptt - Pass The Ticket (直接注入内存)
# /id - 用户RID (默认500=Administrator)
# /groups - 组RID (默认512,513,518,519,520=特权组)

常见变体参数:

1
2
3
4
5
# 设置超长有效期
kerberos::golden /user:fakeadmin /domain:corp.local /sid:S-1-5-21-xxx /krbtgt:hash /ticket:golden.kirbi /endin:525600 /renewmax:525600

# /endin:525600 = 有效期365天(分钟)
# /renewmax:525600 = 续期最大365天

2.4 Golden Ticket检测方法

检测方法1: Event 4769 异常分析

Event 4769 (A Kerberos service ticket was requested) 包含关键信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查询4769事件中的异常
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4769
} -MaxEvents 10000 | ForEach-Object {
$xml = [xml]$_.ToXml()
$data = $xml.Event.EventData.Data
[PSCustomObject]@{
Time = $_.TimeCreated
TargetUserName = ($data | Where-Object Name -eq 'TargetUserName').'#text'
ServiceName = ($data | Where-Object Name -eq 'ServiceName').'#text'
TicketOptions = ($data | Where-Object Name -eq 'TicketOptions').'#text'
TicketEncType = ($data | Where-Object Name -eq 'TicketEncryptionType').'#text'
IpAddress = ($data | Where-Object Name -eq 'IpAddress').'#text'
}
} | Where-Object {
# 检测可疑指标
$_.TicketEncType -eq '0x17' -or # RC4加密(降级攻击)
$_.TargetUserName -match 'fakeadmin|goldenticket' # 可疑用户名
} | Format-Table -AutoSize

检测方法2: TGT有效期异常

正常TGT有效期为10小时(域默认策略)

Golden Ticket通常设置超长有效期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 检查Event 4768 (TGT请求) 和 4769 的时间差异
# 如果TGS请求的TGT已过期超过10小时 -> 可疑
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4768
} -MaxEvents 5000 | ForEach-Object {
$xml = [xml]$_.ToXml()
$data = $xml.Event.EventData.Data
[PSCustomObject]@{
Time = $_.TimeCreated
UserName = ($data | Where-Object Name -eq 'TargetUserName').'#text'
Status = ($data | Where-Object Name -eq 'Status').'#text'
EncType = ($data | Where-Object Name -eq 'TicketEncryptionType').'#text'
PreAuthType = ($data | Where-Object Name -eq 'PreAuthType').'#text'
}
} | Format-Table -AutoSize

检测方法3: 加密类型降级

Golden Ticket常使用RC4加密(类型0x17),而现代AD默认使用AES-256(类型0x12)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检测使用RC4加密的票据请求(可能是Golden/Silver Ticket)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4769
} -MaxEvents 10000 | Where-Object {
$xml = [xml]$_.ToXml()
$encType = ($xml.Event.EventData.Data | Where-Object Name -eq 'TicketEncryptionType').'#text'
$encType -eq '0x17' # RC4-HMAC
} | Select-Object TimeCreated, @{
N = 'User'; E = {
$xml = [xml]$_.ToXml()
($xml.Event.EventData.Data | Where-Object Name -eq 'TargetUserName').'#text'
}
} | Format-Table -AutoSize

检测方法4: 域字段不匹配

Golden Ticket中的域信息可能与实际域不完全匹配(大小写等)

检查TGT请求中域名的大小写是否与域配置一致

检测方法5: 不存在的用户使用票据

如果攻击者使用不存在的用户名生成Golden Ticket:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 提取4769中的用户名,与AD用户列表对比
Import-Module ActiveDirectory
$adUsers = (Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName)

Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4769
} -MaxEvents 10000 | ForEach-Object {
$xml = [xml]$_.ToXml()
($xml.Event.EventData.Data | Where-Object Name -eq 'TargetUserName').'#text'
} | Sort-Object -Unique | Where-Object {
$_ -notin $adUsers -and $_ -notmatch '\$$' # 排除机器账户
} | ForEach-Object {
Write-Host "[ALERT] 票据请求来自未知用户: $_" -ForegroundColor Red
}

2.5 Golden Ticket应急响应

最关键操作: 重置KRBTGT密码两次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重置KRBTGT密码(必须在域控上执行)
# 第一次重置
Import-Module ActiveDirectory

# 查看KRBTGT当前状态
Get-ADUser krbtgt -Properties PasswordLastSet, Created

# 生成随机密码并重置
$newPwd = [System.Web.Security.Membership]::GeneratePassword(32, 8)
Set-ADAccountPassword -Identity krbtgt -Reset -NewPassword (ConvertTo-SecureString $newPwd -AsPlainText -Force)
Write-Host "KRBTGT第一次密码重置完成: $(Get-Date)"

# 等待复制完成(至少等待域复制周期 + 最大票据生命周期)
# 通常建议等待12-24小时

为什么要重置两次:

AD保留KRBTGT的当前密码和上一次密码(password history = 2)

第一次重置后,旧Hash仍然作为历史密码有效

第二次重置才能彻底废除攻击者持有的Hash

两次重置之间必须等待AD复制完成(所有DC同步)

建议间隔: 至少12小时,理想情况24小时

1
2
3
4
5
6
7
# 第二次重置(间隔12-24小时后)
$newPwd2 = [System.Web.Security.Membership]::GeneratePassword(32, 8)
Set-ADAccountPassword -Identity krbtgt -Reset -NewPassword (ConvertTo-SecureString $newPwd2 -AsPlainText -Force)
Write-Host "KRBTGT第二次密码重置完成: $(Get-Date)"

# 验证
Get-ADUser krbtgt -Properties PasswordLastSet | Select-Object Name, PasswordLastSet

注意: 重置KRBTGT会导致所有现有TGT失效,所有用户需要重新认证,会造成短暂的服务中断

三、Silver Ticket (白银票据)

3.1 原理详解

Silver Ticket = 使用服务账户Hash伪造的Service Ticket (TGS)

与Golden Ticket的区别:

Golden Ticket伪造TGT,可以请求任何服务 -> 全域通行

Silver Ticket伪造特定服务的TGS -> 只能访问目标服务

Silver Ticket不与KDC交互 -> 域控上不产生日志 -> 更难检测

3.2 攻击前提条件

目标服务账户的NTLM Hash或AES密钥

域名和域SID

目标服务的SPN (Service Principal Name)

常见攻击目标:

服务 SPN示例 利用方式
CIFS (文件共享) CIFS/dc01.corp.local 访问DC的C$共享
LDAP LDAP/dc01.corp.local 执行DCSync
HOST HOST/dc01.corp.local 执行PsExec等
HTTP (WinRM) HTTP/dc01.corp.local 远程PowerShell
MSSQL MSSQLSvc/sql01.corp.local:1433 数据库访问

3.3 攻击示例(Mimikatz)

伪造CIFS服务票据(理解检测逻辑):

1
2
3
4
5
# 伪造Silver Ticket - CIFS服务
kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-xxx /target:dc01.corp.local /service:CIFS /rc4:<服务账户NTLM Hash> /ptt

# 伪造Silver Ticket - LDAP服务(用于DCSync)
kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-xxx /target:dc01.corp.local /service:LDAP /rc4:<DC机器账户Hash> /ptt

3.4 Silver Ticket检测方法

Silver Ticket检测难度远高于Golden Ticket,因为不经过KDC

检测方法1: PAC验证

启用PAC验证可以让目标服务向KDC确认票据的合法性

但这会增加域控负载,默认未启用

1
2
3
4
5
# 检查PAC验证设置
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters" -Name "ValidateKdcPacSignature" -ErrorAction SilentlyContinue

# 启用PAC验证(注意性能影响)
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters" -Name "ValidateKdcPacSignature" -Value 1 -Type DWord

检测方法2: 事件关联分析

正常流程: 4768 (TGT请求) -> 4769 (TGS请求) -> 服务访问

Silver Ticket: 直接出现服务访问,没有对应的4768和4769

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查找有服务访问日志但没有对应TGT/TGS请求的情况
# 需要关联分析Security日志
$tgtUsers = Get-WinEvent -FilterHashtable @{
LogName = 'Security'; Id = 4768
} -MaxEvents 10000 | ForEach-Object {
$xml = [xml]$_.ToXml()
($xml.Event.EventData.Data | Where-Object Name -eq 'TargetUserName').'#text'
} | Sort-Object -Unique

# 对比4624登录事件中使用Kerberos的用户
Get-WinEvent -FilterHashtable @{
LogName = 'Security'; Id = 4624
} -MaxEvents 10000 | Where-Object {
$xml = [xml]$_.ToXml()
$authPkg = ($xml.Event.EventData.Data | Where-Object Name -eq 'AuthenticationPackageName').'#text'
$authPkg -eq 'Kerberos'
} | ForEach-Object {
$xml = [xml]$_.ToXml()
($xml.Event.EventData.Data | Where-Object Name -eq 'TargetUserName').'#text'
} | Sort-Object -Unique | Where-Object {
$_ -notin $tgtUsers
} | ForEach-Object {
Write-Host "[ALERT] Kerberos登录但无TGT请求: $_" -ForegroundColor Red
}

检测方法3: 加密类型异常

与Golden Ticket类似,Silver Ticket也常使用RC4降级

在目标服务器的安全日志中检查登录事件的加密类型

3.5 Silver Ticket应急响应

重置受影响的服务账户密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查找并重置受影响的服务账户
# 1. 列出所有SPN对应的账户
Import-Module ActiveDirectory
Get-ADUser -Filter {ServicePrincipalName -like "*"} -Properties ServicePrincipalName, PasswordLastSet |
Select-Object Name, SamAccountName, PasswordLastSet, ServicePrincipalName |
Format-Table -AutoSize

# 2. 重置特定服务账户密码
Set-ADAccountPassword -Identity "svc_target" -Reset -NewPassword (
ConvertTo-SecureString (
[System.Web.Security.Membership]::GeneratePassword(32, 8)
) -AsPlainText -Force
)

对于机器账户,重置计算机账户密码:

1
2
# 在目标机器上重置计算机账户密码
Reset-ComputerMachinePassword -Server dc01.corp.local

四、DCSync攻击

4.1 原理详解

DCSync利用AD域复制协议(MS-DRSR)从域控中提取任意用户的Hash

攻击者模拟域控制器,向真正的DC请求密码数据复制

需要的权限: Replicating Directory Changes + Replicating Directory Changes All

默认拥有这些权限的: Domain Admins, Enterprise Admins, DC计算机账户

4.2 攻击方式

使用Mimikatz执行DCSync:

1
2
3
4
5
6
# 提取特定用户Hash
lsadump::dcsync /domain:corp.local /user:Administrator
lsadump::dcsync /domain:corp.local /user:krbtgt

# 导出所有用户Hash
lsadump::dcsync /domain:corp.local /all /csv

使用Impacket的secretsdump.py:

1
secretsdump.py corp.local/admin:password@dc01.corp.local -just-dc-ntlm

4.3 DCSync检测

核心检测: Event 4662

4662事件记录了目录服务对象的操作

关键: 检查非DC机器发起的Replicating Directory Changes请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 检测DCSync - 查找4662事件中的目录复制操作
# GUID for DS-Replication-Get-Changes: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
# GUID for DS-Replication-Get-Changes-All: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2

Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4662
} -MaxEvents 50000 | Where-Object {
$_.Message -match '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2|1131f6ad-9c07-11d1-f79f-00c04fc2dcd2'
} | ForEach-Object {
$xml = [xml]$_.ToXml()
$data = $xml.Event.EventData.Data
[PSCustomObject]@{
Time = $_.TimeCreated
Account = ($data | Where-Object Name -eq 'SubjectUserName').'#text'
Domain = ($data | Where-Object Name -eq 'SubjectDomainName').'#text'
Object = ($data | Where-Object Name -eq 'ObjectName').'#text'
Operation = ($data | Where-Object Name -eq 'OperationType').'#text'
}
} | Where-Object {
# 排除合法的DC机器账户
$_.Account -notmatch 'DC\d+\$|MSOL_'
} | Format-Table -AutoSize

检测: 非DC发起的复制请求

检查发起复制请求的源IP是否为已知DC:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 获取所有DC的IP地址
Import-Module ActiveDirectory
$dcIPs = (Get-ADDomainController -Filter * | Select-Object -ExpandProperty IPv4Address)

# 检查4662事件的源IP
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4662
} -MaxEvents 50000 | Where-Object {
$_.Message -match '1131f6a'
} | ForEach-Object {
$xml = [xml]$_.ToXml()
$ip = ($xml.Event.EventData.Data | Where-Object Name -eq 'SubjectLogonId').'#text'
# 关联4624事件获取源IP
$_.TimeCreated
}

检查异常的复制权限授予

攻击者可能为普通账户添加DCSync权限作为后门:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 检查谁拥有Replicating Directory Changes权限
Import-Module ActiveDirectory
$domain = (Get-ADDomain).DistinguishedName
$acl = Get-Acl "AD:\$domain"

# DS-Replication-Get-Changes GUID
$replChangeGuid = [GUID]"1131f6aa-9c07-11d1-f79f-00c04fc2dcd2"
$replChangeAllGuid = [GUID]"1131f6ad-9c07-11d1-f79f-00c04fc2dcd2"

$acl.Access | Where-Object {
$_.ObjectType -eq $replChangeGuid -or $_.ObjectType -eq $replChangeAllGuid
} | Select-Object IdentityReference, ActiveDirectoryRights, ObjectType, AccessControlType |
Format-Table -AutoSize

4.4 DCSync应急响应

移除非授权账户的复制权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 移除恶意账户的DCSync权限
Import-Module ActiveDirectory
$domain = (Get-ADDomain).DistinguishedName
$targetUser = "CORP\compromised_user"

# 获取当前ACL
$acl = Get-Acl "AD:\$domain"

# 移除Replicating Directory Changes权限
$acl.Access | Where-Object {
$_.IdentityReference -eq $targetUser
} | ForEach-Object {
$acl.RemoveAccessRule($_)
}
Set-Acl "AD:\$domain" $acl

发现DCSync后,必须假设所有域Hash已泄露 -> 全域密码重置

五、Skeleton Key攻击

5.1 原理详解

Skeleton Key通过在域控的LSASS进程内存中注入补丁

注入后,所有用户可以使用万能密码(如”mimikatz”)登录,同时原密码仍然有效

不修改AD数据库,仅修改内存 -> 域控重启后失效

需要在每个域控上分别注入

5.2 攻击方式

Mimikatz执行Skeleton Key注入:

1
2
3
4
5
6
# 在域控上运行
privilege::debug
misc::skeleton

# 注入后,所有账户可用"mimikatz"作为密码登录
# 原密码仍然有效

特点:

仅存在于内存中,重启即消失

攻击者通常结合其他持久化保证重启后可重新注入

不在AD数据库中留下痕迹

5.3 Skeleton Key检测

Event 4673 (特权服务调用)

Skeleton Key注入需要SeDebugPrivilege权限:

1
2
3
4
5
6
7
8
9
10
11
12
# 检测可疑的特权使用
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4673
} -MaxEvents 10000 | Where-Object {
$_.Message -match 'SeDebugPrivilege'
} | Select-Object TimeCreated, @{
N = 'Account'; E = {
$xml = [xml]$_.ToXml()
($xml.Event.EventData.Data | Where-Object Name -eq 'SubjectUserName').'#text'
}
} | Format-Table -AutoSize

Event 7045 (新服务安装)

Mimikatz可能通过服务方式部署:

1
2
3
4
5
6
7
8
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 7045
} -MaxEvents 500 | Select-Object TimeCreated, @{
N = 'ServiceName'; E = { $_.Properties[0].Value }
}, @{
N = 'ImagePath'; E = { $_.Properties[1].Value }
} | Format-Table -AutoSize

LSASS内存分析

使用Procdump或Task Manager导出LSASS内存进行分析:

1
2
:: 导出LSASS内存用于分析
procdump.exe -ma lsass.exe C:\IR\lsass.dmp

检查LSASS加载的模块:

1
2
3
4
# 列出LSASS进程加载的DLL
Get-Process lsass | Select-Object -ExpandProperty Modules |
Select-Object ModuleName, FileName, Size |
Sort-Object ModuleName | Format-Table -AutoSize

网络层检测

Skeleton Key导致认证降级,Kerberos可能使用RC4而非AES

监控异常的加密类型降级

5.4 Skeleton Key应急响应

重启所有域控制器(清除内存中的Skeleton Key)

检查是否有其他持久化机制保证重启后重新注入

全域密码重置(攻击者可能已用万能密码收集信息)

六、AdminSDHolder持久化

6.1 原理详解

AdminSDHolder是AD中一个特殊容器对象,位于CN=AdminSDHolder,CN=System,DC=domain,DC=com

SDProp (Security Descriptor Propagation) 进程每60分钟运行一次

SDProp将AdminSDHolder的ACL复制到所有受保护的特权对象上

受保护的对象包括: Domain Admins, Enterprise Admins, Schema Admins, Administrators等组及其成员

攻击方式: 修改AdminSDHolder的ACL,添加攻击者控制的账户的权限

SDProp会自动将这些权限传播到所有特权组 -> 即使管理员移除了权限,60分钟后又会恢复

6.2 攻击示例

向AdminSDHolder添加后门权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 攻击者向AdminSDHolder添加GenericAll权限(攻击视角)
Import-Module ActiveDirectory
$adminSDHolder = "AD:\CN=AdminSDHolder,CN=System," + (Get-ADDomain).DistinguishedName
$acl = Get-Acl $adminSDHolder

# 添加攻击者账户的完全控制权限
$identity = New-Object System.Security.Principal.NTAccount("CORP\backdoor_user")
$rule = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
$identity,
"GenericAll",
"Allow"
)
$acl.AddAccessRule($rule)
Set-Acl $adminSDHolder $acl

6.3 AdminSDHolder检测

审计AdminSDHolder的ACL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Import-Module ActiveDirectory
$adminSDHolder = "AD:\CN=AdminSDHolder,CN=System," + (Get-ADDomain).DistinguishedName
$acl = Get-Acl $adminSDHolder

Write-Host "=== AdminSDHolder ACL ===" -ForegroundColor Cyan
$acl.Access | ForEach-Object {
[PSCustomObject]@{
Identity = $_.IdentityReference.Value
Rights = $_.ActiveDirectoryRights
Type = $_.AccessControlType
Inherited = $_.IsInherited
}
} | Format-Table -AutoSize

# 标记可疑权限
$acl.Access | Where-Object {
$_.IdentityReference -notmatch 'Domain Admins|Enterprise Admins|Administrators|SYSTEM|Account Operators|Backup Operators|Print Operators|Server Operators|Replicator'
} | ForEach-Object {
Write-Host "[ALERT] 可疑AdminSDHolder权限: $($_.IdentityReference) - $($_.ActiveDirectoryRights)" -ForegroundColor Red
}

检查SDProp运行频率是否被修改:

1
2
3
4
5
6
7
8
# SDProp默认每60分钟运行,检查是否被修改
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters"
$interval = Get-ItemProperty $regPath -Name "AdminSDProtectFrequency" -ErrorAction SilentlyContinue
if ($interval) {
Write-Host "SDProp频率已修改为: $($interval.AdminSDProtectFrequency) 秒" -ForegroundColor Yellow
} else {
Write-Host "SDProp使用默认频率(3600秒/60分钟)" -ForegroundColor Green
}

6.4 AdminSDHolder应急响应

移除AdminSDHolder上的恶意ACE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Import-Module ActiveDirectory
$adminSDHolder = "AD:\CN=AdminSDHolder,CN=System," + (Get-ADDomain).DistinguishedName
$acl = Get-Acl $adminSDHolder

# 移除指定账户的所有ACE
$maliciousIdentity = "CORP\backdoor_user"
$acl.Access | Where-Object {
$_.IdentityReference -eq $maliciousIdentity
} | ForEach-Object {
$acl.RemoveAccessRule($_)
}
Set-Acl $adminSDHolder $acl

# 手动触发SDProp传播(可选)
# 在DC上运行:
# Invoke-Expression "repadmin /runreplchecks"

七、域控日志分析要点

7.1 关键安全事件ID

事件ID 说明 关注点
4768 TGT请求 (AS-REQ) 加密类型降级、异常用户
4769 TGS请求 异常服务、加密降级、超长有效期
4770 TGT续期 异常续期请求
4771 Kerberos预认证失败 暴力破解
4662 目录服务操作 DCSync检测(复制GUID)
4673 特权服务调用 SeDebugPrivilege使用
4724/4726 密码重置/账户删除 异常账户操作
4738 用户账户修改 权限变更
4756 成员添加到安全组 特权组成员变更
5136 目录服务对象修改 ACL变更(AdminSDHolder)

7.2 高级审计策略配置

确保以下审计策略已启用:

1
2
3
4
5
6
7
8
:: 查看当前审计策略
auditpol /get /category:*

:: 启用关键审计
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
auditpol /set /subcategory:"Directory Service Access" /success:enable /failure:enable
auditpol /set /subcategory:"Directory Service Changes" /success:enable /failure:enable

7.3 KRBTGT密码重置操作规程

重置前准备:

确认所有DC正常运行且复制正常

通知业务团队(会导致短暂认证中断)

记录当前KRBTGT密码最后设置时间

1
2
Get-ADUser krbtgt -Properties PasswordLastSet, msDS-KeyVersionNumber |
Select-Object Name, PasswordLastSet, 'msDS-KeyVersionNumber'

执行步骤:

  1. 在PDC Emulator上执行第一次重置

  2. 等待复制到所有DC (repadmin /replsummary)

  3. 监控认证是否正常

  4. 等待12-24小时

  5. 执行第二次重置

  6. 再次等待复制并验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检查AD复制状态
repadmin /replsummary
repadmin /showrepl

# 验证所有DC上的KRBTGT密码版本一致
Get-ADDomainController -Filter * | ForEach-Object {
$dc = $_.HostName
$krbtgt = Get-ADUser krbtgt -Server $dc -Properties 'msDS-KeyVersionNumber', PasswordLastSet
[PSCustomObject]@{
DC = $dc
KeyVersion = $krbtgt.'msDS-KeyVersionNumber'
PasswordLastSet = $krbtgt.PasswordLastSet
}
} | Format-Table -AutoSize

八、MITRE ATT&CK映射

技术ID 名称 说明
T1558.001 Steal or Forge Kerberos Tickets: Golden Ticket KRBTGT Hash伪造TGT
T1558.002 Steal or Forge Kerberos Tickets: Silver Ticket 服务Hash伪造TGS
T1003.006 OS Credential Dumping: DCSync 目录复制协议提取Hash
T1556.001 Modify Authentication Process: Domain Controller Skeleton Key内存注入
T1098 Account Manipulation AdminSDHolder ACL修改
T1484.001 Domain Policy Modification: Group Policy GPO持久化

这些技术均属于高级持久化手段,通常出现在APT攻击的后渗透阶段

九、综合排查流程

9.1 AD持久化排查优先级

  1. 检查KRBTGT密码年龄 -> 是否需要重置

  2. 审计DCSync权限 -> 是否有非授权账户拥有复制权限

  3. 检查AdminSDHolder ACL -> 是否被植入后门权限

  4. 分析Kerberos日志 -> 是否存在Golden/Silver Ticket异常

  5. 检查域控LSASS -> 是否存在Skeleton Key

  6. 审计特权组成员 -> 是否有异常账户被添加

参见 05-账户安全排查 进行账户层面的深入排查

9.2 快速排查脚本

一键执行AD持久化检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Import-Module ActiveDirectory
Write-Host "===== AD持久化快速排查 =====" -ForegroundColor Cyan

# 1. KRBTGT密码年龄
$krbtgt = Get-ADUser krbtgt -Properties PasswordLastSet
$age = (Get-Date) - $krbtgt.PasswordLastSet
Write-Host "`n[1] KRBTGT密码年龄: $($age.Days) 天" -ForegroundColor $(if ($age.Days -gt 180) { "Red" } else { "Green" })

# 2. DCSync权限检查
Write-Host "`n[2] DCSync权限持有者:" -ForegroundColor Yellow
$domain = (Get-ADDomain).DistinguishedName
$acl = Get-Acl "AD:\$domain"
$acl.Access | Where-Object {
$_.ObjectType -in @(
[GUID]"1131f6aa-9c07-11d1-f79f-00c04fc2dcd2",
[GUID]"1131f6ad-9c07-11d1-f79f-00c04fc2dcd2"
)
} | Select-Object IdentityReference | Format-Table

# 3. AdminSDHolder可疑ACE
Write-Host "[3] AdminSDHolder非默认权限:" -ForegroundColor Yellow
$adminSD = "AD:\CN=AdminSDHolder,CN=System,$domain"
(Get-Acl $adminSD).Access | Where-Object {
$_.IdentityReference -notmatch 'Domain Admins|Enterprise Admins|Administrators|SYSTEM|Account Operators|Backup Operators'
} | Select-Object IdentityReference, ActiveDirectoryRights | Format-Table

# 4. 特权组异常成员
Write-Host "[4] Domain Admins成员:" -ForegroundColor Yellow
Get-ADGroupMember "Domain Admins" -Recursive | Select-Object Name, SamAccountName | Format-Table

Write-Host "===== 排查完成 =====" -ForegroundColor Cyan

十、总结

AD持久化是企业安全中最严重的威胁之一,关键要点:

Golden Ticket: 检测加密降级、票据有效期异常,响应需重置KRBTGT两次

Silver Ticket: 极难检测(不经过KDC),需启用PAC验证和事件关联

DCSync: 检测4662事件中的复制GUID,审计复制权限

Skeleton Key: 内存驻留,重启清除,检测SeDebugPrivilege使用

AdminSDHolder: 每60分钟自动传播,需审计ACL

完整的AD取证需要结合 05-账户安全排查15-横向移动检测 进行全面分析


上一章 目录 下一章
27-辅助功能后门 Windows应急响应 29-PrintSpooler与Bitsadmin后门