1. 项目概述:从攻击者视角看票据的“含金量”
在攻防对抗的深水区,权限维持是攻击者得手后、防守方溯源前最关键的“中场战事”。你费尽心思拿到了一个域管理员的密码哈希,登录进去转了一圈,然后呢?下次还想进来,难道每次都去撞密码或者利用漏洞吗?防守方的安全设备可不是摆设,频繁的异常登录行为很快会触发告警。这时候,一种近乎“艺术”的隐蔽后门技术就登场了——Kerberos协议下的黄金票据(Golden Ticket)与白银票据(Silver Ticket)。这可不是真的金银,而是攻击者对Kerberos身份认证协议核心组件进行伪造的两种攻击手法,其目的在于实现长期的、难以被常规手段检测的权限维持。
简单来说,你可以把企业的Windows域环境想象成一个高度安全的俱乐部。Kerberos就是俱乐部的会员认证系统。你想进入俱乐部内的各个场馆(如文件服务器、邮件服务器),都需要向中心的票据授权服务(TGT)出示你的会员卡(密码哈希)来换取一张通用入场券(TGT),再用这张通用入场券去各个场馆门口换取具体的场馆门票(ST)。黄金票据,就是攻击者直接伪造了俱乐部的“总会员卡模具”(krbtgt账户的哈希),可以自己签发任意用户的、永久有效的通用入场券。而白银票据,则是攻击者针对某个特定场馆(如文件服务器),伪造了该场馆的“门票印刷机”(服务账户的哈希),直接制作进入该场馆的门票,但无法去其他场馆。
为什么安全从业者必须搞懂这个?因为这是内网横向移动和高级持续性威胁(APT)攻击中的经典手段。防守方如果只盯着登录日志,很可能完全发现不了这种利用合法协议机制的“隐身攻击”。通过本文,我将以一个渗透测试员的视角,带你彻底拆解这两种票据的生成原理、实战利用手法、关键依赖条件,以及最重要的——如何从防御端进行检测和发现。我们不仅要知道怎么“攻”,更要深刻理解如何“防”。
2. Kerberos协议精要:理解攻击的基石
要伪造票据,你必须先理解真票据是如何诞生的。Kerberos协议是一个三头犬守护的认证系统,核心流程涉及三个角色:客户端(Client)、密钥分发中心(KDC,在AD中通常由域控制器DC扮演)、以及应用服务器(Server)。
2.1 核心认证流程四步走
整个标准流程可以概括为以下四个步骤,这是所有票据攻击的“攻击面”来源:
第一步:认证服务交换(AS-REQ & AS-REP)—— 获取TGT客户端向KDC的认证服务(AS)发起请求,说:“我是用户Alice,我想访问域内服务。”客户端不会直接发送密码,而是发送用密码派生出的密钥加密的时间戳。KDC的AS检查这个时间戳,如果解密成功且时间合理,就认为密码正确。随后,KDC会生成一个会话密钥(Session Key),这个密钥是后续客户端与KDC通信的临时密钥。然后,KDC制作一个票据授予票据(TGT)。TGT里包含了客户端身份信息、时间戳、以及刚才生成的会话密钥等。关键来了:这个TGT是用krbtgt账户的哈希(NTLM Hash)进行加密的。最后,KDC将用客户端密钥(由用户密码哈希派生)加密的会话密钥和用krbtgt哈希加密的TGT,一起打包回复给客户端。客户端拿到后,能用自己密码解密出会话密钥,但无法解密TGT,因为那是krbtgt的密钥加密的。
注意:这里就引出了黄金票据攻击的第一个关键点:krbtgt账户的NTLM Hash。谁拥有它,谁就拥有了签发TGT的“玉玺”。
第二步:票据授予服务交换(TGS-REQ & TGS-REP)—— 获取ST现在客户端有了TGT和会话密钥,当它想访问某个具体服务(比如文件服务器CIFS/HOST-SRV01)时,它会向KDC的票据授予服务(TGS)发起新的请求。这个请求里包含:用会话密钥加密的客户端身份信息、时间戳(称为认证器Authenticator),以及刚才那个加密的TGT。TGS收到后,用krbtgt的密钥解密TGT,取出里面的会话密钥,再用这个会话密钥去解密认证器。如果认证器里的时间戳和TGT里的信息匹配,认证就通过了。接着,TGS会生成一个新的服务会话密钥,用于客户端和最终服务之间的通信。然后,TGS制作一张服务票据(ST),里面包含了客户端身份、新的服务会话密钥等。这个ST是用目标服务账户的哈希(NTLM Hash)加密的。最后,TGS将用客户端-TGS会话密钥加密的服务会话密钥和用服务哈希加密的ST,回复给客户端。
注意:这里引出了白银票据攻击的关键点:特定服务账户的NTLM Hash。谁拥有它,谁就可以绕过KDC,直接伪造访问该服务的ST。
第三步:客户端-服务器交换(AP-REQ & AP-REP)—— 访问服务客户端拿着从TGS那里得到的ST和用会话密钥加密的服务会话密钥,去连接目标服务器。它向服务器发送一个请求,包含:用服务会话密钥加密的认证器,以及那个加密的ST。服务器用自己的哈希解密ST,取出服务会话密钥,再用这个密钥解密认证器进行验证。成功后,服务器就允许客户端访问了。
2.2 关键数据结构与密钥
理解票据的构成,才能知道伪造要填哪些字段:
- TGT:核心字段包括客户端用户名、域名、登录时间戳、TGT有效期、会话密钥等。全部由
krbtgt hash加密。 - ST:核心字段包括客户端用户名、服务名(SPN)、服务会话密钥、有效期等。全部由
服务账户hash加密。 - 加密类型:现代Windows域默认使用
AES256_CTS_HMAC_SHA1_96或RC4_HMAC。获取哈希时需注意对应类型。RC4对应的是NTLM Hash,AES对应的是AES Key(可从内存或NTDS.dit中提取)。
3. 黄金票据攻击深度解析:伪造“玉玺”
黄金票据攻击的本质,是攻击者已经掌握了域内最高权限(如域管理员),并成功获取了krbtgt账户的NTLM哈希。之后,他可以在完全脱离域控的情况下,为任意用户(包括不存在的用户)伪造一张有效的TGT。
3.1 攻击前提与条件
要成功实施黄金票据攻击,你必须集齐以下“龙珠”:
- 域的SID(Security Identifier):即域的安全标识符,格式如
S-1-5-21-123456789-1234567890-123456789。这可以通过whoami /user、nltest /dsgetdc:域名或Get-ADDomain(PowerShell)轻松获取。 - krbtgt账户的NTLM哈希(或AES密钥):这是攻击的核心。通常需要通过域控权限(如域管理员)来转储
NTDS.dit数据库(使用secretsdump.py、mimikatz的lsadump::dcsync等工具),或者从域控的内存中直接提取(mimikatz的lsadump::lsa /patch)。 - 要伪造的用户名:可以是任何用户名,如
administrator、fakeuser,甚至是一个域中不存在的用户。 - 域名:完全限定域名(FQDN),例如
contoso.com。
3.2 实战操作流程
假设我们已经通过漏洞拿到了域控权限,并成功提取了所需信息:
- 域名:
contoso.com - 域SID:
S-1-5-21-123456789-1234567890-123456789 - krbtgt NTLM Hash:
b0974b8f8c7c4e2f9a5d3b8c7a6f5e4d
步骤一:信息收集在域控或拥有域管理员权限的主机上执行:
# 使用 mimikatz 转储 krbtgt 哈希 mimikatz # privilege::debug mimikatz # lsadump::dcsync /domain:contoso.com /user:krbtgt从输出中找到NTLM或AES密钥。
步骤二:生成黄金票据我们使用mimikatz在攻击者机器上(无需连接域控)生成票据文件(.kirbi):
mimikatz # kerberos::golden /domain:contoso.com /sid:S-1-5-21-123456789-1234567890-123456789 /rc4:b0974b8f8c7c4e2f9a5d3b8c7a6f5e4d /user:fakeadmin /id:500 /groups:512 /ptt/user:指定伪造的用户名,这里用fakeadmin。/id:指定用户的RID,500通常是内置管理员账户的RID,这会让目标系统将其识别为管理员。/groups:指定用户所属的组RID,512是“Domain Admins”组的RID,赋予其域管理员权限。/ptt:表示“Pass The Ticket”,直接将生成的票据注入到当前Windows会话的内存中,立即生效。
步骤三:验证与利用票据注入后,你可以立即尝试访问域内资源,无需密码:
dir \\dc01.contoso.com\c$如果成功列出目录,说明黄金票据生效。此时,你可以使用PsExec、WMI、Scheduled Task等工具,以fakeadmin的身份在域内任何机器上执行命令,实现持久的横向移动。
3.3 黄金票据的威力与局限
威力:
- 持久性极强:黄金票据的有效期默认与
krbtgt账户的密码策略一致。在Windows Server中,krbtgt账户密码默认每30天自动更改一次。但关键在于,即使密码更改,之前使用旧哈希生成的黄金票据在有效期内依然有效。只有重置两次密码(使所有历史密钥失效)才能彻底清除威胁。攻击者一旦获得哈希,几乎可以获得域的“永久”访问权。 - 完全离线制作:生成票据不需要与域控有任何网络通信,隐蔽性高。
- 权限任意指定:可以伪造任意用户、任意高权限组(如Enterprise Admins, Schema Admins)。
局限与实操心得:
- 依赖初始高权限:你必须先拿到域管理员或同等权限,才能获取
krbtgt哈希。这通常不是攻击的起点,而是横向移动的结果。 - 无法更新PAC:PAC(特权属性证书)是TGT中包含的授权数据。黄金票据是静态伪造的,其PAC信息在创建时就固定了。如果域内用户权限发生变化(如被踢出管理员组),黄金票据的权限不会自动更新,但初始赋予的高权限通常已足够。
- 检测点:由于黄金票据是伪造的TGT,它不会在域控的TGT颁发日志(事件ID 4768)中留下对应记录。但目标服务端(如文件服务器)在验证ST时,如果记录了事件ID 4769,其中可能会包含一个来自“未知”或异常KDC(因为票据是伪造的)的请求。这是检测的突破口之一。
4. 白银票据攻击深度解析:伪造“门票”
白银票据攻击的粒度更细。攻击者获取了某个特定服务(如CIFS文件共享、HTTPWeb服务)账户的哈希,然后直接伪造访问该服务的ST。它完全绕过KDC,不与域控产生任何交互。
4.1 攻击前提与条件
实施白银票据攻击,你需要:
- 目标服务账户的NTLM哈希(或AES密钥):例如,文件服务器
SRV01$计算机账户的哈希,或者一个专门注册了SPN的用户账户(如MSSQLSvc/sql01.contoso.com)的哈希。 - 域名:
contoso.com。 - 目标服务器名:
srv01.contoso.com。 - 服务类型(SPN):如
cifs(文件共享)、http(Web服务)、mssql(SQL Server)等。 - 要伪造的用户名:通常可以是一个域内存在的低权限用户,甚至可以是任意用户名,因为服务端只验证票据加密是否正确,而不总是去KDC验证用户(取决于配置)。
4.2 实战操作流程
假设我们通过横向移动,在服务器SRV01上获取了其本地SYSTEM权限,并导出了其计算机账户的哈希:
- 目标服务器:
srv01.contoso.com - 服务类型:
cifs - 计算机账户NTLM Hash:
a1b2c3d4e5f67890123456789abcdef0
步骤一:获取服务账户哈希在已攻陷的服务器SRV01上:
mimikatz # privilege::debug mimikatz # sekurlsa::logonpasswords在输出中寻找SRV01$账户的NTLM或AES密钥。
步骤二:生成白银票据在攻击者机器上,同样使用mimikatz生成并注入票据:
mimikatz # kerberos::golden /domain:contoso.com /target:srv01.contoso.com /service:cifs /rc4:a1b2c3d4e5f67890123456789abcdef0 /user:lowprivuser /ptt注意:这里使用的命令模块仍然是kerberos::golden,但参数不同,指定了具体的/target和/service,这实际上生成的是白银票据。
步骤三:验证与利用票据注入后,直接访问该服务器的共享:
dir \\srv01.contoso.com\c$成功访问。由于白银票据只针对特定服务,你无法用这张票据去访问srv01上的其他服务(如HTTP),除非你拥有对应服务的哈希并伪造了另一张票据。
4.3 白银票据的特性与防御难点
特性:
- 高度隐蔽:整个攻击过程不与KDC(域控)通信。域控上完全看不到相关的票据请求(事件ID 4769)日志,因为请求根本没发到域控。
- 作用范围精准:只针对单一服务,不影响其他服务,动作小,不易引发全局告警。
- 权限灵活:伪造的用户可以是低权限用户,因为很多服务(如
CIFS)主要验证票据真伪,对用户权限的检查可能发生在文件系统ACL层面。如果你伪造了一个管理员用户,就能直接获得高权限访问。
防御难点与实操心得:
- 哈希获取相对容易:服务账户(尤其是计算机账户)的哈希,可以通过本地提权(如获取
SYSTEM权限)后从内存(LSASS进程)中导出。这比获取krbtgt哈希的门槛低得多。 - 检测完全依赖终端:由于不经过KDC,检测只能发生在承载服务的终端服务器上。需要仔细分析安全日志(事件ID 4624登录、4648登录尝试、4672特殊权限分配等),寻找异常的用户登录行为,尤其是来自非常规IP或用户的、针对特定服务的高权限访问。
- 白银票据的“有效期”:伪造的ST有效期可以任意设置(默认10小时)。但服务端在验证时,会检查票据的时间戳。如果客户端与服务端的时间差超过策略允许的时钟偏差(默认5分钟),票据会被拒绝。因此,攻击者有时需要先同步时间。
5. 黄金票据与白银票据的对比与抉择
在真实的渗透测试或攻击中,选择哪种票据,取决于你的目标、已获取的权限和想要达到的隐蔽程度。
| 特性维度 | 黄金票据 (Golden Ticket) | 白银票据 (Silver Ticket) |
|---|---|---|
| 攻击核心 | 伪造TGT(入场券) | 伪造ST(具体场馆门票) |
| 所需密钥 | krbtgt账户的Hash | 特定服务账户的Hash |
| 攻击影响 | 全域性。可访问域内任何服务。 | 局部性。仅能访问特定服务。 |
| 与KDC交互 | 获取ST时需要与KDC交互(TGS-REQ)。 | 完全绕过KDC,直接访问服务。 |
| 隐蔽性 | 相对较低。在域控的TGS请求日志(事件ID 4769)中可能留下异常记录(如请求来自非域控)。 | 极高。全程不与域控通信,域控无日志。 |
| 获取难度 | 高。需要域管理员级别权限来导出krbtgt Hash。 | 较低。只需要目标服务器的本地管理员权限。 |
| 典型用途 | 建立稳固的、全域的后门,用于长期控制。 | 针对特定高价值目标(如数据库、文件服务器)进行精准、隐蔽的访问。 |
如何选择?
- 如果你已经拿下域控:优先获取
krbtgt哈希,制作黄金票据。这是建立战略级后门的第一步。同时,也可以针对关键业务服务器制作白银票据,作为备用通道。 - 如果你只拿下一台服务器:优先获取该服务器的机器账户哈希,制作白银票据。用它来维持对该服务器的访问,并尝试以此为跳板,通过PsExec等工具(使用白银票据认证)横向移动,获取更多服务器的哈希,最终目标仍是域控和
krbtgt哈希。 - 追求极致隐蔽:在已获取域控权限后,针对核心业务系统(如SQL Server、文件服务器)额外制作白银票据。日常渗透使用白银票据,避免触发与域控相关的监控。黄金票据作为“核武器”备用。
6. 防御、检测与响应实战指南
理解了攻击,防御才能有的放矢。防御黄金/白银票据攻击是一个系统工程,需要层层设防。
6.1 预防阶段:让攻击者拿不到“钥匙”
保护krbtgt账户:
- 定期重置krbtgt密码:这是最有效的措施。微软官方建议,在怀疑krbtgt账户泄露时,应连续重置两次。因为Kerberos协议会保留当前和上一次的密码用于票据解密,重置一次后,旧票据在有效期内仍可能被使用。重置两次才能彻底让所有旧票据失效。操作需谨慎,需参考微软官方文档,并在维护时段进行,因为会暂时影响域内所有计算机的认证。
- 监控krbtgt账户活动:该账户正常情况下绝不应该有登录行为。任何针对
krbtgt的登录事件(事件ID 4624)都是最高级别的警报。
实施最小权限原则与凭据保护:
- 限制域管理员使用:域管理员账户仅用于域管理任务,禁止用于登录普通服务器和工作站。使用“受保护用户”组、Just Enough Administration (JEA)等机制。
- 启用Credential Guard(Windows 10/11, Server 2016+):这是一项基于虚拟化的安全功能,能将LSASS进程中的密钥、凭据隔离在安全内核中,使
mimikatz等工具无法直接从内存中读取哈希。这是防御哈希窃取的关键。 - 应用本地管理员密码解决方案(LAPS):确保每台计算机的本地管理员密码不同且定期随机更改,增加攻击者通过本地提权获取哈希的难度。
强化服务账户管理:
- 为服务使用组托管服务账户(gMSA),其密码由AD自动管理,长且复杂,定期自动轮换,降低了服务账户哈希被窃取和利用的风险。
- 避免高权限账户注册SPN。
6.2 检测阶段:发现“异常”的票据
域控制器日志监控(针对黄金票据):
- 事件ID 4769:票据请求服务操作:仔细查看该事件中的
Client Address字段。如果TGS请求不是来自域控本身(即票据不是由本域控签发的),但却收到了一个有效的TGT,这极可能是黄金票据的迹象。因为攻击者用伪造的TGT来申请ST时,请求是从攻击者主机直接发到域控的TGS服务。 - 事件ID 4672:特殊权限分配:监控是否有异常用户(尤其是新创建或非常用用户)被添加进高权限组,这可能与伪造票据时指定的高权限有关。
- 事件ID 4769:票据请求服务操作:仔细查看该事件中的
终端服务器日志监控(针对白银票据):
- 事件ID 4624:账户成功登录、事件ID 4648:使用显式凭据登录尝试:关注登录类型。Kerberos服务票证对应登录类型3(网络登录)。寻找异常:例如,一个普通用户账户频繁通过类型3登录访问敏感服务器;来自非企业IP范围的Kerberos网络登录。
- 对比分析:白银票据攻击在服务端会产生登录成功日志(4624),但在域控上没有对应的4769票据请求日志。这种“成功登录却无票据颁发记录”的割裂现象,是检测白银票据的强信号。可以通过SIEM(如Splunk, Elastic SIEM)关联分析来自动化发现此类异常。
使用专业工具进行狩猎:
- Mimikatz (defensive mode):是的,攻击工具也可以用于防御。在受控环境下,使用
mimikatz的kerberos::list命令可以查看当前会话中的票据。检查票据的End Time是否异常长(黄金票据可能被设置为数年),或者检查票据的Server Name是否与预期不符。 - Rubeus:这是一个强大的Kerberos安全测试工具,其
monitor命令可以用于监控域内的票据活动。 - Microsoft Defender for Identity(原Azure ATP):这款企业级产品能基于域控制器流量和日志,利用机器学习模型检测包括黄金票据、白银票据在内的多种Kerberos攻击,例如“异常协议实现”、“来源异常票据请求”等。
- Mimikatz (defensive mode):是的,攻击工具也可以用于防御。在受控环境下,使用
6.3 响应与处置:清除后门
一旦检测到疑似票据攻击,必须快速响应:
- 立即重置krbtgt账户密码两次:这是遏制黄金票据扩散的首要措施。按照微软KB文章步骤操作。
- 重置受影响的服务账户密码:如果怀疑是白银票据,重置目标服务账户(计算机账户或用户账户)的密码。
- 全面清查:强制域内所有用户重新登录(或重启所有计算机),以清除可能缓存在内存中的恶意票据。在域控上,可以尝试使用
klist purge命令清除所有Kerberos票据,但更有效的是重启域控的Kerberos Key Distribution Center服务。 - 溯源与根除:审查攻击路径,找出最初被攻陷的点(可能是钓鱼邮件、未打补丁的漏洞等),修补漏洞,更改所有可能泄露的凭据。
7. 高级技巧与攻防演进
攻防永远在博弈中升级。除了基础用法,还有一些进阶场景和检测规避技巧。
7.1 黄金票据的“变种”与检测增强
- 时间戳欺骗:Kerberos票据包含开始时间和结束时间。攻击者可以将黄金票据的起始时间设置为过去,结束时间设置为很远的未来(如10年后)。这能绕过一些基于票据有效期的简单检测。防御方需要监控票据生命周期异常长的账户。
- PAC签名绕过(MS14-068):这是一个古老的漏洞,但原理重要。PAC由KDC签名。早期版本的黄金票据伪造可能不包含有效的PAC签名,导致访问某些服务失败。现代工具如
mimikatz在生成黄金票据时,会使用获取的krbtgt密钥正确签名PAC。防御方可以启用Kerberos的“始终提供PAC验证”策略,强制服务端验证PAC签名。
7.2 白银票据的“服务绑定”与约束
- 服务绑定(Sname)必须匹配:伪造的ST中的服务主体名称(SPN)必须与目标服务运行账户注册的SPN完全一致。例如,如果IIS网站运行在
NETWORK SERVICE账户下,其SPN可能是HTTP/webserver.contoso.com。如果你用计算机账户(HOST/...)的哈希伪造HTTP服务的票据,可能会失败。攻击前需要精确枚举目标服务的SPN(使用setspn -L 用户名)。 - AES密钥与RC4哈希:现代系统更倾向于使用AES加密。如果目标服务账户配置了AES密钥,而你只拿到了NTLM Hash(RC4),生成的票据可能会被拒绝。因此,在提取哈希时,最好同时获取AES密钥(
aes256_hmac)和NTLM Hash。
7.3 面向未来的防御思考
- 迈向无密码和强认证:广泛部署Windows Hello for Business、FIDO2安全密钥等,减少对传统密码哈希的依赖,从根本上削弱Pass-the-Hash和票据攻击的基础。
- 深度行为分析:结合UEBA(用户实体行为分析),建立每个用户和服务账户的访问基线。例如,一个开发部门的用户突然在凌晨3点通过Kerberos网络登录访问财务部的SQL服务器,即使票据本身有效,行为模型也会将其标记为高风险。
- 定期攻防演练:使用自动化攻击模拟工具,定期在环境中测试票据攻击的可行性,验证现有防御和检测措施的有效性,持续优化安全策略。
理解黄金票据和白银票据,不仅仅是掌握两种攻击技术,更是深入理解Windows域安全核心——Kerberos认证协议的一把钥匙。从防御角度看,这迫使我们将安全监控从简单的“登录成功/失败”,提升到对认证协议流、票据生命周期和用户行为模式的深度关联分析层面。真正的安全,始于对攻击链的每一环都了如指掌。