Kerberos协议
基础概念
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某个服务的凭证
认证过程
AS_REQ
Client向KDC的AS认证服务请求TGT票据,请求凭据是Client hash加密的时间戳
AS_REP
KDC使用Client hash进行解密,若结果正确就返回krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC中包含Client的sid和Client所在的组
TGS_REQ
Client凭借TGT票据向KDC的TGS认证服务发起针对特定Server的TGS_REQ请求
TGS_REP
TGS使用krbtgt hash进行解密,若结果正确,就返回用Server hash
加密的ST
票据(这一步不管用户有没有访问Server
的权限,只要TGT
正确,就返回ST
票据 )
AP_REQ
Client使用ST服务票据向服务端请求服务
AP_REP
server使用自己的hash解密ST票据。如果解密正确,就拿着PAC
去KDC
那边问Client
有没有访问权限,域控解密PAC
。获取Client
的sid
,以及所在的组
,再根据该服务的ACL
,判断Client
是否有访问Server
的权限
域内用户枚举
发生在AS_REQ阶段
根据响应包返回码来判断是否爆破成功
使用kerbrute
进行爆破:
kerbrute userenum --dc CONTROLLER.local -d CONTROLLER.local User.txt
User.txt
为用户列表
使用wireshark可以看到这一过程
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