白袍的小行星

域渗透--Kerberos票据

字数统计: 1.3k阅读时长: 4 min
2020/04/10 Share

我们经常会看到域渗透的文章里写了“黄金票据”、“白银票据”,这到底是什么?一起来看看吧。

域内认证协议

在Windows域内,认证协议分为两种:一种是NTLM,另一种是Kerberos.

前一种并非票据相关,放到后面再讲吧,主要看后一种。

Kerberos,其名称来源于希腊神话的一种恶魔,也叫地狱三头犬。其认证流程主要涉及三个角色:客户端、服务端和KDC,可以把KDC理解为证券交易所,买方卖方都要通过它来进行交易。

具体的流程可以分为六步,如下图所示:

解释一下:

  1. 用户登录时,向KDC的认证服务发送经过自身密码加密的时间戳,证明自己知道密码,即预认证
  2. KDC认证服务确认后,返回给用户一个登录票据(TGT),该票据用户理论上无法伪造和解密,因为它是用KDC的krbtgt账号密码加密,里面存储了用户的相关信息。要注意,这个Login Ticket只是证券交易所的入场券,用来证明你可以进来交易,而不是服务端的证券。它也就是我们常说的黄金票据,存储在内存,默认有效期为10个小时
  3. 用户这时想访问域内的某服务,需要向KDC的票据授予服务(TGS)申请资源访问票据,即提交TGT并指定想要访问的主机和服务
  4. KDC的TGS服务将返回给用户对应的服务访问票据(RST),即白银票据,理论上这也是用户不可伪造和解密的,因为它是用目标服务的服务账号密码加密的,只有KDC和目标服务能够解密它
  5. 用户将RST发送给对应的目标服务
  6. 服务在接收到RST后,使用自身该服务账号密码解密,验证通过后则允许访问

黄金票据

结构与原理

在第二步,KDC返回给用户的数据是这样的:

[Client_ntlm_hash(K(c,tgs))],[Krbtgt_ntlm_hash(k(c,tgs),Client_name(DomainName\Username),TGT_EndTime)]

里面有客户端用户的ntlm_hash,KDC的krbtgt用户的ntlm_hash,还有票据有效时间和客户端的信息。在这几种信息里,只有KDC的krbtgt用户的ntlm_hash我们是没有的,也就是说,如果我们有这个,那就可以伪造TGT了。

在拥有普通域用户权限和krbtgt账号的ntlm_hash情况下,我们可以伪造黄金票据,访问域内任何服务。

再看一下第三步中客户端发出的请求数据:

[Session_key(Authenticator([DomainName\Username,ServerName(DomainName\Server)]))],[TGT(Krbtgt_ntlm_hash(k(c,tgs),Client_name(DomainName\Username),TGT_EndTime))]

KDC的票据授予服务(TGS)对于黄金票据是盲目信任的,也就是说可以宣称自己是域内的任何账号,包括域管账号。

利用

梳理一下利用条件:

  1. krbtgt账户的ntlm_hash,要得到它必须控制域控制器并且至少有管理员权限
  2. 域账户名称,可使用net view /domain查询得到
  3. 域SID值
  4. 想要伪造的用户名,可为任意

域控系统为Windows Server 2008 R2 X64,使用mimikatz抓取哈希。

test用户上用mimikatz来伪造:

//mimikatz.exe
kerberos::golden /domain:<域名> /sid:<域SID> /rc4:<krbtgt_ntml_hash> /user:<任意用户名> /ptt

然后使用dcsync,就可以读取域内任意用户的hash了

lsadump::dcsync /domain:<域名> /user:<要读取的用户>

思考

在一开始,我看了黄金票据的产生过程,还有一点疑惑:为什么一个入场券类的东西比访问对应服务的票券还更有用?实践了之后才明白,有了入场券,你想要哪个服务的票据都可以。

白银票据

结构和原理

在第五步,我们收到了RST,然后将其发给对应的服务,我们发送的数据为:

K(c,s)加密[Authenticator([DomainName\Username,ServerName(DomainName\Server)])],[Tiket(Server_ntlm_hash(Tiket(K(c,s),Client_Name(domainName\Username),TGT_EndTime)))]

同样的,我们缺少的是Server_ntlm_hash,有了它,便可以伪造白银票据了。

白银票据只能访问对应的服务,所以我们在伪造时要指定相应的服务名。

利用

同样的,使用mimikatz抓取Server_ntlm_hash:

注意,这里使用的是OWA$的哈希,即服务账户的哈希,而不是krbtgt的哈希

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

可伪造的服务列表如下:

服务类型 服务名
WMI HOST、RPCSS
PowerShell Remoting HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
Windows File Share (CIFS) CIFS
LDAP operations including LDAP
Mimikatz DCSync LDAP
Windows Remote Server Administration Tools RPCSS、LDAP、CIFS

思考

与黄金票据不同,白银票据只能对特定的服务使用,但好处在于不用与域控交互,减少了被发现的可能。

结语

其实kerberos不止这么简单,下篇文章想写写关于委派方面的,因为自己也是不大清楚哈哈哈

CATALOG
  1. 1. 域内认证协议
  2. 2. 黄金票据
    1. 2.1. 结构与原理
    2. 2.2. 利用
    3. 2.3. 思考
  3. 3. 白银票据
    1. 3.1. 结构和原理
    2. 3.2. 利用
    3. 3.3. 思考
  4. 4. 结语