内网渗透-域渗透
0x00 前言
域渗透需要知道的知识在这一部分,主要了解kerberos
协议,黄金/白银票据等知识
学习域渗透,绕不开对kerberos协议的学习。
0x01 Kerberos协议
Kerberos
是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。
协议的三个主要角色
- 客户端(Client):发送请求的一方
- 服务端(Server):接收请求的一方
- 密钥分发中心(Key Distribution Center,KDC),而密钥分发中心一般又分为两部分,分别是:
- AS(Authentication Server):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(票据授予票据/Ticket Granting Ticket)
- TGS(Ticket Granting Server):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的ST(服务授予票据 Server Ticket)
协议过程分析
简易的认证过程
如图所示就是基本的认证过程

当Client想要访问Server上的某个服务时
- 首先向AS证明自己的身份,AS认证通过发放TGT给Client,
- 然后Client拿着TGT向TGS发起认证请求,认证通过返还一个ST给Client
- 最后Client拿着ST去访问server
Client 与 AS 的交互

客户端请求 :KRB_AS_REQ:
Client 先向 KDC 的 AS 发送 Authenticator1,内容为通过 Client NTML Hash 加密的时间戳、Client ID、网络地址、加密类型等内容。
AS相应 :KBR_AS_REP:
当 AS 接受到 Client的请求后,向AD发起请求,通过AD获取密码Hash并且验证信息。验证成功后生成一个由Client Hash加密的Session Key as
和使用域特定账户krbtgt
Hash加密的TGT(包含了session key as
,超时时间等信息)返回给cilent客户端。
kerberos 第一步请求完成。
Client 与 TGS 的交互

客户端请求: KBR_TGS_REQ:
client接收到as返回的KBR_AS_REP
:,使用自身的hash解密第一部分得到Session Key as
,由于不知道krbtgt的Hash,因此TGT无法解密。使用得到的Session-Key as
加密数据(timestamp
、Client-info
、Server-info
)作为一部分,然后把无法解密的TGT做为第二部分组成KBR_TGS_REQ
发送给TGS。
TGS响应: KBR_TGS-REP:
TGS 收到 Client 发送过来的 TGT 和 Session key-as
加密的数据(timestamp
、Client-info
、Server-info
)后,使用krbtgt的hash解密TGT,得到Session-key as
等信息,然后拿着Session-key as
去解密第一部分,TGA将两部分中的时间戳,客户端等信息进行比较,如果认证都通过,发送KBR_TGS-REP
给Client。
KBR_TGS-REP由二部分组成,
- 第一部分是由
Session-key as
加密的Session-key tgs
- 第二部分是ST(由Server NTLM-hash加密的
Session-key tgs
、timestamp
、Client-info
)
kerberos第二步请求完成。
Client 与 Server 的交互

client接收到TGS返回的KBR_TGS-REP
,首先使用Sessions-key as
解密第一部分得到Session-key tgs
,由于不知道Server NTML hash因此第二部分无法解密。
客户端向服务器请求 KRB_AP_REQ:
client使用得到的Session-key tgs对timetamp、Client-info、Server-info信息进行加密得到第一部分,ST做为第二部分发送给server。
客服务器返回 KRB_AP_REP:
server收到client发送的KRB_AP_REQ,使用自身的server NTML-hash解密ST,得到Session-key tgs,再使用Session-key tgs解密第一部分,然后对两部分的内容进行比较。验证通过后发送KRB_AP_REP给client,两者建立通信。
kerberos第三步请求完成。
0x02 黄金票据
用于拿下域控主机后的权限维持,krbtgt 账户的密码基本不会更改。
Client通过了第一次AS认证后,返回给TGT用于第二次认证,通过伪造TGT跳过AS认证,直接进行第二次认证,从而和任意server进行通信。
原理分析
kerberos第二次认证发送的KBR_TGS_REQ由二部分组成:Session-Key as 加密数据(timestamp、Client-info、Server-info)和TGT
TGS并没有保存Session-Key as的值,因此可以随意构造Session-Key as,再利用krbtgt 用户的Hash对TGT进行伪造。
使用条件:
- 域名称
- 域的 SID
- 域的krbtgt账户的密码 hash 值
- 伪造的用户名,可以是任意用户,通常是administrator
黄金票据防御
- 限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机(不要让其他管理员登录到这些服务器)将所有其他权限委派给自定义管理员组。这大大降低了攻击者访问域控制器的Active Directory的ntds.dit。如果攻击者无法访问AD数据库(ntds.dit文件),则无法获取到KRBTGT帐户密码。
- 禁用KRBTGT帐户,并保存当前的密码以及以前的密码。KRBTGT密码哈希用于在Kerberos票据上签署PAC并对TGT(身份验证票据)进行加密。如果使用不同的密钥(密码)对证书进行签名和加密,则DC(KDC)通过检查KRBTGT以前的密码来验证。
0x03 白银票据
学习完黄金票据,再学习白银票据。
第二次认证返回ST给client,通过对ST进行伪造,跳过和client和KDC的前二次认证过程,直接与server进行认证。
原理分析
在第三次认证中,Client会向Server发送KRB_AP_REQ,包括两部分:
第一部分:Session key tgs 加密的 Client-info、timestamp 等信息
第二部分:ST(ticket):由Server NTLM-hash加密的数据(Session-key tgs、timestamp、Client-info)
因此,在知道Server NTLM-hash的情况下可以对ST进行伪造,server并没有保持Session key tgs,因此可以随意伪造Session key tgs。
使用条件
- 域名称
- 域的 SID
- 域中Server服务器账户的NTLM-Hash
- 伪造的用户名(可以是任意的)
用于拿下一台域内主机后的权限维持
0x04 黄金白银票据之间的区别
访问权限不同
- Golden Ticket: 伪造TGT,可以获取任何Kerberos服务权限
- Silver Ticket: 伪造TGS,只能访问指定的服务
加密方式不同
- Golden Ticket 由Kerberos的Hash—> krbtgt加密
- Silver Ticket 由服务器端密码的Hash值—> master key 加密
认证流程不同
- Golden Ticket 的利用过程需要访问域控(KDC)
- Silver Ticket 可以直接跳过 KDC 直接访问对应的服务器