1. 项目概述从“票据”到“权限维持”的攻防博弈在域渗透和安全评估的实战中我们经常会听到“黄金票据”和“白银票据”这两个听起来颇具诱惑力的名词。它们不像传统的漏洞利用那样直接获取权限而是像拿到了通往城堡后门的万能钥匙能够在目标系统上实现一种极其隐蔽且持久的权限维持。很多刚接触内网安全的朋友可能会被Kerberos协议、票据、加密算法等概念绕晕感觉门槛很高。今天我就以一个从业者的视角结合大量实战踩坑的经验带大家彻底搞懂这两种“票据”到底是什么、怎么来的、怎么用以及最关键的——如何防御。简单来说你可以把Windows域环境想象成一个高度安全的公司。Kerberos协议就是公司的门禁系统。员工用户要进入某个办公室访问某个服务需要先去前台域控用工牌TGT票据换取一张进入特定办公室的访客单服务票据ST。黄金票据就是伪造了前台用来签发所有工牌的那个“总经理印章”krbtgt账户的NTLM Hash从而可以给自己签发任意员工的工牌想去哪就去哪。而白银票据则是直接伪造了进入某个特定办公室如文件服务器的访客单但前提是你得知道那个办公室门锁的密码服务账户的NTLM Hash。搞懂它们不仅能让你在红队行动中多几种迂回渗透的思路更能让蓝队成员深刻理解为什么仅仅打补丁是不够的还必须保护好那些核心的“密钥”。2. 核心原理深度拆解Kerberos协议与票据的生命周期要理解黄金和白银票据必须先把它们的“出生地”——Kerberos协议捋清楚。很多文章一上来就讲攻击步骤却不讲为什么能这么做导致读者只能照猫画虎遇到环境变化就束手无策。我们抛开复杂的RFC文档用生活化的场景来重建这个过程。2.1 Kerberos认证的三步舞曲假设用户Alice想访问服务器S上的文件共享服务。第一步获取“门票兑换券”TGT - Ticket Granting TicketAlice向认证服务器ASAuthentication Server发送请求“我是Alice我想申请一张门票兑换券。”AS检查域里是否有Alice这个用户。如果存在AS会生成一个会话密钥Session Key A。这个密钥是后续Alice和票据授予服务器TGSTicket Granting Server秘密通信用的。AS准备两样东西TGT票据本身里面包含了Alice的用户名、会话密钥Session Key A的拷贝、时间戳、有效期等信息。这个TGT是用krbtgt账户的密码Hash加密的。所以只有域控持有krbtgt密码才能解密和验证这个TGT。登录会话密钥Logon Session Key这是用Alice的密码Hash加密的Session Key A。AS把这两样东西一起发给Alice。Alice收到后用自己的密码解密出Session Key A。至此Alice手里有了一张自己无法阅读的TGT因为被krbtgt的密钥加密着以及一个只有自己和TGS知道的秘密会话密钥Session Key A。关键点1TGT的核心加密密钥是krbtgt账户的NTLM Hash。谁拥有这个Hash谁就拥有了签发任意用户TGT的能力。这就是黄金票据攻击的根源。第二步用兑换券换取“具体门票”ST - Service TicketAlice现在想访问服务器S。她构建一个请求里面包含她刚才拿到的TGT还是加密状态。一个用Session Key A加密的“认证器”Authenticator里面包含她的用户名、当前时间戳等用于向TGS证明“此刻是我本人在用这个TGT”。她要访问的服务名例如cifs/fileserver.domain.com。Alice将这个请求发送给TGS。TGS收到请求后首先用krbtgt的密码Hash解密TGT取出里面的Session Key A和Alice的用户信息。然后用Session Key A解密认证器核对时间戳防重放、用户名是否与TGT内一致。验证通过后TGS认为Alice是合法的。TGS为Alice访问服务器S生成一张服务票据ST。ST里包含Alice的用户名、用户所属的组SID、一个新的服务会话密钥Service Session Key B的拷贝、时间戳、有效期等。整个ST是用服务器S的计算机账户或服务账户的NTLM Hash加密的。TGS同时生成一个回复给Alice里面包含用Session Key A加密的Service Session Key B以及那个加密后的ST。Alice收到回复用Session Key A解密出Service Session Key B。现在她手里有了访问服务器S的“门票”ST但她自己打不开以及和服务器S通信的临时密钥Session Key B。关键点2ST的核心加密密钥是目标服务账户的NTLM Hash。谁拥有这个Hash谁就可以伪造访问该服务的ST且不需要与域控TGS交互。这就是白银票据攻击的根源。第三步持门票入场AP - Application RequestAlice连接服务器S发送加密的ST。一个用Service Session Key B加密的新的认证器包含当前时间戳等。服务器S用自己的密码Hash解密ST取出Session Key B和Alice的用户信息。然后用Session Key B解密认证器验证时间戳。验证通过后服务器S就允许Alice访问了并根据ST中Alice的组信息SID进行授权。整个流程的精妙之处在于密码Hash密钥本身不在网络上传输票据是重用的但每次认证都附带一个新鲜的时间戳加密块认证器来防重放通过多层会话密钥实现了安全的委派通信。2.2 黄金票据 vs 白银票据核心差异对照表理解了基础流程两者的区别就一目了然了特性黄金票据 (Golden Ticket)白银票据 (Silver Ticket)伪造对象TGT票据特定服务的ST票据所需密钥krbtgt账户的NTLM Hash目标服务账户的NTLM Hash签发机构攻击者自己冒充域控的AS/TGS攻击者自己冒充TGS验证机构域控的TGS和所有服务仅目标服务本身与域控交互完全不需要。TGT是攻击者自签发的后续申请ST时攻击者可以自己充当TGS。完全不需要。ST是攻击者直接伪造给服务的服务自己验证。权限范围极广。可以申请访问域内任何服务的ST因为TGS信任这张TGT。极窄。只能访问特定服务如cifs, http, mssql等。隐蔽性相对较低。因为如果使用黄金票据生成的TGT去申请ST这个行为会记录在域控的日志中Kerberos TGS请求。极高。通信完全在客户端与服务端之间不经过域控域控上没有日志。持久性极强。只要krbtgt的Hash不变默认180天强制改一次且票据在有效期内就一直有效。可以设置超长有效期如10年。依赖服务。只要服务账户的密码/Hash不变票据就有效。但服务账户密码可能更改。核心攻击前提获取域管理员权限从而导出krbtgt的Hash。获取目标服务账户的Hash可通过本地管理员权限在服务器上导出。一个生动的比喻黄金票据你伪造了公安局的印章和空白身份证制作机krbtgt Hash。你可以给自己制作任何人的身份证TGT然后用这个身份证去任何需要查验身份证的场所服务办理业务。虽然办业务时场所可能会记录域控日志但他们无法当场鉴别身份证真伪因为印章是真的。白银票据你偷偷复制了某个高端会所的会员卡磁条数据服务Hash。你可以直接给自己造一张该会所的会员卡ST。进门时刷卡提交ST门禁系统服务用自己的数据一比对通过而且会所总部域控完全不知道有人进来了。3. 实战操作票据的生成与利用原理清晰后我们进入实战环节。这里我会使用最常用的工具Mimikatz进行演示并穿插大量工具之外的细节和注意事项。3.1 环境准备与前置条件在动手之前必须明确你的操作环境和已经获得的权限。已控机器一台已经取得权限的域内机器。无论是通过漏洞利用、钓鱼还是其他方式你需要在这台机器上执行命令。权限要求对于黄金票据你需要域管理员Domain Admin权限或者至少是能够访问域控并导出krbtgt账户Hash的权限例如通过Volume Shadow Copy服务远程读取域控的NTDS.dit文件。这是黄金票据攻击的最高门槛。对于白银票据你需要目标服务器的本地管理员权限以便导出运行在该服务器上的服务账户的Hash。例如要伪造访问文件服务器FS01的CIFS服务票据你需要先攻陷FS01并导出其计算机账户FS01$的NTLM Hash。信息收集除了Hash还需要收集以下信息域名FQDN例如demo.com。域SID域的安全标识符可以通过whoami /user查看当前用户的SID然后去掉最后的-500或-1001等RID部分。例如S-1-5-21-3912242732-261903931-207895847。要冒充的用户名可以是任意存在的域用户甚至是可以不存在的用户黄金票据支持创建“幽灵用户”。通常使用administrator或一个不引人注目的低权限用户。要访问的服务SPN仅白银票据需要例如cifs/fs01.demo.comhttp/webapp.demo.comMSSQLSvc/sql01.demo.com:1433等。3.2 黄金票据攻击全流程假设我们已经通过某种方式如DCSync攻击获取了以下关键信息域名demo.com域SIDS-1-5-21-3912242732-261903931-207895847krbtgt用户的NTLM Hash6c8318e21d33c9e0c2fd8b4ecb4c5a5d我们想冒充的用户fakeuser步骤一在已控主机上使用Mimikatz生成黄金票据# 以管理员权限运行Mimikatz mimikatz # privilege::debug mimikatz # kerberos::golden /domain:demo.com /sid:S-1-5-21-3912242732-261903931-207895847 /rc4:6c8318e21d33c9e0c2fd8b4ecb4c5a5d /user:fakeuser /id:500 /groups:512,513,520,518,519 /ptt参数详解与避坑指南/domain、/sid、/rc4这是核心三要素必须绝对准确。/rc4后面跟的就是krbtgt的NTLM Hash。/user伪造的用户名。这里设置为fakeuser一个域中不存在的用户。这是一个重要的隐蔽技巧使用一个不存在的用户名在域控的用户列表和登录日志中不会出现但票据依然有效因为Kerberos验证的是票据签名krbtgt Hash而不是去AD数据库查询用户是否存在。/id用户的RID。500是内置管理员Administrator的RID。这里我们虽然用户名叫fakeuser但给了它500的RID意味着在权限上它会被识别为“管理员”。/groups用户所属的组RID列表。这里是关键中的关键512: Domain Admins (域管理员组)513: Domain Users (域用户组)520: Group Policy Creator Owners (组策略创建者所有者)518: Schema Admins (架构管理员仅林根域有)519: Enterprise Admins (企业管理员仅林根域有)为什么这么设置在Kerberos的PAC特权属性证书包含在TGT和ST中里记录了用户的组关系。服务端如文件服务器在授权时是看PAC里的组信息而不是实时去AD查询。我们把fakeuser放进所有最高权限组那么用它申请的ST里就会包含这些高权限组的SID从而在访问任何服务时都拥有最高权限。/pttPass The Ticket的缩写。这个参数会将生成的黄金票据直接注入到当前Windows会话的内存中而不是保存到文件。这是最常用、最隐蔽的方式票据只存在于内存重启即消失。执行成功后Mimikatz会输出票据的详细信息并提示“Golden ticket for ‘fakeuser demo.com’ successfully submitted for current session”。此时黄金票据已经加载到你的内存票证缓存中。步骤二验证与利用现在你可以像真正的域管理员一样行动了而且不需要知道域管理员密码。# 使用 dir 命令访问域控的C$共享这是域管理员才有的权限 dir \\dc01.demo.com\c$ # 使用 wmic 在域控上执行命令 wmic /node:dc01.demo.com process call create cmd.exe /c whoami c:\test.txt # 甚至可以使用 psexec 或 wmiexec 等工具直接获取域控的交互式shell你会发现所有这些操作都成功了因为你的请求中携带的ST是由那个“合法”的黄金TGT签发出来的服务端无法拒绝。实操心得1关于票据有效期Mimikatz的kerberos::golden命令默认生成的票据有效期是20小时72000秒。但在实战中为了持久化我们通常会使用/startoffset和/endin参数来设置一个超长的有效期例如10年。mimikatz # kerberos::golden /domain:demo.com /sid:S-1-5-21-... /rc4:... /user:fakeuser /id:500 /groups:512 /startoffset:0 /endin:5256000 /ptt/endin的单位是分钟5256000分钟约等于10年。请注意过于异常的有效期可能在高级安全监控工具中产生告警。3.3 白银票据攻击全流程假设我们已经攻陷了文件服务器FS01并获取了其计算机账户FS01$的NTLM Hasha1b2c3d4e5f67890123456789abcdef0。现在我们想从另一台已控主机WORKSTATION01上伪造票据直接访问FS01的共享而不触发域控日志。步骤一生成白银票据在WORKSTATION01上运行Mimikatzmimikatz # privilege::debug mimikatz # kerberos::golden /domain:demo.com /sid:S-1-5-21-3912242732-261903931-207895847 /target:FS01.demo.com /service:cifs /rc4:a1b2c3d4e5f67890123456789abcdef0 /user:fakeuser /id:1105 /groups:513 /ptt参数详解与避坑指南/domain、/sid同样需要用于构建票据中的域信息。/target目标服务器的完全限定域名FQDN必须与服务的SPN严格匹配。如果服务注册的是cifs/fs01.demo.com这里就必须是fs01.demo.com。/service服务类型这是白银票据的灵魂。它决定了票据能用来做什么。cifs用于文件共享dir \\fs01\c$。http用于Web服务如访问IIS站点或用于WinRM的wsman服务。host用于通用主机访问如WMI、计划任务schtasks。ldap用于查询/修改活动目录需要域控机器账户Hash。MSSQLSvc用于访问SQL Server。选错服务类型票据将完全无效。/rc4这里填的是目标服务账户FS01$的NTLM Hash不再是krbtgt的Hash。/user、/id、/groups与黄金票据类似但这里设置的权限仅对当前伪造的服务有效。例如你即使把/groups设为512Domain Admins这个组信息也只会被FS01上的CIFS服务看到用于决定文件访问权限而不会让你获得域管理员的其他权限。通常为了隐蔽可以设置为一个普通域用户RID1000和Domain Users组513。/ptt同样注入内存。步骤二验证与利用票据注入后立即尝试访问目标服务# 访问文件共享 dir \\fs01.demo.com\c$ # 如果成功列出目录说明白银票据生效。 # 尝试创建文件 echo test \\fs01.demo.com\c$\test_silver.txt整个过程域控DC01完全不知情。所有认证流量只在WORKSTATION01和FS01之间发生。实操心得2服务类型的选择与局限白银票据的威力取决于服务类型。cifs和host非常实用能直接操作文件系统和执行命令。但有些服务如LDAP虽然可以伪造票据但当你尝试用该票据向域控发起LDAP修改请求时域控可能会进行额外的验证例如检查票据中的PAC签名导致失败。而HOST服务通常用于WMI结合schtasks可以非常隐蔽地在目标服务器上创建计划任务来执行payload。记住一个原则白银票据让你“成为”服务眼里的合法用户但你能做什么取决于该服务赋予这个用户的权限以及服务本身的功能。4. 高级技巧、检测与防御掌握了基础攻击方法只是开始实战环境复杂得多如何用得巧、如何防得住才是真正的价值所在。4.1 高级利用技巧黄金票据的“无文件”持久化 生成黄金票据后除了注入内存/ptt还可以保存为文件/ticket:golden.kirbi。这个.kirbi文件可以上传到任何域内机器在需要时用Mimikatz的kerberos::ptt golden.kirbi命令注入。可以将此文件隐藏在注册表、图片隐写中或者作为计划任务定期从远程服务器下载并注入实现“无文件”的持久化后门。白银票据的“服务组合拳” 如果获取了服务器计算机账户的Hash你可以同时为该服务器的多个服务生成票据。例如为FS01生成cifs、host、http如果它运行Web服务的票据依次注入。这样你就可以通过文件共享上传工具通过WMI或计划任务执行通过Web服务管理界面配置实现多维度的控制。票据传递Pass The Ticket, PTT与哈希传递Pass The Hash, PTH的抉择PTH需要目标服务开启NTLM认证现在很多环境已强制要求Kerberos。在横向移动时如果目标系统不支持NTLM或受限PTH会失败。PTT使用白银票据是纯粹的Kerberos认证只要目标服务使用Kerberos域环境默认就能通行。在如今NTLM日益受限的环境中PTT的适用性更广。绕过“Kerberos约束委派”监控 一些高级安全产品会监控异常的Kerberos请求特别是TGS-REQ申请ST的请求。黄金票据攻击在申请ST时会向域控发起TGS-REQ可能被记录。而白银票据攻击根本不发起TGS-REQ直接从客户端到服务端完美绕过这类监控。对于高度敏感的服务白银票据是更隐蔽的选择。4.2 如何检测票据攻击作为防守方不能只依赖预防必须假设攻击者已经拿到了一些Hash并开始检测异常行为。检测黄金票据域控事件ID 4769记录每一次Kerberos服务票据请求。虽然黄金票据本身无法直接检测但可以关注异常请求的账户名不存在攻击者常用不存在的用户名。可以监控4769事件中“账户名”字段对比AD中是否存在该用户。异常的加密类型虽然黄金票据可以使用RC4对应NTLM Hash但正常环境可能更多地使用AES256。监控使用RC4加密的TGS请求特别是来自非域控、非服务器的客户端。异常的时间戳票据的起始时间StartTime是否在请求时间之后或者有效期长得离谱如几年专用检测工具如微软的ATA高级威胁分析或Azure Sentinel中的相关检测规则可以基于机器学习模型识别异常的Kerberos活动模式。蜜罐账户创建一个名为krbtgt_audit的诱饵域用户并监控是否有使用该用户名的Kerberos请求攻击者可能尝试使用此用户名。检测白银票据极其困难因为认证不经过域控。检测点必须放在服务端目标服务器。服务端安全日志事件ID 4624、4634关注登录事件。虽然票据有效但登录的账户名可能异常如不存在的用户、低权限用户从非常规IP登录并执行高权限操作。服务端Kerberos日志在目标服务器上启用Audit Kerberos Service Ticket Operations会生成事件ID 4769。在这里你可以看到是谁客户端用户名用什么票据服务票据来访问本机服务。检查其中的“客户端用户名”是否可疑。网络流量分析如果环境部署了全流量审计可以分析Kerberos AP-REQ数据包。虽然内容加密但可以观察通信模式是否缺少了前期的AS-REQ和TGS-REQ阶段一个直接发起的AP-REQ可能暗示票据是预先伪造好的。4.3 核心防御策略防御的核心理念是提高攻击者获取关键Hash的难度并缩短Hash的有效期。保护krbtgt账户——这是生命线定期更改krbtgt密码这是最有效、最根本的防御措施。微软官方建议在从攻击中恢复后必须连续更改两次krbtgt账户密码。因为Kerberos协议设计新旧密码在短时间内同时有效用于票据续订。只改一次攻击者用旧的黄金票据依然可以申请到有效的ST。连续改两次才能彻底让所有基于旧Hash的票据失效。可以考虑每180天与票据最大生命周期对齐或更短时间主动更改。监控krbtgt账户活动任何对krbtgt账户的直接登录、复制或修改尝试都应是最高级别警报。实施凭证分层管理与保护限制域管理员登录域管理员账户只能登录到域控和必要的管理跳板机绝不允许登录到普通工作站、成员服务器。这能极大降低域管理员凭证在非受控设备上被窃取的风险。使用“受保护用户”组将高权限账户如域管理员、企业管理员添加到“Protected Users”安全组。这会强制使用更安全的Kerberos AES加密并禁止使用NTLM、缓存凭据等增加攻击者获取可用的Hash的难度。启用LSA保护防止Mimikatz等工具从lsass.exe进程内存中抓取明文密码和Hash。部署Credential GuardWindows 10/11, Server 2016使用基于虚拟化的安全VBS将凭证隔离到安全内核中使传统的内存转储攻击失效。强化服务账户管理使用组托管服务账户gMSAgMSA由域自动管理其复杂密码并定期轮换管理员都无需知道密码。这从根本上解决了服务账户密码泄露的问题。对于白银票据攻击如果目标服务使用的是gMSA攻击者即使拿到服务器权限也无法获取到该gMSA的长期有效Hash。为服务账户设置强SPN唯一性避免SPN冲突并确保SPN注册准确。遵循最小权限原则服务账户只拥有完成其功能所必需的最小权限不要赋予域管理员等过高权限。启用高级审计与实时监控在域控和关键服务器上启用详细的Kerberos审计策略如前文所述的事件ID 4769。部署SIEM安全信息和事件管理系统集中收集日志并建立针对异常Kerberos活动的检测规则例如短时间内同一客户端为大量不同服务申请票据可能是黄金票据在枚举、使用RC4加密的高权限请求、不存在的用户名成功认证等。考虑部署EDR终端检测与响应或专门的威胁狩猎团队主动在环境中搜寻与票据攻击相关的IOC入侵指标如Mimikatz的执行痕迹、异常的Kerberos票证缓存操作等。5. 常见问题与疑难排查在实际操作中你会遇到各种各样的问题。这里我整理了几个最典型的案例和解决思路。问题1使用黄金票据后访问某些服务如LDAP被拒绝但访问文件共享正常。原因分析这很可能是因为PAC特权属性证书验证失败。高敏感度的服务如域控上的LDAP、Kerberos更改密码服务KPasswd在收到票据后可能会向域控发起一个额外的“PAC验证”请求以确认票据中的用户和组信息是真实有效的。而黄金票据是自签发的域控在验证时发现签发者krbtgt虽然对但并没有签发过这张TGT的记录因此可能拒绝PAC验证请求。解决方案尝试在生成黄金票据时使用/ptt注入后立即用这个身份去访问一次普通的服务如cifs触发一次完整的TGS交换让域控“看见”这个TGT有时能“预热”PAC验证通道。更可靠的方法是在生成命令中尝试添加/pac参数某些Mimikatz版本支持但并非总是有效。终极方案对于需要PAC验证的服务黄金票据可能受限。此时如果条件允许可以考虑使用钻石票据或蓝宝石票据等更高级的攻击方式它们涉及修补PAC或获取更高级别的密钥或者转而使用白银票据如果已获取目标服务Hash。问题2白银票据生成成功并注入但访问目标服务时提示“访问被拒绝”或“登录失败”。排查步骤检查服务类型/service这是最常见错误。确认目标服务实际使用的SPN。用setspn -L FS01$命令在目标服务器上查看。如果服务是HOST而你用了cifs肯定会失败。检查目标主机名/target必须使用FQDN且严格匹配SPN中的主机名部分。如果SPN是cifs/fs01.demo.com/target必须是fs01.demo.com不能是IP地址也不能是FS01短名称。检查Hash有效性确认你使用的NTLM Hash确实是当前目标服务账户正在使用的密码Hash。如果服务账户密码在你获取Hash之后被更改了旧的票据将立即失效。检查用户权限你伪造的用户/user在目标服务上是否有访问权限例如你伪造了一个普通用户访问c$共享自然会被拒绝。尝试访问一个该用户有权限的共享如\\fs01\share。检查时间同步Kerberos严重依赖时间同步。确保攻击者主机与域的时间偏差在5分钟以内。使用net time \\dc01进行同步。问题3在Mimikatz中执行kerberos::golden命令时提示“ERROR kuhl_m_kerberos_golden_data ; no data supplied”。原因这是Mimikatz版本或参数语法问题。较新版本的Mimikatz对参数格式要求更严格。解决确保所有必要参数都已提供且格式正确特别是/domain、/sid、/rc4。尝试使用/aes128或/aes256参数代替/rc4如果你有服务账户的AES密钥可以从lsass或NTDS.dit中获取。AES是更现代、更推荐的加密类型。查阅你所使用的Mimikatz版本的官方文档或帮助kerberos::golden /?。问题4如何清理内存中的票据在Mimikatz中可以使用命令kerberos::purge来清除当前会话中的所有Kerberos票据。重启计算机或注销用户会话也会清除内存票据。对于防守方如果怀疑某台主机被注入了票据强制重启是最直接的清除方式。理解黄金票据和白银票据不仅仅是掌握两种攻击技术更是深入理解Windows域安全核心——Kerberos认证协议——的绝佳途径。从防御角度看它揭示了“信任链”中最脆弱的环节密钥Hash的保管。一旦核心密钥失守建立在它之上的整个认证体系都可能被绕过。因此真正的安全建设必须从最基础的凭证保护、权限最小化和积极监控做起。攻击技术在进化防御思路也必须从“边界防护”转向“假设失陷”的深度防御。希望这篇长文能帮你建立起关于Kerberos票据攻击与防御的完整知识框架在实战中多一份把握在防御中多一份洞察。