这是关于域中深度隐蔽后门系列的第二篇,第一篇为利用文件目录ACL深度隐藏后门

本篇主要介绍利用域中主机账号的口令散列值制作白银票据,结合文章《利用域委派获取域管理权限》中的委派方式,在域中埋伏隐蔽后门,以长期隐蔽有效地高权限控制域。

前提条件:已经控制了域,并获取了域中主机账号的口令散列值。

0x01 白银票据基本原理

网络上有众多关于kerberos协议、黄金票据、白银票据的资料,本篇通过下图言简意赅地介绍白银票据的基本原理。

Kerberos协议认证过程,可粗略地分为6步(或者7步)。下图是域内一台主机的jack用户,想访问域内服务器A中的服务B(假设为文件共享),则认证过程如下:

1、jack向域服务器发起认证请求,告诉域服务器我是jack,认证内容为jack用户口令散列值(NTLM)加密的一个时间值;

2、域服务器使用存储在AD数据库中的jack用户的口令散列值(NTLM),对认证内容进行解密校验,成功则返回TGT票据,使用krbtgt的NTLM对TGT进行加密;

3、jack使用TGT向域服务器申请访问服务器A的服务B;

4、域服务器使用krbtgt的NTLM值解密TGT,成功则返回访问服务器A中服务B的TGS,TGS被服务B的服务账号ServiceAccount的口令散列值加密;

5、jack收到TGS后,将TGS发送给服务器A。A使用ServiceAccount账号的口令散列值解密收到的TGS,解密成功则允许访问;

6、服务器A告诉jack,校验成功,允许访问;

7、TGS中包含PAC的校验和,服务器A收到TGS并解密校验成功后,将PAC的校验和发送给域服务器,以判断PAC是否被篡改。这一步为可选步骤,一般不用关注。

在上面的第3步中,如果我们拥有krbtgt账号的口令散列值,则可以伪造TGT,宣称自己是域内任何账号,包括域管或者不存在的用户,这是黄金票据的原理。所以制作黄金票据的前提是获取krbtgt账号的口令散列值。

在上面的第5步中,如果我们拥有ServiceAccount账号的口令散列值,则可以伪造TGS,并宣称自己是域内的任何账号,例如域管理员,这是白银票据的原理。所以制作白银票据的前提是获取服务账号的口令散列值。

在windows系统中,许多服务以主机账号运行,即许多ServiceAccount账号为本机的主机账号,格式为ComputerName$。下表是常见的以主机账号运行的服务。右边一栏中有些有多个服务,例如WMI服务包括HOST、RPCSS这2个服务,表示访问WMI服务同时需要2个TGS票据。

服务名称 同时需要的服务
WMI HOST、RPCSS
PowerShell Remoting HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
Windows File Share CIFS
LDAP LDAP
Windows Remote Server RPCSS、LDAP、CIFS

0x02 利用主机账号制作白银票据

演示样例:已知域服务器主机账号的口令散列值,使用Mimikatz的白银票据功能,伪造访问HOST服务的TGS,以域管理员权限运行域服务器的SCHTASKS命令,远程创建、查看、删除系统任务。

上图为伪造白银票据前内存中的票据,登录用户为域内普通用户eviluser,登录到域服务器TESTLABDC02。

上图为伪造白银票据后内存中的票据,伪造指令为:

kerberos::golden /admin:administrator@testlab.com /domain:testlab.com /sid:S-1-5-21-2390976136-1701108887-179272945 /target:TESTLABDC02.testlab.com /rc4:36788836f262b9409f102baa22b7a6f3 /service:cifs /ptt

其中rc4的参数为服务器TESTLABDC02的主机账号口令散列值。伪造白银票据并ptt进入当前会话后,内存中的TGS票据为administrator。

上图为使用schtasks命令远程在TESTLABDC02服务器上创建、查看、删除名为“SCOM Agent check”的系统任务,必须具备TESTLABDC02的管理员权限才能查看,这里是域管理员权限。通过这个演示样例,可知基于主机账号口令散列值,制作隐蔽后门作用非常之大。

0x03 修改主机账号的口令策略制作后门

默认情况下,主机账号的口令每30天变更一次。因此,要想长期使已获取的主机账号的口令散列值长期有效,必须对口令更改策略进行修改。有3种修改方式:

1. 在主机的注册表中修改策略,具体位置为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters,键值为DisablePasswordChange,设置为1,即表示禁止修改账号口令;

2. 在组策略中修改默认的30天,修改位置为“Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\Domain member: Maximum machine account password age”,设置为0时,表示无限长;

3. 直接禁止修改主机账号口令,用来支持VDI (virtual desktops)等类型的使用,具体位置为“Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\Domain member: Disable machine account password changes”。

0x04 修改主机账号的委派设置权限制作后门

在我的另外一篇文章《利用域委派获取域管理权限》中,“样例4:一个主机账号被设置了约束性委派”,演示了使用主机账号的口令散列值和约束性委派获取域管理员权限的过程。前提条件为:主机账号的口令散列值和委派(约束性和非约束性均可)。

如果我们在域内有多个稳定的控制点,且获取了当前系统的SYSTEM权限,则随时可获取当前主机的主机账号(演示中的账号为win7x86cn$)口令散列值,满足了第1个条件;如果将该win7x86cn$账号的SeEnableDelegationPrivilege权限赋予本机的低权限登录域用户(eviluser),则通过eviluser用户随时可更改win7x86cn$账号的委派设置,从而可满足第2个条件。

首先演示SeEnableDelegationPrivilege权限赋予过程及委派设置过程。

SeEnableDelegationPrivilege权限很特殊,设置方法为修改GPO策略文件,位置为域服务器中C:\Windows\SYSVOL\sysvol\testlab.com\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf文件。这里有关于SeEnableDelegationPrivilege更详细的介绍。

上图中添加eviluser具备SeEnableDelegationPrivilege权限,则eviluser可修改域内所有用户的委派设置。下图是测试在eviluser的登录会话中修改win7x86cn$账号的委派设置。

上图首先查看了win7x86cn这个账号的委派设置情况,标红的useraccountcontrol表示没有设置委派,中间使用Set-DomainObject进行委派设置,16777216表示设置TRUSTED_TO_AUTH_FOR_DELEGATION,通过Get-DomainObject查询设置后的结果,有了msds-allowedtodelegatedto选项,且useraccountcontrol发生了变更。

下面演示使用设置委派后的win7x86cn、口令散列值进行“样例4”中的测试。

上图为使用win7x86cn的NTLM,向域服务器请求win7x86cn账号的TGT票据。

上图为使用win7x86cn的TGT,在委派被设置的基础上,向服务器申请访问WIN-Q1C8HBI6G87服务器CIFS服务的TGS票据,访问权限为administrator@testlab.com。

上图为使用mimikatz将获取的TGS票据注入当前会话,并查看内存中的票据信息。

直接查看WIN-Q1C8HBI6G87服务器的C盘目录,能成功访问,则表示获取了administrator@testlab.com权限。

0x05 安全应对此类后门的策略

  1. 通过域的组策略强制设置主机账号的最长有效期为30天;
  2. 保护{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf文件、即关键组策略的完整性;
  3. 高权限的用户,设置不能被委派,如图所示。
  4. 主机账号需设置委派时,只能设置为约束性委派。