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
|
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
| 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 $_.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
|
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
| 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' } | 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
| 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
|
Import-Module ActiveDirectory
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)"
|
为什么要重置两次:
AD保留KRBTGT的当前密码和上一次密码(password history = 2)
第一次重置后,旧Hash仍然作为历史密码有效
第二次重置才能彻底废除攻击者持有的Hash
两次重置之间必须等待AD复制完成(所有DC同步)
建议间隔: 至少12小时,理想情况24小时
1 2 3 4 5 6 7
| $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
| kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-xxx /target:dc01.corp.local /service:CIFS /rc4:<服务账户NTLM Hash> /ptt
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
| Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters" -Name "ValidateKdcPacSignature" -ErrorAction SilentlyContinue
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
|
$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
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
|
Import-Module ActiveDirectory Get-ADUser -Filter {ServicePrincipalName -like "*"} -Properties ServicePrincipalName, PasswordLastSet | Select-Object Name, SamAccountName, PasswordLastSet, ServicePrincipalName | Format-Table -AutoSize
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
| lsadump::dcsync /domain:corp.local /user:Administrator lsadump::dcsync /domain:corp.local /user:krbtgt
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
|
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 { $_.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
| Import-Module ActiveDirectory $dcIPs = (Get-ADDomainController -Filter * | Select-Object -ExpandProperty IPv4Address)
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' $_.TimeCreated }
|
检查异常的复制权限授予
攻击者可能为普通账户添加DCSync权限作为后门:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Import-Module ActiveDirectory $domain = (Get-ADDomain).DistinguishedName $acl = Get-Acl "AD:\$domain"
$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
| Import-Module ActiveDirectory $domain = (Get-ADDomain).DistinguishedName $targetUser = "CORP\compromised_user"
$acl = Get-Acl "AD:\$domain"
$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
| 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
| 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
| $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
$maliciousIdentity = "CORP\backdoor_user" $acl.Access | Where-Object { $_.IdentityReference -eq $maliciousIdentity } | ForEach-Object { $acl.RemoveAccessRule($_) } Set-Acl $adminSDHolder $acl
|
七、域控日志分析要点
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'
|
执行步骤:
在PDC Emulator上执行第一次重置
等待复制到所有DC (repadmin /replsummary)
监控认证是否正常
等待12-24小时
执行第二次重置
再次等待复制并验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| repadmin /replsummary repadmin /showrepl
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持久化排查优先级
检查KRBTGT密码年龄 -> 是否需要重置
审计DCSync权限 -> 是否有非授权账户拥有复制权限
检查AdminSDHolder ACL -> 是否被植入后门权限
分析Kerberos日志 -> 是否存在Golden/Silver Ticket异常
检查域控LSASS -> 是否存在Skeleton Key
审计特权组成员 -> 是否有异常账户被添加
参见 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
$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" })
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
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
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-横向移动检测 进行全面分析