1. 从一次“幽灵登录”说起:为什么需要了解票据攻击
几年前,我负责的一个内部系统监控告警突然响了,提示某个核心数据库服务器在凌晨出现了异常登录。我们立刻调取日志,发现登录记录显示的是一个早已离职半年的运维人员的账号。更诡异的是,这个账号的密码在离职时已经重置,且启用了双因素认证。当时团队里一片紧张,第一反应是遭遇了高级持续性威胁(APT)。经过一番紧张的排查,最终在系统的Kerberos票据缓存里找到了端倪——攻击者并没有窃取密码,而是伪造了一张可以“永久通行”的“黄金门票”。
这就是经典的“黄金票据”攻击。在Windows域环境或任何使用Kerberos协议进行身份认证的大型企业内网中,这类攻击是攻击者获取权限维持和横向移动能力的“核武器”。与之相对的“白银票据”,则更像一把精准的“万能钥匙”,可以悄无声息地访问特定服务。很多安全工程师对这两个概念耳熟能详,但往往停留在“知道名字”的层面,对于其原理、差异、利用条件和防御手段缺乏系统性的理解。今天,我就结合多年的实战踩坑经验,带你彻底搞懂黄金票据和白银票据,不仅知道“是什么”,更要明白“为什么”以及“怎么办”。
简单来说,你可以把Kerberos协议想象成一个高度安全的电影节验票流程。你想看电影(访问服务),需要先到官方售票处(密钥分发中心KDC)凭身份证(密码哈希)买票(票据授予票据TGT)。拿着这张TGT,你才能去具体的放映厅门口(服务)换电影票(服务票据ST)入场。黄金票据,就是直接伪造了售票处的公章和空白票根,可以自己签发任意场次的TGT;而白银票据,则是直接伪造了某个放映厅的验票章,可以自己制作该厅的假电影票。前者权限极大但容易被发现,后者权限精准但极其隐蔽。
2. Kerberos认证协议精要:理解票据的“原材料”
要理解票据攻击,必须先吃透Kerberos认证的基本流程。很多文章一笔带过,但这里恰恰是理解后续所有攻击手法的基石。Kerberos协议的核心是“票据”,而票据的安全完全依赖于“密钥”。
2.1 核心参与方与密钥体系
一个标准的Kerberos域环境(以Active Directory为例)包含三个核心角色:
- 客户端:想要访问某个服务的用户或计算机。
- 服务:客户端想要访问的目标,如文件共享、SQL数据库、Web应用等。
- 密钥分发中心:包含两个部分:
- 身份验证服务:负责验证客户端的初始身份。
- 票据授予服务:负责颁发访问服务的票据。
这里的关键在于密钥。在Kerberos的世界里,密码本身并不直接在网络上传输,而是通过哈希算法生成的密钥来进行加密和解密。
- 用户密钥:由用户密码的哈希值生成。只有用户自己和KDC知道。
- 服务密钥:由服务账户密码的哈希值生成。只有服务自身和KDC知道。
- KDC密钥:这是域控制器上一个特殊的、极其强大的密钥,对应的是
krbtgt这个内置账户的密码哈希。它是整个Kerberos信任体系的根。
注意:这里说的“密钥”在Windows AD中通常指的就是NTLM哈希或AES密钥。
krbtgt账户的密码哈希,就是整个域森林的“皇冠上的明珠”。
2.2 认证流程三步走与票据生成
现在我们看一个完整的、简化的认证流程,重点关注票据是如何产生的:
第一步:获取票据授予票据
- 客户端向AS发送一个认证请求,包含自己的用户名。
- AS在AD中查找该用户,用该用户的密钥(由密码哈希派生)加密生成一个“会话密钥A”。
- AS将这个用用户密钥加密的“会话密钥A”,连同用KDC密钥加密的TGT(里面也包含了“会话密钥A”和客户端信息等),一起打包发给客户端。
- 客户端收到后,用自己的密码哈希解密第一部分,得到“会话密钥A”。至此,客户端拥有了TGT和会话密钥A,但无法读取TGT的内容,因为TGT是用KDC密钥加密的。
第二步:获取服务票据
- 当客户端需要访问特定服务时,它会构建一个认证器(用会话密钥A加密的时间戳等信息),连同TGT一起发送给TGS。
- TGS用KDC密钥解密TGT,验证其有效性,并取出里面的会话密钥A。
- TGS用会话密钥A解密认证器,验证时间戳(防重放)。
- 验证通过后,TGS生成一个新的“会话密钥B”供客户端和服务之间通信。
- TGS将两部分内容发回客户端:一部分用会话密钥A加密(包含会话密钥B),另一部分是服务票据ST(用服务密钥加密,里面包含了会话密钥B和客户端信息)。
第三步:访问服务
- 客户端用会话密钥A解密第一部分,得到会话密钥B。
- 客户端构建一个新的认证器(用会话密钥B加密),连同ST一起发送给目标服务。
- 服务用自己的密钥(服务账户密码哈希)解密ST,得到会话密钥B,再用它会话密钥B解密认证器进行验证。
- 验证通过,服务向客户端提供访问。
这个流程的精妙之处在于:密码哈希从未在网络上传输;TGT和ST都是被加密的票据,客户端不能篡改;整个信任链源于KDC密钥。而黄金和白银票据攻击,正是从不同位置撕裂了这个信任链。
3. 黄金票据攻击:伪造域内的“万能护照”
理解了Kerberos流程,黄金票据的原理就呼之欲出了。它的核心在于直接伪造TGT票据。
3.1 攻击原理与必要条件
在正常的流程中,TGT是由KDC用krbtgt账户的密钥加密的。客户端无法伪造,因为它不知道krbtgt的密码哈希。黄金票据攻击的前提,就是攻击者已经通过某种手段(例如域控提权、抓取内存中的LSASS进程 dump)获取了krbtgt账户的密码哈希。
拥有了这个哈希,攻击者就拥有了与KDC相同的加密能力。他可以:
- 完全脱离KDC,自己制作一张TGT。
- 在这张自制的TGT里,他可以声明自己是任何用户(包括不存在的用户),属于任何组(比如域管理员组)。
- 因为这张TGT是用正确的
krbtgt密钥加密的,所以当攻击者拿着它去TGS请求服务票据时,TGS会完全信任它,认为这是一张由合法KDC颁发的票据。
攻击的必要条件有三个,缺一不可:
krbtgt账户的密码哈希:这是最核心的素材。- 域名:知道是哪个域。
- 域的安全标识符:每个域唯一的SID。
后两者信息在域内是公开的,很容易获取。所以,整个攻击的成败关键就在于能否拿到krbtgt的哈希。
3.2 实操步骤与深度解析
假设我们已经通过漏洞拿到了域控权限,并导出了krbtgt的哈希。接下来,在任意一台已加入域的机器(甚至是一台受控的域内机器)上,都可以发起攻击。这里以Mimikatz工具为例:
# 在Mimikatz中执行黄金票据生成命令 kerberos::golden /admin:Administrator /domain:contoso.com /sid:S-1-5-21-123456789-987654321-555555555 /krbtgt:a9bcf3e45d1e5e8f0123456789abcdef0 /ptt/admin:Administrator:这里指定你要伪造的用户名。你可以填Administrator,也可以填FakeUser$,甚至CEO。TGS只验证票据的加密有效性,不关心票据里的用户名在AD里是否存在。/domain和/sid:公开信息。/krbtgt:最关键的krbtgt账户的NTLM哈希。/ptt:表示“传递票据”,即直接将生成的黄金票据注入到当前Windows会话的内存中,立即生效。
执行成功后,当前命令行窗口的会话就拥有了你所伪造用户的权限。你可以使用dir \\dc.contoso.com\c$或psexec等工具进行横向移动,畅通无阻。
3.3 黄金票据的威力与局限性
威力:
- 持久性极强:黄金票据的有效期在制作时可以设定,最长可达10年(Kerberos策略中的
Maximum lifetime for user ticket)。这意味着攻击者可以制造一个持续数年有效的后门。 - 权限至高:可以伪造域内任何用户,包括域管理员。
- 独立于KDC:一旦生成,就不再需要与KDC交互。即使域控宕机或网络隔离,只要票据在有效期内,攻击者依然可以在域内横向移动。
局限性/可检测性:
- 无法更新TGT:正常的TGT到期前,客户端会用它去TGS申请新的TGT(续订)。黄金票据是伪造的,无法完成这个续订流程。因此,在域控的日志中,你会看到某个用户(尤其是高权限用户)只有TGS请求日志,而没有对应的AS请求(首次获取TGT)日志。这是一个非常可疑的迹象。
- 票据信息异常:黄金票据中的某些字段可能与正常票据不同,例如认证时间、加密类型等。专业的终端检测与响应工具或SIEM可以通过分析票据特征进行发现。
- 依赖初始入侵:必须先拿到
krbtgt哈希,这通常意味着域控已经失陷。
实操心得:在应急响应中,如果发现一个域管账号在非工作时间、从非常用终端发起大量横向移动,并且只有TGS日志,没有AS日志,黄金票据攻击的可能性就非常高了。此时,仅仅重置该域管账号的密码是没用的,必须重置
krbtgt账户的密码。
4. 白银票据攻击:伪造通往特定服务的“后门钥匙”
如果说黄金票据是伪造护照,那么白银票据就是伪造某个国家的签证或者某个俱乐部的会员卡。它的攻击面更窄,但更隐蔽。
4.1 攻击原理与必要条件
白银票据攻击绕过了前两步,直接伪造访问特定服务所需的服务票据。
在正常流程中,ST是由TGS用目标服务的密钥(服务账户的密码哈希)加密后发给客户端的。服务在收到ST后,用自己的密钥解密验证。白银票据攻击的前提是,攻击者获取了某个特定服务账户的密码哈希。
拥有了这个哈希,攻击者可以:
- 完全不需要与KDC(AS和TGS)进行任何交互。
- 直接伪造一张访问该服务的ST。
- 因为这张ST是用正确的服务密钥加密的,所以目标服务会认为它是一张由合法TGS颁发的票据,从而允许访问。
攻击的必要条件:
- 目标服务账户的密码哈希:例如,要伪造访问C$共享的票据,就需要域控制器计算机账户(如DC$)的哈希;要伪造访问SQL服务,就需要SQL服务运行账户的哈希。
- 域名。
- 域SID。
- 目标服务的SPN:服务主体名称,用于唯一标识一个服务,如
CIFS/dc.contoso.com。
4.2 实操步骤与场景分析
假设我们通过横向移动,在一台Web服务器上抓取到了本地管理员哈希,并发现该服务器以域用户svc_sql的身份运行了SQL Server服务。我们获取了svc_sql的密码哈希。
现在,我们可以从域内任何位置(甚至是一台未加入域的机器,只要它能连接到目标服务器),直接伪造访问该SQL Server的票据:
# 使用Mimikatz伪造白银票据 kerberos::golden /domain:contoso.com /sid:S-1-5-21-123456789-987654321-555555555 /target:sqlsrv.contoso.com /service:MSSQLSvc /rc4:1a2b3c4d5e6f7890abcdef1234567890 /user:fakeuser /ptt/target和/service:这构成了SPN的一部分(MSSQLSvc/sqlsrv.contoso.com)。/rc4:这里使用的是服务账户svc_sql的NTLM哈希(在命令中参数名仍为/rc4,但实际传入哈希值)。/user:可以任意指定一个用户名,服务只验证票据加密,不验证用户是否存在或是否有权限(但服务内部可能仍有自己的ACL检查)。
注入票据后,你就可以使用sqlcmd等工具,以fakeuser的身份直接连接sqlsrv.contoso.com的SQL服务,而无需任何密码。
4.3 白银票据的隐蔽性与局限性
隐蔽性:
- 无KDC交互:整个攻击过程不涉及与域控的通信。在域控的Kerberos日志中,完全不会留下任何记录。这是它比黄金票据隐蔽得多的根本原因。
- 针对性极强:只针对单一服务,动静小。
局限性:
- 权限受限于服务:你只能访问该票据所针对的服务。伪造了C$共享的票据,就能访问文件系统;伪造了LDAP服务的票据,就能查询或修改AD对象。但你不能用它去申请访问其他服务的票据。
- 无法获取PAC验证:PAC是放在TGT和ST里的一个特权属性证书,包含了用户的组成员关系等信息。在白银票据攻击中,由于没有经过KDC,攻击者可以自己构造PAC,但通常构造一个“空PAC”或最小权限的PAC。一些敏感服务(如域控的LDAP服务)可能会要求验证PAC的KDC签名,而自制的PAC没有这个签名,可能导致访问被拒绝。但对于很多服务(如文件共享、普通Web服务)来说,它们不验证PAC,因此攻击依然有效。
- 需要获取服务哈希:虽然不如
krbtgt哈希那么核心,但获取特定服务账户的哈希也需要一定的入侵深度。
踩坑实录:在一次红队演练中,我们通过白银票据成功访问了一台文件服务器,并上传了工具。但在尝试通过WMI在该服务器上执行命令时失败了。原因是文件共享服务和WMI服务对应的是同一个计算机账户,但它们的SPN不同。我们伪造的是
CIFS服务的票据,而WMI服务需要HOST或RPCSSSPN的票据。这是一个典型的对服务边界理解不清导致的错误。解决方案是,要么获取该计算机账户的哈希,然后为HOST服务也伪造一张白银票据;要么利用已有的文件访问权限,尝试抓取该服务器内存中的哈希,向更深处渗透。
5. 防御、检测与响应:构建票据攻击的免疫系统
了解了攻击原理,防御的思路就清晰了:保护密钥、监控异常、快速响应。
5.1 预防阶段:加固信任根基
- 保护
krbtgt账户:这是防御黄金票据的重中之重。- 定期重置
krbtgt密码:微软官方建议,在域功能级别为Windows Server 2008及以上时,至少每180天重置两次krbtgt账户密码。具体操作有严格顺序(先重置一次,等待复制,再重置一次),目的是同时让新旧哈希都失效。这是一个“伤筋动骨”的操作,需要仔细规划。 - 启用Credential Guard:对于Windows 10/11和Server 2016+,启用Credential Guard可以基于虚拟化安全来保护派生凭证,能有效防止内存中抓取哈希,从而切断获取
krbtgt和服务账户哈希的路径。
- 定期重置
- 保护服务账户:
- 使用组托管服务账户:对于运行服务的账户,强烈建议使用gMSA。它的密码由AD自动管理,非常复杂且定期自动轮换,管理员都看不到明文密码,极大增加了获取其哈希的难度。
- 遵循最小权限原则:为服务账户分配刚好够用的权限,避免使用域管理员等高权限账户运行服务。
- 使用强密码和定期轮换策略。
- 强化域控安全:域控是密钥的保管库。必须实施最严格的安全措施,包括及时打补丁、限制管理员登录、启用攻击面减少规则等。
5.2 检测阶段:发现异常活动的蛛丝马迹
防御不可能100%成功,因此检测至关重要。
- 监控Kerberos事件日志:在域控上启用详细的Kerberos服务日志。
- 事件ID 4768:TGS票据请求成功。重点关注:同一个高权限用户在短时间内从大量不同计算机请求票据;请求的服务类型异常(如域管理员频繁请求访问普通文件共享)。
- 事件ID 4769:服务票据请求成功。结合4768分析,如果只有4769而没有对应的4768(AS请求),是黄金票据的强指示器。对于白银票据,域控上根本不会有日志,这本身也是一个需要关注的异常点——重要的服务访问为何没有认证记录?
- 事件ID 4771:Kerberos预身份验证失败。但黄金/白银票据攻击通常不触发此日志,因为攻击者绕过了预认证。
- 分析票据特征:
- 加密类型:正常的票据加密类型会遵循域策略。攻击工具生成的票据可能使用非标准的加密类型。
- 票据有效期:攻击者可能设置超长的有效期。
- 票据中的时间戳:票据的起止时间与认证时间的关系是否合理。
- 终端行为监控:
- 异常进程行为:检测如Mimikatz、Rubeus等攻击工具的执行。
- 异常的票据缓存操作:监控对
LsaCallAuthenticationPackage的调用,特别是用于票据传递的操作。 - 网络流量分析:检测不经过域控的Kerberos服务访问(可能为白银票据),或异常的Kerberos流量模式。
5.3 应急响应:攻击发生后的补救措施
一旦确认发生票据攻击,必须快速、有序地响应。
- 遏制与隔离:
- 立即隔离被确认为攻击跳板的机器。
- 如果攻击者使用了伪造的域管账号,在AD中临时禁用该账号(注意,这只是阻止其用真密码登录,对已存在的黄金票据无效)。
- 清除攻击者票据:
- 在受控的终端上,使用
klist purge命令清除当前会话的所有Kerberos票据。 - 在域控上,可以强制吊销特定用户的票据,但操作复杂且影响面广。
- 在受控的终端上,使用
- 根除威胁:
- 对于黄金票据:必须重置
krbtgt账户密码两次。这是唯一能使所有已颁发的黄金票据失效的方法。重置后,所有域内计算机需要重新认证,可能会引起短暂的服务中断。 - 对于白银票据:重置对应服务账户的密码。如果服务账户是gMSA,其密码会自动轮换,但需要确认轮换周期。
- 全面排查域控,找出攻击者获取哈希的初始入侵途径并修复(如修补漏洞、清除后门、修复错误配置)。
- 对于黄金票据:必须重置
- 恢复与加固:
- 在确认环境干净后,恢复被隔离的系统。
- 实施更严格的监控策略。
- 审查并加固所有服务账户和域控安全配置。
6. 进阶思考:从Kerberos到现代身份安全的延伸
黄金票据和白银票据虽然是基于传统Kerberos协议的经典攻击,但其背后“窃取或伪造信任根”的思想,在现代身份安全领域依然具有普遍意义。
- 云环境下的“票据”:在Azure AD中,相当于
krbtgt的是租户根密钥。攻击者如果获取了应用程序的客户端密钥或证书,就可以伪造令牌来访问该应用代表的资源,这可以看作是云上的“服务票据”攻击。而如果攻击者能篡改或伪造SAML令牌签名证书,其影响范围则堪比“黄金票据”。 - 双因素认证的局限:Kerberos票据攻击清晰地展示了,在身份验证链的初始环节之后,后续的授权环节完全依赖于密码学票据。即使初始登录有双因素认证,一旦攻击者通过内存抓取等方式获得了有效的TGT或会话密钥,就可以完全绕过MFA。这强调了保护认证后令牌的重要性。
- 零信任架构的启示:零信任的核心理念是“从不信任,始终验证”。传统的Kerberos模型在第一次认证后,就基于票据授予了广泛的信任。零信任模型则要求对每一次访问请求,都进行更细粒度的、基于动态策略的重新评估,这能从架构上缓解票据传递攻击带来的风险。
理解黄金票据和白银票据,不仅仅是掌握两种攻击技术,更是深入理解整个基于票据的身份认证体系的安全边界和薄弱环节。作为防御者,我们需要像攻击者一样思考,才能构建出真正纵深、有效的身份安全防御体系。从保护最核心的密钥开始,到部署全方位的检测手段,再到建立成熟的应急响应流程,每一步都至关重要。安全是一场持续的攻防对抗,而对基础协议的深刻理解,永远是我们最坚实的盾牌。