安全研究 >> 安全研究详情

安全实验室 | 内网渗透—寻找域控&Kerberos认证分析

作者: 美创科技安全实验室发布日期: 11月13日

在前两篇《内网渗透—横向移动》系列文章中,我们详细介绍了内网中横向移动的各种方法,其中着重介绍了两个移动方式:PTH和PTT,分别是哈希传递攻击与票据传递攻击,两个方法的目标都是企图在无需知道明文域账号的情况下,拿下域控主机。那基于此,本期我们从实战和理论两个方面,再来深入研究一下PTT攻击。


01域渗透之寻找域控方式


在PTH和PTT攻击中,着重攻击的目标就是域控主机,攻下了域控主机就意味着我们控制了整个域内所有的机器,这应该是每个渗透人员在内网中最想达成的目标。而想达成这个目标,首先要做的就是要弄清楚目标在哪。


现在假设我们成功拿下了一台域内普通主机,并获得了最高权限,那么我们可以运行下面这个命令查找域控:


1. Net view /domain





2. Set log





3. echo %logonserver% + ping 主机名







4. nbtstat /c





5. nslookup 域名





6. PING 域名





以上这些指令,都是Windows系统自带的指令,有的时候因为Windows版本的不同,有的命令会不存在,所以还是需要根据具体情况来自行变化指令。


02Kerberos协议认证过程


说完了查找域控的方法,接下来我们分析一下票据传递攻击的原理,此攻击是基于Windows系统中的Kerberos认证协议来实现的,所以我们来分析一下Kerberos协议的认证流程。Kerberos协议是一种基于第三方可信主机的计算机网络协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。Kerberos协议在在内网域渗透中至关重要,白银票据、黄金票据、攻击域控等都离不开Kerberos协议。


在Windows系统中,总共有两种认证方式,分别是基于NTLM协议和Kerberos协议,由于NTLM协议在我前几篇的内网渗透系列文章已有过介绍(《内网渗透—获得Windows单机上的密码Hash》),所以这里不再赘述,我们直接开始讲解Kerberos协议,但是在开始之前,我们需要认识在该协议中比较重要的几个角色:


1、物理机器:


Client:域内客户端,也可以指用户

Server:域内服务端,可能是某台计算机也可能是某个服务

DC(Domain Controller):域控制器,实现域内所有用户的统一管理


2、内部中的角色/服务:


KDC(Key Distribution Center):密钥分发中心,包含AS+TGS。

AS(Authentication Service):身份验证服务,有时也可以被称为KAS即Kerberos认证服务,用于KDC对Client认证。

TGS(Ticket Granting Service):票据授予服务,用于KDC向Client和Server分发Session。

AD(Active Directory):活动目录,保存域内所有用户账号密码、域相关的信息。


3、票据类型:


TGT(Ticket Granting Ticket):黄金票据

ST(Service Ticket):白银票据


OK,我们大致了解了在Kerberos协议中出现的角色,但我们对他们的作用以及认证流程仍然不清楚,接下来我们慢慢讲述一下,Kerberos的认证流程,总共有三个阶段:①Client-AS;②Client-TGS;③Client-Server。


我们先来讲述第一个阶段。


① Client-AS阶段:


先放上一张流程图,我们一步步来讲。





在此阶段中,总共会发生5个步骤。如下:


1)客户端(Client),向身份认证服务(AS),发送一串数据。这串数据由三个重要信息组成,分别是:使用client-NTLM-hash加密过的timestamp(时间戳)、未被加密过的client-name(客户端主机名)、以及TGS的server-name(TGS的主机名)


这里简单说一下,所谓的client-NTLM-hash就是登录客户端本地的密码哈希值,之所以使用它加密timestamp,是为了向AS验证自己(client)的身份。


2)AS在接收到这串数据之后,会从中寻找到未被加密过的client-name,然后将client-name发送给AD。(发送给AD的原因是,AD存储着所有用户的NTLM-hash)


3)AD在接收到AS发过来的client-name之后,去寻找该name所对应的client-NTLM-hash,若找到了则将client-NTLM-hash发送给AS,若找不到则认证失败。


4)AS在接收到由AD发过来的client-NTLM-hash之后,将数据串中的被加密的timestamp进行解密,如果成功解密且timestamp的格式/内容是合法的,则说明client-NTLM-hash正确,验证Client身份成功。


5)若AS成功验证了Client的身份,AS随机生成一个session-key-as,又称logon-session-key,使用已经被验证为正确的client-NTLM-hash加密session-key-as,得到的数据我们称为A,除此之外再利用krbtgt-NTLM-hash(KDC的一个特定账户krbtgt的NTLM-hash值)对client-name、end-time(TGT的到期时间)、session-key-as加密生成TGT,并将A和TGT返回给Client,至此第一阶段完毕。


由此我们可以看到,在第一阶段中,客户端向AS提供的数据如下,背景为黄色意味加密,蓝色意味明文:



而AS返回给客户端的数据如下:



②Client-TGS阶段:


接下来我们进行第二阶段的讲解,先放上一张流程图。



此次阶段,总共会发生4个步骤。如下:


1)客户端接收到了AS返回的A和TGT,所以客户端先利用正确的client-NTLM-hash对A进行解密,可以得到session-key-as,然后使用session-key-as对client-name和server-name进行加密得到数据B,并将B和TGT发送给TGS。


这里有个很值得注意的点,就是客户端并没有对AS返回的TGT进行任何操作,其原因是客户端并不清楚解密TGT所需要的krbtgt-NTLM-hash的值。


2)客户端将B和TGT发送给TGS。


3)TGS接收到客户端发过来的B和TGT之后,利用本地存储的Krbtgt-NTLM-hash解密TGT,得到了client-name、end-time、session-key-as,再利用得到的session-key-as解密B,又得到了一个client-name,然后TGS比较两个client-name的值是否一致且合法,当前时间是否超过了end-time(确认是否过了有效期),如果一切都满足规定,TGS则生成一个新的随机密钥Session-key-tgs,然后使用session-key-as加密session-key-tgs得到C,利用server-NTLM-hash加密session-key-tgs、end-time、client-name得到ST。这里的Server-NTLM-hash指的是客户端想要与之建立连接的服务端的本地密码hash值。End-time指的是ST的过期时间。


4)TGS将C和ST返回给客户端。


由此我们可以看到,在第二阶段中,客户端向TGS提供的数据如下:



而TGS返回给客户端的数据如下:



③Client-Server阶段:


接下来我们进入最后一个阶段的讲解,还是先放上流程图,如下:



此次阶段,总共会发生3个步骤。如下:


1)客户端接收到了来自TGS的数据C和ST,首先客户端使用第二阶段第一步已知的session-key-as解密C,得到新的值session-key-tgs,然后利用session-key-tgs将client-name、timestamp进行加密生成数据D。


2)客户端将数据D和第一步接收到的ST,一起发送给Server。这里客户端也没有对ST进行任何操作,其原因也是因为客户端不知道Server-NTLM-hash值。


3)Server接收到来自客户端的D和ST,利用本地存储的Server-NTLM-hash对ST进行解密,得到client-name、end-time、session-key-tgs,然后再利用新的得到的session-key-tgs解密D,得到另一个client-name,然后比较两个client-name的值是否相同,是否超过了end-time的时效,如果都满足规定则验证通过,允许client访问Server上的资源。


由此我们可以看到,在第三阶段中,客户端向Server提供的数据如下:



03黄金/白银票据分析


根据我们刚才对Kerberos的认证协议的流程梳理,我们清楚了各阶段,客户端和AS、TGS、Server各自生成的用于认证的数据,其中最重要的数据就是黄金票据和白银票据。


1. 黄金票据


其实从刚才的流程分析中,我们就可以看到,真正起到认证作用的数据其实就是黄金票据和白银票据,这两个数据客户端由于缺少必要的信息,导致无法进行操作,这也是Kerberos认证的核心思想之一。理论上Kerberos认证可以说是无懈可击的,但是就连设计者也没有想到,如此完美的认证方式竟然还是会出现纰漏,而问题的关键在于,黄金票据和白银票据的复杂性。


根据上面的结果,我们可以看到,黄金票据的组成是由经过Krbtgt-NTLM-hash加密的Client-name、End-time、Session-key-as组成。其中,Client-name、End-time两个字段,攻击者都可以在客户端上进行伪造,而Session-key-as虽然是AS随机生成的字段,但是该生成算法是固定的,这意味着该值也是可以被伪造的,那么现在唯一搞不定的就是Krbtgt-NTLM-hash,那么Krbtgt-NTLM-hash究竟是什么呢。


其实Krbtgt-NTLM-hash是域账户的密码Hash,域账号可以登录域内的所有主机,也就是说如果某台域内主机层用域账号登陆过,那么他的lsass.exe程序中就会记录了该域账号密码的Hash值。接下来我们可以使用Mimikatz或者一些其他的工具,拿到域账号的密码Hash值。有关更多如何获得Hash值的方法请参考《内网渗透—获取Windows内Hash密码方法总结》。


总而言之,如果我们拿到了Krbtgt-NTLM-hash,那么我们就可以生成伪造的TGT黄金票据,而有了黄金票据我们就以获得任意的访问权限。此类攻击方法被称为票据传递攻击,PTT。


2. 白银票据


在经过TGS服务的授权后,返回相关的内容将用于Server的访问,如果我们能伪造TGS的返回内容,则可以实现对某台特定服务器的访问。


与黄金票据不同,白银票据的组成是由经过Server-NTLM-hash加密的Client-name、End-time、Session-key-tgs组成。其中Client-time、End-time两个字段,攻击者都可以在客户端上进行伪造,而Session-key-tgs字段的生成算法与Session-key-as字段的生成算法相同,所以我们同样可以生成伪造的Session-key-tgs字段。那么问题就集中在了Server-NTLM-hash值上。


所以如果我们知道Server用户的密码Hash的话,我们就可以伪造一个白银票据ST,且不会经过KDC,但是伪造的白银票据只对部分服务起作用。这意味着,伪造白银票据可以访问某一特定的服务,更像是权限维持的感觉。


3. 黄金票据与白银票据的区别


获取的权限不同:


伪造黄金票据:可以获得任意域内主机的访问权限

伪造白银票据:只能访问制定的服务,如CIFS


认证流程不同:

伪造黄金票据:同KDC交互,但不同AS交互

伪造白银票据:不同KDC交互,直接访问Server


加密方式不同:

伪造黄金票据:由Krbtgt-NTLM-hash加密

伪造白银票据:由Server-NTLM-hash加密

服务热线:400-811-3777
Copyright ©2005-2020 杭州美创科技有限公司. All Rights Reserved. 浙ICP备12021012号-1 网站地图