在针对微软的活动目录域环境进行应急响应时,如果我们确认攻击者已经获得了域管理员权限,那我们首要的工作之一就是对特权帐户的密码进行重置,包括所有域管理员以及krbtgt帐户。
因为在攻击者获得域管理员权限后,可以利用活动目录的特性,通过多种方式实现权限维持,包括Golden Tickets,添加dcsync权限,silver ticket,DSRM等。如果前期没有针对性地开启相关的审计策略,在应急响应过程是很难在短时间内排查出所有后门的。但是当我们重置特权帐户的密码后,多数后门将会无法使用,除非攻击者使用相同的路径再进行一次攻击。
下面我们将介绍如何批量修改域管理员密码以及krbtgt帐户密码。
重置域管理员密码比较简单,我们可以在命令行通过net user命令修改用户密码,但是对于大型活动目录环境,可能有多个域管理员,使用net user命令一个一个重置会比较耗时,而且密码信息可能会被记录在日志里面。
此时我们可以使用Active Directory PowerShell Module(域控默认安装)的Set-ADAccountPassword命令批量重置。
首先获取域管理员列表:
Get-ADGroupMember -Identity "Domain Admins" -Recursive |select SamAccountNam
然后针对每个用户,生成不同的强口令,并保存为csv格式:
SamAccountName,NewPassword
Administrator,0bB5iG(u9i
hkusr,v0R9/ZKZQ
最后,使用Set-ADAccountPassword重置密码:
Import-Csv .DA.csv -Delimiter "," | Foreach {
$NewPassword = ConvertTo-SecureString -AsPlainText $_.NewPassword -Force
Set-ADAccountPassword -Identity $_.SamAccountName -NewPassword $NewPassword -Reset -PassThru | Set-ADUser -ChangePasswordAtLogon $false
}
查看结果,可以看到密码成功修改:
krbtgt帐户的密码每年应该至少修改两次,ANSSI建议40天修改一次,微软建议180天修改一次。
我们可以使用Get-ADUser查看krbtgt帐户密码的最近修改时间:
Get-ADUser "krbtgt" -Property Created, PasswordLastSet
krbtgt的密码需要修改两次来移除密码历史。为了避免服务中断,可以先修改一次,然后等待复制(replication) 完成,一般为10小时,然后再修改一次(10 hours are the default Maximum lifetime for user ticket and Maximum lifetime for service ticket policy settings)。因为krbtgt会使用先前和当前的密码校验kerberos票据。
但是如果怀疑活动目录环境被入侵,我们可以快速地连续两次更改密码,以使客户端(包括应用服务)重新进行认证,但此时需要重启使用kerberos认证的应用服务器(至少需要重启应用),因此需要考虑对业务连续性的影响。
下面我们介绍使用PowerShell脚本来修改krbtgt帐户的密码:
https://github.com/zjorz/Public-AD-Scripts/blob/master/Reset-KrbTgt-Password-For-RWDCs-And-RODCs.ps1
这个脚本有多个模式,这里我们只使用5和6:
-
5 - Simulation Mode | Use KrbTgt PROD/REAL Accounts - No Password Reset/WhatIf Mode!
-
6 - Real Reset Mode | Use KrbTgt PROD/REAL Accounts - Password Will Be Reset Once!
选项5不会修改任何东西,只会显示将会发生什么:
要实际修改密码,我们选择选项6,然后选择对应的域:
在第一次修改完成后,我们可以等10小时。如果是入侵场景,可立刻再次使用选项6修改一次:
最后,我们可能需要重启使用kerberos认证的应用服务或者应用服务器。
除了使用上面的脚本,也可以使用ADUC(Active Directory Users and Computers)的图形界面进行修改。首先启用Advanced Features:
然后在Users容器下找到krbtgt帐户,右键选择Reset Password:
在输入新密码和确认密码后,点击ok。因为我们设置的密码不满足复杂度要求,系统将会自动重新创建一个。我们仍然需要在复制在所有域控之间完成后再次修改。
建议先使用上面的脚本通过选项5模拟修改,看是否满足修改条件,然后使用选项6进行修改,如果脚本报错,可以尝试使用低版本的脚本。
特权帐户密码重置只是活动目录域环境应急响应的一个步骤,在实际应急响应过程,我们还需要对组策略变更进行分析,通过各种日志还原攻击路径,对影响范围进行评估等。
对于应急响应,前期的准备至关重要。首先我们要通过各种准备工作,比如渗透测试,漏洞扫描等,避免安全事件的发生。但是如果安全事件发生,我们需要有对应的playbook以及标准流程对事件进行处理,而且需要有必要的数据源对影响范围进行评估以及对攻击路径进行还原。对于Windows环境,建议参考如下资源,提前开启相关的审计策略:
-
https://github.com/nsacyber/Event-Forwarding-Guidance/tree/master/Events
-
https://learn.microsoft.com/en-us/defender-for-identity/configure-windows-event-collection#configure-object-auditing
https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/manage/forest-recovery-guide/ad-forest-recovery-reset-the-krbtgt-password
https://github.com/zjorz/Public-AD-Scripts/blob/master/Reset-KrbTgt-Password-For-RWDCs-And-RODCs.ps1
https://learn.microsoft.com/en-us/answers/questions/87978/reset-krbtgt-password
原文始发于微信公众号(Desync InfoSec):域环境应急响应之特权帐户密码重置
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论