1.背景介绍
本文主要是对域环境下的权限维持手法进行攻击检测以及清理,攻击的方法不着重描述,检测的方法只针对终端日志(windows,sysmon),权限维持的手法也只涉及域环境独有的,像普通终端也存在的启动项计划任务服务等不考虑在内,利用漏洞的也直接排除了直接打补丁就好了。
2.域持久化
1.黄金票据
黄金票据(Golden Ticket):它能在拥有普通域用户权限和krbtgt hash的情况下,获取域管理员权限。krbtgt账户:每个域控制器都有一个”krbtgt”的用户账户,是KDC的服务账户,用来创建票据授予服务(TGS)加密的密钥。
图中我伪造了一个名为ceshi的账户,这里其实任何账户都行域里不存在账户也可以随便伪造(微软的MS-KILE解释:Kerberos V5不提供对TGS请求的帐户撤销检查,只要TGT有效,即使该帐户已被删除,TGT更新和服务票据也可以发布。KILE提供了一个可以将利用时间限制在较短的时间内(20分内)。当TGT大于20分钟时,KILE KDC需要在域中检查账户。
)
windows4624记录了安全IDadministrator在10.43.120.26地址登陆,并且账户名与安全ID(500代表了域管账号)并不一致,安全ID其实就是SID,事件查看器会自动尝试解析 SID 并显示帐户名。 如果无法解析 SID,将在事件中看到源数据,正常来说账户名应该与安全ID对应,这里很明显ceshi账户是伪造的,但是攻击者只要伪造administrator名字来伪造票据就可以躲过了,但是administrator在非常用的IP地址段出现就是异常的了这里也可以检测一下。黄金票据攻击在终端日志侧不是很明显的能够检测,很难区分他是不是正常的,正常来说认证访服务的流程是先4768(TGT)-4769(TGS)-4624(logon),但是黄金票据攻击的话只会有4769-4624,因为TGT已经离线生成了。但是kerberos票据的有效期一般是4个小时(特殊组的用户)或者是10个小时,也就是说TGT在之前申请过了就可以保留4-10个小时之间那么这个时间触发攻击还是只有4769-4624,最好还是流量检测黄金票据攻击。
如果通过告警已经确定了攻击者已经拿下了域控那么肯定会导出所有账号密码,黄金票据是肯定是存在的,这个时候就需要修改krbtgt账号的密码了,需要修改两次。(Active Directory中对定期迭代的帐户防止密码重用,默认密码策略被设置为记住24个历史密码,而且至少也要迭代一次保存于电脑帐户。即使密码已更新,也会继续使用前面的密码散列进行身份验证),如果不是很紧急的话最好不要连续修改2次密码,这样会引起域内工作不正常,最好是10个小时以后再修改第二次krbtgt的密码。官方有专门的重置密码的脚本https://github.com/microsoft/New-KrbtgtKeys.ps1,建议使用官方脚本进行重置,并且定期重置一次。
2.DCSYNC维持权限
DCSync是mimikatz的一个功能,能够模拟域控制器并从域控制器导出帐户密码hash,如果我们在域内一台主机上获得了域管理员权限,可以使用如下命令直接导出域内所有用户的hash:默认情况下,只有Domain Controllers和Enterprise Domain Admins权限能够使用DCSync但我们可以对域内普通用户添加如下两条ACL实现普通用户调用DCSync导出域内所有用户的hash
DS-Replication-GetChanges(GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)和DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
可以使用powerview添加ACL:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
我这里给win10用户添加了dcsync的权限,这样我在win10机器上也可以导出域内用户hash
从windows日志4662可以清楚的看到DS-Replication-GetChanges(GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)和DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)在win10终端与域控上都产生了两条特殊的acl被添加的信息
使用zbang工具可以检测当前域环境是否已遭受dcsync攻击,还有一些工具也可以检测后面会提到
可以使用powerview脚本来清除acl
Remove-DomainObjectAcl -TargetIdentity “DC=wlaq,DC=com” -PrincipalIdentity win10 -Rights DCSync
3.白银票据
白银票据就是伪造服务票据,为了创建或伪造白银票据,攻击者需要获得目标服务账号的密码hash值,并且此攻击与域控制器没有AS-REQ 和 AS-REP通信,也没有TGS-REQ / TGS-REP通信。任何事件日志都在目标服务器上
我这里伪造了一个叫(win7-win10)的用户去访问win10机器的cifs服务
攻击发生后可以在目标机器看到4624日志这里的异常点就是IP地址是否是常用地址以及用户名是否是存在的域账户,以及用户名是否是管理员账户(SID500是系统管理员的用户帐户。 每台计算机都有一个本地管理员帐户,每个域都有一个域管理员帐户)
这里我伪造了一个(win7-yukong)的用户去访问域控的cifs服务
可以看到利用白银票据同样可以攻击域控同时与黄金票据攻击在终端上产生的可以检测的日志信息是一样都是4624事件
检测白银票据比检测黄金票据更加困难流量特征也是存在误报的,如果目标机器不是域控那么也不会再域控机器产生任何日志来帮忙我们进行检测。从windows日志维度来看检测方法主要还是看4624的登陆IP地址是否异常登陆用户是否是真实存在的用户,用户是否跟sid能够匹配来检测。虽然这一步攻击很难检测但是攻击者入侵机器后肯定有后续的攻击行为我们根本后续的攻击行为来判断是否失陷。
银票攻击一般使用的是机器账户的hash,默认情况下加入域的计算机机器帐户密码每30次自动更新一次,机器账户的密码也存在域控的数据库中,并且他跟krbtgt账户类似一旦攻击者窃取了密码,那么我们需要修改两次才能防止攻击者再次利用,不然他的上一次的密码hash同样有效。这30天也可以改成永久不修改密码的。只需要把下面注册表的值改为1就行了HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\ Parameters\DisablePasswordChange。这个注册表键值的修改也是需要作为检测规则日常监控的,这是白银票据维持更长时间持久化的方式。
如果发现某个机器账户已经被窃取了,可以使用powershell脚本重置2次密码https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/reset-computermachinepassword?view=powershell-5.1。如果域控的机器账户hash被窃取并且被用于白银票据,我们重置域控的机器账户的话需要使用netdom命令来重置密码不然会影响域正常工作。
4.Skeleton Key
Skeleton Key与Golden Ticket后门均不需要域控重启即能立即生效。Skeleton Key一般在64位的域控服务器上使用,支持Windows Server2003到Windows Server2012 R2(对于Server 2012 R2以上系统版本,需要mimidrv.sys文件),能够让所有域用户使用同一个万能密码(默认是mimikatz)进行登录,现有的所有域用户使用原密码仍能继续登录,注意并不能更改用户权限,这里需要注意的是重启将失效。被称为万能钥匙,是一种域控制器权限维持工具。它无须破解域用户的任何密码,进行此攻击时,需要运行在64位操作系统的域控制器中,并且拥有域管理员权限。
我们在域控制器上运行mimikatz.exe,执行 misc::skeleton 命令,这会将Kerberos认证加密降级到RC4_HMAC_MD5,并以内存更新的方式将主密码修补到 lsass.exe 进程。
看了一下产生的sysmon日志或者windows日志仍只能看到4624日志无法准确的识别出该攻击。由于该攻击是对lsass进程进行了注入, 从Windows 8.1(和Server 2012 R2)开始,Microsoft引入了一项称为LSA保护的功能。此功能基于PPL技术,它是一种纵深防御的安全功能,旨在“防止非管理员非PPL进程通过打开进程之类的函数串改PPL进程的代码和数据”。防止对进程 lsass.exe 的代码注入,这样一来就无法使用 mimikatz 对 lsass.exe 进行注入,相关操作也会失败。在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
添加RunAsPPL=dword:00000001,重启就可以开启了PPL保护了。在windows2012上加载mimidrv.sys可以绕过这一保护,不过笔者在win2016上测试即使加载了mimidrv.sys仍然无法正常攻击。下图分别是2016跟2012域控上执行的攻击2016失败2012成功
笔者在win2016系统上利用mimidrv驱动无法关闭PPL保护,删除注册表键值重启后仍无法关闭保护,具体原因后面有时间看下是什么原因,2012系统上加载驱动后可以关闭PPL保护
无论是否可以攻击,加载驱动这一行为已经有明显的特征可以供我们进行检测。
windows日志4697记录了mimidrv.sys驱动的安装
sysmon日志13可以很明显看到mimidrv服务以及对应的驱动程序
sysmon日志6可以看到驱动加载了并且是未签名的
可以使用zBang 工具检测扫描网络中潜在的特权帐户威胁。
(https://github.com/cyberark/zBang)其中有5种检测项
1.ACLight 扫描- 发现必须保护的最高特权帐户,包括可疑的影子管理员。
2.Skeleton Key scan – 发现可能被 Skeleton Key 恶意软件感染的域控制器。
3.SID 历史扫描- 发现具有辅助 SID(SID 历史属性)的域帐户中的隐藏权限。
4.RiskySPNs 扫描- 发现可能导致域管理员凭据被盗的 SPN 的风险配置
5.神秘扫描- 发现网络中存在风险的 Kerberos 委派配置
检测图如下
也可以使用skeletonkeyscanner脚本扫描因为该攻击主要是代码注入lsass进程可以扫内存二进制特征识别
因为 Skeleton Key 是被注入到 lsass.exe 进程的,所以它只存在于内存中,如果域控制器重启,注入的 Skeleton Key 将会失效
5.DSRM ABUSE
域控上有个账户,名字为目录服务还原模式账户又名DSRM账户,它的密码是安装DC的时候设置的,一般不会修改。但是当DSRM账户被修改的时候,域控的本地管理员administrator账户密码的hash也会被修改,并且与DSRM账户的hash是一样的。这时候即使再次修改了本地管理员administrator账户的明文密码,sam文件的hash也不会更改,只会更改ntds.dit文件中的hash。综上,意味着只要我们能够更改DSRM的账号密码,我们就能够通过DSRM的密码的hash登陆域控主机,并且即使域控主机的本地管理员密码改变了,DSRM的hash也不会变,我们依旧可以利用pth攻击来登陆。该攻击需要使用域控上的ntdsutil工具修改DSRM账户的密码(保证自己知道的密码),然后需要修改dsrm的登录方式因为在windows server 2000以后版本的操作系统中,对DSRM使用控制台登录域控制器进行了限制
在注册表中新建HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior项。
DSRM的三种登录方式:
0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号。
1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器。
2:在任何情况下,都可以使用DSRM管理员账号登录域控制器。
如果要使用DSRM账号通过网络登录域控制器,需要将该值设置为2
经过测试可以使用DSRMhsah访问域控
由于需要先使用域控自带的工具ntdsutil来修改以前的DSRM账户的密码,我这里将密码修改为与域账号win10相同的密码。
查看windows日志可以看到4688事件 ntdsutil工具使用,sysmon事件1同理
同时会看到4794事件 试图设置目录服务还原模式密码的日志
在注册表中新建HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior项,如果是使用regedit工具打开注册表添加的话sysmon13可以检测到regedit进程对注册表的修改的操作,如果是使用命令行cmd,wmic,powershell等程序操作注册表的话通常来说是可疑的可以监控起来
检测当前注册表HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior项如果是2说明已经遭受过攻击。修复方案需要将注册表键值改为0并且重置dsrm密码
6.custom ssp
SSP(Security Support Provider)是Windows操作系统安全机制的提供者。简单地说,SSP是个DLL文件,主要用来实现Windows操作系统的身份认证功能,例如NTLM、Ketberos,Negotiare. Seure Channe (Schannel )、Digest、Credental ( CredSSP )。
SSPI ( Security Support Provider Interfce.安全支持提供程序接口)是Windows操作系统在执行认证操作时使用的API接口。可以说,SSPI是SSP的API接口。
如果获得了网络中目标机器的System权限,可以使用该方法进行持久化操作。其主要原理是: LSA (Local Security Authority)用于身份验证; lsass.exe 作为Windows的系统进程,用于本地安全和登录策略;在系统启动时,SSP 将被加载到lsass.exe进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样,即使用户更改密码并重新登录,攻击者依然可以获取该账号的新密码。
主要有两种攻击方式:
第一种memssp:主要通过往lsass进程注入代码来patch其加载的msv1_0.dll中的SpAcceptCredentials函数,以便恢复凭据信息。我们可以通过pchunter发现该hook,这样攻击不会在系统中留下二进制文件,但如果域控制器重启,被注人的代码就会失效。主要实现的功能是在登录过程中获取明文密码并存储在日志文件C:\Windows\System32\mimilsa.log中。
第二种:mimikatz自带一个Mimilib.dll该dll也实现了ssp功能,该dll有个SpLsaModeInitialize导出函数,lsass会使用该函数来初始化包含多个回调函数的一个结构体,其中回调函数SpAcceptCredentials用来接收LSA传递的明文凭据,以便SSP缓存,mimikatz利用AddSecurityPackage这个API来加载SSP,这样可以在不重启的情况下添加Mimilib。当添加成功后,我们发现每次进行身份认证时,凭据信息都会被写入kiwissp.log文件中。实现的方法有很多种powershell脚本,手动添加等本质的操作都是
将mimilib.dll复制到域控c:\windows\system32然后在注册表:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages下添加mimilib.dll之后只要触发了身份认证就会记录登录的密码
memssp攻击目前只能通过sysmon监控到mimilsa.log创建的日志
加载dll实现的SSP攻击,windows日志4622记录了lsass进程加载mimilib的过程,sysmon日志11记录mimilib落盘的过程,日志13记录了注册表修改的操作,sysmon7也记录了dll加载的过程(dll加载日志终端日志量太大,这里用的kibana的图片)
1.检测是否已经被memssp攻击,需要使用ARK工具查看msv1_0.dll是否已经被inlinehook,或者查看电脑里面是否有mimilsa.log文件,如果已经被攻击要么取消hook,pchunter工具可以恢复,也可以重启机器解决。
2.通过查看机器是否有kiwissp.log以及注册表的键值,mimilib.dll是否存在在机器上都可以有效检测当前机器是否已经被留下后门,清除方法就是注册表的值删除mimilib.dll,删除system32目录下的mimilib.dll
7.利用委派维持持久化
第一种利用基于资源的约束委派实现后门,攻击者可以通过某种方式利用msDS-AllowedToActOnBehalfOfOtherIdentity属性,以便在AD基础设施中隐藏特权访问权限。
如果在krbtgt账户的msDS-AllowedToActOnBehalfOfOtherIdentity属性中设置某个用户账户的SID,那么任意账户就可以获取KDC(Key Distribution Centre)服务的TGS,最终获得一个有效的TGT,这也意味着攻击者成功获得了黄金票据。拥有黄金票据后,攻击者可以完全控制整个AD域。
假设攻击者已经获得域管(Domain Admins)权限,并且想利用msDS-AllowedToActOnBehalfOfOtherIdentity属性来实现目标环境的持久化访问。利用该账户,攻击者可以执行如下步骤:
寻找具备SPN并且密码永不过期的用户账户。在企业环境中这种情况非常常见,比如许多服务账户就会满足这种条件。然后使用Mimikatz中的“DCSync”功能提取该账户对应的哈希。在krbtgt账户上设置msDS-AllowedToActOnBehalfOfOtherIdentity属性。在本例中,我使用的具备SPN并且密码永不过期的用户账户win10,并且对其设置msDS-AllowedToActOnBehalfOfOtherIdentity属性
利用后门重新获取管理员权限
第二种利用约束委派实现后门攻击步骤前2步与前面一致
1.识别出密码不过期且带有SPN的用户账户
2.提取该账户的哈希值
3.在域控上配置该用户到域控制器的cifs协议的约束性委派
利用后门重新获取管理员权限
约束性委派后门我这里配置的是win10用户到域控的cifs服务可以看到5136同样记录了相关属性的更改
终端上进行攻击后在域控日志中观察到4769日志请求的服务票据是0x17加密也就是RC4-HMAC加密,微软从Windows Server 2008和Windows Vista开始,添加了Kerberos AES(128和256)加密,这意味着在任何现代Windows操作系统中大多数的Kerberos请求将使用AES进行加密。任何一个使用Kerberos RC4加密请求的票证都是异常情况。Kerberos RC4加密和Kerberos DES加密都不安全出现这些类型加密都可能是攻击行为
利用基于资源的约束委派后门需要在krbtgt账户上设置msDS-AllowedToActOnBehalfOfOtherIdentity属性可以看到windows日志5136有记录相关属性变更
同样的不安全的RC4加密
由于委派攻击需要寻找具备SPN并且密码永不过期的用户账户,攻击者很有可能自己伪造一个通过4738可以检测哪些用户被设置为密码永不过期,4688可以检测可疑的setspn程序来添加修改spn,sysmon事件1同理检测进程setspn
Sean Metcalf在2020年6月17日的TrimarcWebcast的演讲中,涉及到了许多安全检查以解决Active Directory(AD)潜在安全问题域。其中脚本可用于执行AD安全检查。名称为Invoke-TrimarcADChecks.ps1,执行仅需要运行AD用户权限。可以检查当前的域委派情况还有很多检查项,前面提到的zbang也可以 后面还有一些工具都可以检测
清除基于资源的约束委派可以使用powershell脚本
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount $null
清除约束性委派可以直接对相应用户清除
这种委派后门需要设置SPN,并且要求目标账户永远不更新密码。因此,我们需要检查一下当前域内环境是否存在异常的这种账户,特别是AD环境中带有敏感权限的组,这些组的每个成员都不应该带有SPN属性,否则攻击者就可以利用Kerberoast以及委派后门技术发起攻击。可以使用powershell查询当前环境密码不更新并且有SPN的账户
Get-ADUser -Filter * -Properties ServicePrincipalName, PasswordNeverExpires | ? {($.ServicePrincipalName -ne “”) -and ($.PasswordNeverExpires -eq $true)},对可疑的账户或者SPN进行清除。
将所有高权限的管理员帐户配置为“帐户敏感且无法委派”
8.SID History
每个用户都有自己的SID,SID的作用主要是跟踪安全主体控制用户连接资源时的访问权限,SID History是在域迁移过程中需要使用的一个属性。如果A域中的域用户迁移到B域中,那么该用户的SID值就会改变,进而其权限也会改变。导致迁移后的用户无法访问以前可以访问的资源。SID History的作用是在域迁移过程中保持域用户的访问权限,如果迁移后用户的SID值改变,系统会将原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原来可以访问的资源。使用mimikatz可以将SID History属性添加到任意用户的SID History属性中。在渗透测试中,如果获得了域管理员权限(或者等同于域管理员权限),就可以将SID History作为实现持久化的方法。
我这里更改普通用户的sid属性后成功获取了域管权限
windows日志4738,5136很好的记录了sid的属性变更
4765,4766应该也能检测由于笔者2012,2016的系统未产生4765,4766日志,也可以把这两个日志加上
我们可以使用工具zbang检查是否存在有sid history的账户,这里发现了2个账户
也可以用powershell查询 这里查询的是sid以500为结尾的
Get-ADUser -Filter ‘SIDHistory -like ““‘ -SearchScope Subtree -Properties sidhistory|?{$_.sidhistory -like “500”}
清除的话可以也可以使用powershell
Get-ADUser -filter ‘sidhistory -like ““‘ -searchbase “cn=chz-win7test,cn=users,dc=wlaq,dc=co
m” -searchscope subtree -properties sidhistory | foreach {Set-ADUser $ -remove @{sidhistory=$.sidhistory.value}}
Get-ADUser -filter ‘sidhistory -like ““‘ -searchbase “cn=chz,cn=users,dc=wlaq,dc=com” -searchscope subtree -properties sidhistory | foreach {Set-ADUser $ -remove @{sidhistory=$.sidhistory.value}}
也可以使用mimikatz 笔者这里已经清理过了 sid::clear /sam:win7
9.AdminSDHolder
AdminSDHolder是一个特殊的ad容器,具备一些默认安全权限,用于受保护的ad账户和组的模板 active directory将采用AdminSDHolder对象的acl并定期将其应用于所有受保护的ad账户和组,以防止意外和无意的修改并确保对这些对象的访问是安全的 如果能够修改AdminSDHolder对象的acl,那么修改的权限将自动应用于所有受保护的ad账户和组,能够进一步进行域环境的权限维持 。
我这里给win7账户附加了完全控制权
windows日志4662和5136记录了adminSDHolder对象的修改
当域对象的 ACL 被修改时,会创建一个事件 ID 为 5136 的事件,此事件包含安全描述符定义语言 (SDDL) 格式的帐户名称和 ACL。由于这对人类来说是不可读的,因此 Windows 10,ConvertFrom-SDDL4中有一个 PowerShell cmdlet ,可将 SDDL 字符串转换为更易读的 ACL 对象。ConvertFrom-SDDLstring “要解析的sddl字符串”
可以使用zbang工具对当前环境检测是否已被留下AdminSDHolder后门
也可以使用powerview脚本检测当前环境
Get-DomainObjectAcl adminsdholder | ?{$_.SecurityIdentifier -match “S-1-5-21-4207138187-2036730068-1601168572-3106”} | select objectdn,ActiveDirectoryRights |sort -Unique
清除的话可以使用powerview脚本可以移除acl,
Remove-DomainObjectAcl -TargetSearchBase “LDAP://CN=AdminSDHolder,CN=System,DC=wlaq,DC=com” -PrincipalIdentity win10 -Rights All -Verbose
10.Hook PasswordChangeNotify
Hook PasswordChangeNotify 的作用是当用户修改密码后在系统中进行同步。
攻击者可以利用该功能获取用户修改密码时输入的密码明文。在修改密码时,用户输入新密码后,LSA 会调用 PasswordFileter 来检查该密码是否符合复杂性要求,如果密码符合要求,LSA 会调用 PasswordChangeNotify,在系统中同步密码。通过powershell来反射注入dll,dll主要是对rassfm.dll中的PasswordChangeNotify进行了hook,修改密码后会在本地生成文件记录密码
通过pchunter可以看到hook详情
攻击成功文件生成
代码详情
从sysmon日志来该行为产生了远程线程注入powershell注入lsass并且注入的的是没有模块没有功能的,并且还有个可疑行为lsass进程创建了可疑的文件
由于使用了Invoke-ReflectivePEInjection.ps1脚本进行dll反射注入该脚本收录在powersploit中,可以把powersploit,empire等powershell工具里面的一些敏感的命令功能函数进行统计监控起来,windows 4104事件记录的powershell日志可以记录powershell的脚本内容。
这个也是对lsass加载的dll的导出函数进行了hook同样取消hook或者重启机器可以清除,可以用pchunter等ARK工具检测lsass进程是否被挂钩
11.DCshadow
DCShadow攻击在具备域管理员权限条件下,攻击者可以创建伪造的域控制器,将预先设定的对象或对象属性复制到正在运行域服务器中,DCSync从域服务器复制出东西,DCShadow是将数据复制至域服务器。伪造的域控要想被域中其他DC认可,能够参与域复制,需要添加2个SPN:DRS服务(GUID为E3514235–4B06–11D1-AB04–00C04FC2DCD2)和GS(Global Catalog)服务,通过RPC接口来完成数据复制,下图我对chz账户的description属性修改了值为shadowshadow做测试
要想伪造为域中的一台DC服务器,需要通过RPC在域的活动目录中注册一个NTDS-DSA(nTDSDSA)类对象。注册的位置为CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=adsec,DC=com,windows日志4662,5137可以看到该对象被创建
windows日志4742可以看到最主要的两个SPN DRS服务(GUID为E3514235–4B06–11D1-AB04–00C04FC2DCD2)和GS(Global Catalog)服务被添加
攻击完成后会把伪域控恢复为普通域成员主机,会删除前面添加的对象,包括nTDSDSA对象、SPN属性等,一旦发现该攻击就说明域管权限已经被攻击者拿到了,这时候就需要按照本文最后总结描述的内容去尽力清除
12.SeEnableDelegationPrivilege
SeEnableDelegationPrivilege权限的作用是配置约束性委派。拥有SeEnableDelegationPrivilege权限的人可以配置任意一台主机的约束性委派,但这个权限一般情况下只有域控才有,有这个权限的用户,还需要找一个拥有spn的账户并且需要对该账户具有完全访问权限(也可以直接设置对整个域有完全访问权限),也可以是自己本身,相当于拥有这个权限的账户并且有spn以及对自己有完全访问权限,就可以随时利用该账户设置委派。
我这里通过直接修改gpttmpl.inf文件给终端添加权限。因为SeEnableDelegationPrivilege是在域控制器的本地安全策略中控制的用户权限,并通过组策略进行管理。该权限配置在本地策略中的用户权限分配,策略名为:信任计算机和用户帐户可以执行委派。域上一般默认有两个GPO:Default Domain Policy和Default Domain Controllers Policy,这只是他们显示的名称,他们实际名称为它们的GUID,分别为:{31B2F340-016D-11D2-945F-00C04FB984F9}和{6AC1786C-016F-11D2-945F-00C04fB984F9},我们可以通过GPO为Default Domain Controllers Policy的GptTmpl.inf文件来寻找域中哪些用户(组)分配了SeEnableDelegationPrivilege,GptTmpl.inf文件位于\<domain>\SYSVOL\<domain>\Policies{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
拥有SeEnableDelegationPrivilege权限以及对有spn账户有完全访问权限就可以随时设置委派了
在修改用户acl权限的过程可以看到5136日志对安全描述符的修改,4662日志WRITE_DAC也代表在对象安全描述符中修改 DACL 中的 (访问控制) 权限。4672日志显示该用户已有新特权
一旦设置委派通过windows日志5136,4738可以很明显的检测出来
通过powershell查看当前的委派
Get-DomainUser –TrustedToAuth -domain wlaq.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto
也可以使用Invoke-TrimarcADChecks.ps1检查是否有可疑的委派
通过查看GptTmpl.inf文件查看是否有SeEnableDelegationPrivilege权限的账户
\wlaq.com\SYSVOL\wlaq.com\Policies{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
清除GptTmpl.inf文件中的特殊权限,清除所有异常的委派清除委派的方法可以参照前面
13.GPO
GPO全称Group Policy Objects,用来存储Active Directory中的策略。
自Windows Server 2008开始,GPO开始支持计划任务,便于管理域中的计算机和用户。默认情况下,域用户的组策略每90分钟更新,随机偏移为0-30分钟,域控制器的组策略每5分钟更新。可通过命令实现组策略的强制更新gpupdate。默认组策略的保存位置:\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\,所有域内主机都能访问。
我这里创建一个全局的GPO,作用于所有域用户内容设置了一些计划任务来进行模拟测试。攻击者也可以利用其功能来推出恶意软件、创建/修改计划任务、降级凭据保护、向所有计算机添加新的本地帐户被添加到本地管理员组。甚至更改现有的安全策略,以启用明文密码提取。
2.攻击检测
组策略新增的话动静挺大的很多日志都有记录5136记录很多关于组策略的信息另外5137,4662,5145,4674都可以看到新增组策略的信息
域用户终端同步组策略后看到windows日志4698事件 计划任务名 任务详情
sysmon日志事件1可以看到新的gpo链接产生
可以通过adrecon脚本查看当前的组策略情况以及谁创建的组策略对可疑的组策略进行排查,对有问题的策略进行删除,后续可以通过日志对新增的组策略进行监控审计。
14.组策略权限委派
组策略的权限即组策略的DACL配置,即权限委派。如果组策略对象的修改或完全控制权限被分配给了某个用户,当该用户被攻击者拿下之后,攻击者利用该用户权限可以修改并配置特定的组策略来渗透攻击受该组策略作用的用户或计算机。
我这里添加了账户对GPO attck2对象的完全控制权限,这时我可以在win10机器上修改GPO attck2策略比如创建计划任务达到持久化
修改GPO attck2对象的权限后从5136,4662,5145可以看到对对象acl的修改
在win10机器上通过sysmon上可以看到对gpo对象操作的日志
在域控上的windows日志5136,5145,4662也可以很明显的看出win10机器对GPO对象的修改
可以使用adRecon脚本帮我们梳理出当前的组策略委派,以及当前组策略的具体内容
找到对应的策略删除委派权限即可
15.特殊组成员变更
往安全组添加用户来维持权限
windows日志4728,5136记录了成员的变更信息,事件日志id为4735/4737/4755,分别用于修改域本地组、全局组和 通用范围的安全组
3.防御与清除
ZBANG工具可以帮你梳理出当前特殊组成员
也可以使用Invoke-TrimarcADChecks脚本检查
找出用户清除即可
16.ACL攻防
在windows的安全体系中ACL是至关重要的一环,常常用在域渗透的时候寻找攻击路径或者用于充当后门。包括前面提到的很多后门都是通过修改acl来充当后门,还有没提到的exchange,laps等都是acl导致的,所以我们必须要对acl的修改做严格监控,windows5136日志清楚记录了相关acl修改。
攻击者常利用的acl:
GenericAll:授予对目标对象的完全控制权,包括WriteDacl 和 WriteOwner 特权
GenericWrite:可以修改所有参数,因此包括对某些属性的WriteProperty,比如member
WriteOwner:修改所有者
WriteDACL:将新ACE写入目标对象的DACL的功能。例如,攻击者可以向目标对象DACL写入新的ACE,从而使攻击者可以“完全控制”目标对象。
AllExtendedRights AddMembers:将任意用户、组或计算机添加到目标组。 ForceChangePassword:强制更改密码,在不知道当前密码的情况下更改目标用户的密码。
AddMembers:可以将任意用户,组或计算机添加到目标组。
如果一个用户对一个组有AddMembers权限,那么这个用户可以讲任何用户加入这个组,从而具备这个组的权限。
servicePrincipalName:如果对一个对象有写入spn的权限,那么就可以对这个对象进行kerberosting了,如果密码强度不强的话,有机会获取到密码
AllExtendedRights:所有扩展权限。比如,User-Force-Change-Password权限。
Full Control:这个权限就具备以上所有的权限,随便挑一个特殊权限的攻击方式进行攻击就行了。
bloodhound工具可以对当前的攻击路径dacl情况显示出来协助我们分析
ADRecon脚本可以把当前的dacl的全部情况统计出来帮助我们进行分析
对域内的ACL梳理清除删除没必要的acl,以及开起日志监控有新增的acl进行排查
3.总结
真实攻击场景如果攻击者拿下域控了那么会导出所有密码hash包括krbtgt,机器账户hash,那么他可以选择利用黄金票据维持权限,利用白银票据维持权限,包括其他后门维持方法攻击者都有可能挨着做一遍,所以任何规则异常帮忙我们判断出域控已经失陷了的话,那么我们首先就应该先封掉C2,定位失陷原因,删除载荷,检查当前机器的所有后门情况并且进行清除然后加固开启日志检测需要
重置所有特权账户名以及密码
重置域控制器的机器帐户密码,以防止银票滥用
重置KRBTGT账户,防止黄金票滥用
重置所有机器帐户密码 域名防止银票滥用。域环境相较于普通终端多了很多权限维持的手法,特别是ACL的利用,本文只对域环境权限维持攻击触发的告警进行了梳理。AD的加固其实还有很多方面需要审查用户账户,密码策略,域信任关系,重复的SPN等等。有一些好用的AD检查工具推荐大家使用。
PINGCASTLE https://www.pingcastle.com/
ADRecon https://github.com/sense-of-security/ADRecon
Invoke-ACLpwn https://github.com/fox-it/Invoke-ACLPwn
Invoke-TrimarcADChecks:https://www.hub.trimarcsecurity.com/post/securing-active-directory-performing-an-active-directory-security-review
zbang:https://github.com/cyberark/zBang
watchad:https://github.com/0Kee-Team/WatchAD
4.Black Hat USA 2021上新的域攻击手法
滥用 Active Directory 证书服务, AD CS 通过证书窃取和主动恶意注册以实现用户和机器持久化的滥用,可能导致域升级的常见证书模板错误配置,窃取证书颁发机构的私钥以伪造新的用户/机器“黄金”证书。
https://www.exandroid.dev/2021/06/23/ad-cs-relay-attack-practical-guide/
https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf
https://posts.specterops.io/certified-pre-owned-d95910965cd2
发表评论
您还未登录,请先登录。
登录