横向移动因为其流量特征少,多数是域中正常功能而一直是流量产品的短板,本文就将管中窥豹,从票据方面聊一聊流量产品所能做的事。除大家熟知的黄金/白银票据外,还有一些变种的票据攻击,下文都会有所涉及。
Kerberos工作原理
AS : AuthenticationServiceKDC : KeyDistribution CenterTGS : Ticket GrantingService
1:Client向KDC发起AS_REQ请求内容为通过Client密码Hash 加密的时间戳、ClientID、网络地址、加密类型等内容。2:KDC使用Client hash进行解密,并在ntds.dit(只有域控中才有的数据库)中查找该账户,如果结果正确就返回用krbtgt NTLM-hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。注释:PAC的全称是Privilege AttributeCertificate(特权属性证书)。不同的账号有不同的权限,PAC就是为了区别不同权限的一种方式。3:Client(客户端)凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求。4:KDC使用krbtgt NTLM-hash进行解密,如果结果正确,就返回用服务NTLM-hash 加密的TGS票据,并带上PAC返回给Client(客户端)(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)。
5:此时client拿着KDC给的TGS票据去请求服务。
6:服务端使用自己的NTLM-hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
至此,就是登录域控中Kerberos协议的工作流程,看起来可能点绕,根据我上面的贴图,一步步的看还是比较好理解的。
根据Kerberos工作原理4,不管用户有没有访问服务的权限,只要TGT正确,也就是只要伪造第三步,就返回TGS票据,导致获取TGT就可以进行接下来的权限操作,这就是黄金票据。所以当有了域内任意一台Client的权限,都可以从中导出krbtgt用户的hash,并计算出任意TGT。然后伪造到该Client中就可以直接跳过Kerberos工作原理1,2直接进行与KDC交互获得域内用户的操作权限。

相较于正常的Kerberos,黄金票据攻击缺失了1,2步,所以针对这个异常行为,流量产品可以做一些动作进行防御或检测。设立审计事件:TGT申请,将申请的TGT与ip或MAC一一对映保存24小时甚至更久由于TGT有时效性,所以正常的机器访问,当第一次申请TGT之后一段时间再次访问,就会出现和黄金票据一样的直接发TGT(kerberos工作原理3),所以直接做确实1,2步是不可行的,需要配合TGT和主机一一对映,来保证请求的合法性。
白银票据
与黄金票据类似,白银票据也是在Kerberos流程中做伪造,而其伪造的是Client用TGT向TGS换的票。TGS是伪造的,所以没有和TGT通信,意味着DC从验证过。
相较于黄金票据的限制(指正常流量可能也有黄金票据的行为),白银票据的检测手段就多了一种:1. 类比黄金票据对TGS换票进行唯一机器特征码对应匹配,防止假冒2. 检查整个kerberos流程,如果只出现5,6那么就认为出现了白银票据攻击。Kerberosdelegation工作原理
S4U
1. Service forUser to Proxy (S4U2proxy),这个就是 constrained delegation2. Service forUser to Self (S4U2self),这个也被称为 Protocol transitionProtocoltransition
也就是S4U2self (Service for User to Self),作用就是验证协议切换。user --> service1 --> service2
user 访问了 service1 后,service1 要利用 kerberos 协议以 user 的身份去访问service2,但是这要求 user 访问 service1 的时候,也是利用的 kerberos 协议去与 service 1 进行验证的。那么如果不是的话怎么办呢?service1 有可能只是一个网站,user在登陆这个网站的时候只是像登陆普通网站一样在一个表单里面输入了一个账号密码而已,而且这个账号密码可能只是网站内部的账号密码,并不是域的账号密码。这个时候就需要 protocol transition 来进行验证协议切换。如果 service1 有了 protocoltransition 权限的话,service1 可以以任何一个域内用户的身份向 KDC 申请一张访问 service1 自身的票据,而且不需要知道目标用户的密码。比如 service1 可以以域管理员 Administrator 的身份向KDC 申请一张访问 service1自身的票据。(如果你能找到这么一个服务,并且可以通过这个服务执行代码的话,你是有可能直接利用这个功能提权至域管理员的,当然这个时候你获取到的域管权限是被限制在这台机器上的,无法访问别的服务器。)如下,

1. 申请一张普通的TGT票,需要将Server1注册成服务账号,并将其目标 SPN 是krbtgt/xxx.COM3. 利用 S4U2self 以 Administrator 的名义向 TGS 申请了一张访问自身服务的票5. 使用票2向 KDC 发起 SU42Proxy 请求,以 Administrator 的名义向 KDC 申请一张到 krbtgt/xxx.COM 的票(对应第一步设置的SPN目标的伪造效果)6. KDC给Server1一张,域控Administrator的票此攻击的特性就是需要一台设置了 SPN 的,用域管理员权限为这个账号开启 s4u2self (protocol transition) 权限的,并设置了S4U2Proxy 列表的机器。此外整个传递过程完全伪造,所以提出一条检查思路:检查所有Server1(设置了 SPN 的,用域管理员权限为这个账号开启 s4u2self (protocol transition) 权限的,并设置了S4U2Proxy 列表的机器),检查其3,4过程是否正常流程的Client请求,并检查,这个Client请求跟Server1发出的3,4步请求内容是否相同。如果没有收到对应请求,或者转发的请求内容变化,则可以认定为正在遭受Kerberos delegation变种黄金票据的攻击。结语
以上就是横向移动中,对票据攻击的一些想法,如果有一些技术上的理解错误还望及时斧正,以上检测,目测还会遇上一些时效性问题,要真实落地应该还有一段路要走。