当前位置: 首页 > 技术干货 > Kerberos协议及其利用

Kerberos协议及其利用

发表于:2021-06-03 11:14 作者: mtr 阅读数(305人)

前言

之前就一直想着抽空学学内网渗透相关的东西,无奈被各种事情耽搁。。。刚好这两天闲下来,就把之前留的坑填一下。

本文涉及相关实验:Kerberos网络认证协议搭建与分析 (本实验主要介绍了windows server2003系统的域和DNS服务器的搭建,通过本实验的学习学会kerberos网络认证协议搭建方式。)

Kerberos协议原理

啥是Kerberos?

一种双向的网络身份认证协议,通过使用加密技术为客户端/服务端应用程序提供强大的认证服务

基本概念

  • Principal 安全个体,具有唯一命名的客户端或服务器。命名规则:主名称+实例+领域,如:herlocky/admin@EXAMPLE.COM
  • TGT 票据授予票据(Ticket Granting Ticket),包含客户端ID、客户端网络地址、票据有效期以及client/TGS会话密钥
  • Ticket 票据,一条包含客户端标识信息、会话密钥和时间戳的记录,客户端用它来向目标服务器认证自己
  • Session key 会话密钥,指两个安全个体之间使用的临时加密秘钥,其时效性取决于单点登录的会话时间长短
  • KDC Key分发中心(key distribution center),是一个提供票据(tickets)和临时会话密钥(session keys)的网络服务。KDC服务作为客户端和服务器端信赖的第三方,为其提供初始票据(initial ticket)服务和票据授予票据(ticket-granting ticket)服务,前半部分有时被称为AS,后半部分有时则被称为TGS
  • AS 认证服务器(Authentication Server),KDC的一部分。通常会维护一个包含安全个体及其秘钥的数据库,用于身份认证
  • TGS 许可证服务器(Ticket Granting Server),KDC的一部分,根据客户端传来的TGT发放访问对应服务的票据
  • SS 特定服务的提供端(Service Server)

如何运作?

放一张图片可能比较好理解一些:

6qD38S.png

1.(在开启Kerboers协议的基础上)当客户端想访问服务器上的资源时,需要先向KDC发送认证请求,在发送认证请求的时候会根据自己的密码生成密钥,用密钥将发送的时间戳进行加密。(加密作用在于防止别人获取到信息后进行重放攻击)

2.1 KDC在接受到请求后,会先查看AS中是否有该账户的信息,使用相对应解密算法将时间戳解密,完成了A的身份认证。这里解释一下为啥会用到时间戳:因为在传输过程中,可能会被黑客进行截获,黑客在截获后如果想骗取认证的话需要进行数据包的再次发送,也就是重放攻击。重放攻击需要耗费一定时间,如果用时间戳作为衡量标准的话,当KDC解出时间戳和当前时间差别过大时,就不会再继续认证。

2.2 上文说到Kerboers是双向的认证,2.1是客户端向KDC证实身份,现在需要KDC向客户端证明身份。首先,KDC会生成一把专门用于KDC与A之间通信的密钥,并且用密钥加密自身,得到的这个玩意儿就是TGT。之后将时间戳、KDC生成的密钥、随机字符串使用客户端生成的密钥进行加密。

2.3.客户端在收到消息后,会使用自己最初生成的密钥来解密密文,得到KDC的密钥,并且证实其身份。

3.1 接下来客户端需要向KDC去认证服务器的身份,于是会将之前的TGT和KDC的密钥加密的信息与时间戳以及新的消息发送给KDC,KDC收到消息后会将TGT解密拿到密钥和加密的信息,达到验证客户端的目的。

4 KDC生成新的密钥 ,新密钥供客户端与服务器通信时使用,并且该密钥和客户端的信息会被服务器的密钥进行加密形成票据,原KDC生成的密钥对新密钥进行加密后,将票据和生成的新密文发送给客户端

5.1 客户端拿着KDC生成的新密钥加密信息和时间戳,再外加一个票据(TGS)去请求服务器

5.2 服务器用自己的私钥解开票据,拿到客户端和服务器之间的密钥以及信息,接着用该密钥解密客户端发来的密文,如果验证为真,就会将时间戳用客户端和服务器之间的密钥进行加密发给客户端。

6 客户端接收到服务器发送的信息后,解密查看时间戳完成对B的身份校验,完成认证过程。

---------------------------------------------------------------------------------------------------分隔符---------------------------------------------------------------------------------------------------------

用大白话来说可能会容易理解Kerboers协议,比如在学校的机房里(假设为域控环境),如果用户想在任意一台主机上进行操作,只需要有一个账户名密码即可。该账户名密码存于域控制器中,有别于我们平时使用的工作组,用户名密码不通过本机验证,身份验证是采用Kerberos协议在域控制器上进行的,登陆到此计算机(如telnet)则是通过SAM来进行NTLM验证。

记录一次不心酸的AD域控搭建

环境

VMware虚拟机:Windows 2012 R2,Windows 7

过程

搭建起来没想象中的复杂,主要是把服务器上的AD域和DNS服务器安装好,处理好服务器和主机之间互通的问题

直接按照这个博客搭建即可域环境搭建,过程不再赘述。搭建域控环境目的还是为了复现Kerberos协议中的两种利用方式。

白银票据

原理

先拽一波英文,Silver Ticket(白银票据)主要是利用TGS,即六步认证过程中的第五步,客户端拿着票据向服务器中的某个服务发起请求,这时候的票据格式是这样的:

Ticket=Server Hash(Server Session Key+Client info+End Time)

利用服务器端生成的密钥对Server Session Key、客户端的消息以及时间戳进行加密。因为服务器没有收到Server Session Key,并不知道我们要访问的究竟是何种服务,所以当我们知道Server Hash的时候,就可以去访问服务器中指定的服务。简单地说,就是生成了一个可以随时访问服务的后门。

 

利用条件

1.已知服务器的NTLM hash

2.仅对部分开放服务有效,如cifs(文件共享服务),mssql,winrm(windows远程管理),dns等等

 

实践过程

用的是红日安全的环境

192.168.52.138 域控服务器

192.168.52.143 客户端

mimikatz 工具

之前自己搭建的AD域环境有点问题,没复现成功,心塞。。。然后用红日的环境复现好了。拿到的客户端是管理员权限,域控的主机是普通用户权限。没详细研究怎么去打组合拳,先看看能不能利用一下白银票据。尝试用命令查询客户端共享目录的访问权限,发现无法访问:

dir \\stu1.god.org\c$

cyNhsH.png

因为要伪造访问客户端的访问权限,所以我们可以在客户端中去拿到这个NTLM Hash:

mimikatz log "privilege::debug" "sekurlsa::logonpasswords">log.txt

在log.txt中查看到 NTLM Hash:

cyUVOJ.png

然后我们还需要域的SID值,域的SID就是域成员的SID值去掉最后的 -数字 的部分,该域的SID值就是S-1-5-21-2952760202-1353902439-2381784089 可以在log.txt中查看,也可以用命令:

whoami /user

cyUD1S.png

最后一步,就是在域控主机中伪造票据,为了方便就直接进行伪造,写入域控主机内存。mimikatz 其实还可以把票据dump到本地,方便以后再使用。为了防止其他票据干扰,可以使用 kerberos::purge 把主机中其他票据删除。伪造命令:

kerberos::golden /domain:god.org /sid:S-1-5-21-2952760202-1353902439-2381784089  /target:stu1.god.org /rc4:55c330808522af0724598d8f48af2809  /service:cifs /user:stu1 /ptt

然后再次访问,成功:

cyaJ3T.png

最后,mimikatz之前没咋用过,简单看了一下是可以将内存中的密码都读出来,很强大。。有些密码没经过Hash处理,直接明文显示了。

cyaFAI.png

黄金票据

原理

和白银票据不同,黄金票据利用点在于伪造TGT。伪造TGT的关键就在于获取KDC的哈希值,也就是KRBTGT账户的哈希值,伪造出TGT的话,后面就可以有效的获得目标主机任何的Kerberos服务。

 

利用条件

1.需要与KDC通信

2.需要krbtgt的hash

 

实践过程

依旧是红日安全的环境

Win2008R2(DC) IP:192.168.52.138

Win2003 IP:192.168.52.141

Win7 IP:192.168.52.143(内)

mimikatz 工具

大大大前提:我们已经可以访问域控主机,接下来我们在域控上使用mimikatz进行票据提取。先导出KRBTGT账户的hash:

lsadump::dcsync /domain owa /user:krbtgt

c2td5n.png

把信息提取出来:

安全账户管理器用户名:krbtgt
krbtgt SID为:S-1-5-21-2952760202-1353902439-2381784089-502
krbtgt 的hash:58e91a5ac358d86513ab224312314061

查看一下域控主机当前用户:

c2wG7D.png

接着回到win7主机上,我们要在win7主机中使用mimikatz,通过黄金票据获得域控主机权限。先启动mimikatz,借助kerberos::purge命令清除win7主机上的票据

c2Bwef.png

接着利用前面获取到的信息伪造黄金票据:

kerberos::golden /domain:owa.god.org /sid:S-1-5-21-2952760202-1353902439-2381784089-502  /rc4:58e91a5ac358d86513ab224312314061  /user:krbtgt  /ptt

c2rJKI.png

再尝试一下能否访问远程文件共享

cRKoa6.png

啊这,出现这个错误的时候在网上查了很多资料,也关闭了防火墙和windows defender还是出现上述问题。后面调用systeminfo命令看了一下,原来打补丁了啊,那没事了,如果没有补丁的话就可以继续对目标机器进行渗透,甚至可以用PSEXEC.exe进行反弹shell。关于红日安全靶场,在网上进行下载即可。