Kerberoasting
第一种利用
一、 Kerberos认证过程
- Kerberoasting 当域内某个用户去请求同域内的某个服务实例时,请求会首先被 送达至KDS 的 AS 中进行身份认证。
- 通过后 AS 会返回一个由用户密码hash加密而成的TGT票据给用户,然后用户再拿着TGT票据去请求TGS,TGS验证成功后会返回一个用对应服务账号的密码hash加密过**(RC4_HMAC_MD5)的票据TGS**
- 用户拿着TGS通过目标服务实例验证后可以去访问对应的服务资源,
- Kerberoasting攻击利用TGS票据加密算法已知这一条件,尝试穷举口令,对TGS进行对比,若TGS相同,则口令正确。得到对应服务实例的明文密码。
还有几点是需要大家明白的:
1.当域控查询某一个服务的SPN时
如果该SPN注册在机器账户computers下,将会查询所有机器账户的servicePrincipalName属性,找到所对应的账户。
如果是注册在域用户账户users下,将会查询所有域用户账户的servicePrincipalName属性,找到其所对应的账户。
找到对应的账户之后,使用它的NTLM hash生成TGS。
2.域内的所有主机都是可以查询SPN的
3.域内的任何用户都是可以向域内的任何服务请求TGS
对于破解的明文口令,只有域用户账户(Users)的口令存在价值,不必考虑机器账户的口令(无法用于远程连接)
所以,域内的任何一台主机,都可以通过查询SPN,向域内的所有服务请求TGS,然后进行暴力破解,但是对于破解出的明文,只有域用户的是可以利用的,机器账户的不能用于远程连接,所以我们的关注点主要就在域用户下注册的SPN。
利用思路如下:
- 查询SPN,找到有价值的SPN,需要满足如下条件
- SPN注册在域用户账户下(Users)
- 域用户账户的权限很高
- 请求TGS
- 导出TGS
- 利用字典破解TGS拿到明文密码
实验
实验环境:
域:YUNYING.LAB
域控:Windows Server 2008 R2 x64(DC)
域内主机:Windows 7 x64(s1):用户 ts1
域内主机:Windows Server 2008 R2 x64(s2):用户 tsvc
所需工具:
Kerberoast 工具包
Mimikatz
攻击流程:
一、在域内主机 s1 中通过 Kerberoast 中的 GetUserSPNs.ps1 或者 GetUserSPNs.vbs 进行 SPN 扫描。
二、根据扫描出的结果使用微软提供的类 KerberosRequestorSecurityToken 发起 kerberos 请 求,申请 ST 票据。
https://docs.microsoft.com/enus/dotnet/api/system.identitymodel.tokens.kerberosrequestorsecuritytoken?redirectedfro m=MSDN&view=netframework-4.7.2
PS C:/> Add-Type -AssemblyName System.IdentityModel
PS C:/> New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList “MSSQLSvc/s2:1433”
可以看到这个过程通过 AS-REQ、AS-REP、TGS-REQ、TGS-REP 这四个认证流程,获取到 RC4 方式加密的票据。
三、Kerberos 协议中请求的票据会保存在内存中,可以通过 klist 命令查看当前会话存储的 kerberos 票据。
使用 mimikatz 导出。
使用 kerberoast 工具集中的 tgsrepcrack.py 工具进行离线爆破,成功得到 tsvc 账号的密码 admin1234!
1 |
|
第二种利用 Kerberoasting后门利用
当我们取得SPN的修改权限后,可以为指定的域用户添加一个SPN,这样可以随时获得该域用户的TGS,经过破解后获得明文口令
例如为域用户administrator添加SPN NC/dc.de1ay.com
此时为域内用户administrator添加了一个SPN,在域内任何一台主机上都可以获得本SPN,并能使用Kerberoast获得TGS
在后续需要使用时请求服务,获取TGS使用Hashcat破解即可
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!