Kerberoasting攻击是Tim Medin在DerbyCon 2014上发布的一种域口令攻击方法,Tim Medin同时发布了配套的攻击工具Kerberoast。此后,不少研究人员对Kerberoasting进行了改进和扩展,在GitHub上开发发布了大量工具,使得Kerberoasting逐渐发展成为域攻击的常用方法之一。
Kerberos协议的认证授权过程,3次涉及使用不同账户的NTLM作为密钥加密数据
- 使用域用户的NTLM加密认证请求票据
- KDC使用Krbtgt账号的NTLM加密认证后的票据TGT
- KDC使用运行服务的服务账号的NTLM加密授权票据TGS
Kerberos使用公开的对称加密算法
:为已知的对称加密算法,如rc4_hmac_nt等;
:为待加密的数据,包含时间戳,其他为固定格式的内容;
:为加密密钥,即NTLM;
为加密后的密数据;
如果能从Kerberos域网络中获取,则根据已知算法,使用不同的
可推算出不同的
。
由于中包含简单易辨的时间戳,所以通过时间戳可快速判定数据解密是否正确,从而判定使用的
是否为要寻找的口令。
key越简单、加密算法强度越低,被破解的概率越大,因此需要寻找具有简单key的账号,以及使用较低强度的加密算法
。
思考:为什么还有不同的加密算法
?
微软为了解决系统新旧版本兼容性问题,每个Windows系统会支持多种加密算法,例如AES、DES、RC4、MD5等。在Windows 2003、Windows 2000系统中,主要采用RC4、MD5、HMAC_MD5等算法,这些算法相对比较容易破解。所以在选择破解重点时尽量选取运行在这些系统上的服务。
在域内主要有主机账号、用户账号、服务账号等3种主要账号类型:
- 主机账号的口令由系统随机设置,几乎不能破解,而且每30天自动变更一次
- 用户账号的口令复杂度由策略而定,在复杂度要求较高的域内,破解难度较大
- 服务账号的口令存在很大的特殊性
- 口令在应用软件安装时往往自动设定,复杂度往往较为简单
- 口令几乎不会更改,因为大部分应用软件没有提供修改服务账号的功能和接口,例如运行MS SQL Server服务的sqlsvc账号等
基于以上,服务账号是kerberosating攻击的主要对象。
服务账号基本满足口令复杂度较低这个条件,可以作为破解的对象。
要想达成破解条件,还需要获取加密后的数据,则需获取服务账号的密数据。
由于TGS由服务账号的NTLM加密,因此获取访问服务的TGS即可获取密数据,即Kerberos协议中的第4步
根据Kerberos协议,任何域内用户均可以向域服务器申请访问某个服务
服务可以不在线,只要该服务在域中注册了SPN(Service Principal Name)即可
SPN存在于账号的属性中,因此可以通过查询所有账号的属性,遍历域内所有SPN服务。因为主机账号的口令几乎不能破解,所以只查询用户账号的SPN。系统提供了PowerShell模块供查询,PowerViewer对模块进行了封装,提供Get-DomainUser-SPN命令,可遍历域内所有的用户账号的SPN。
在一些域中,当一些服务不再运行或者停止服务后,这些服务账号可能仍然遗留在域中,由于服务的运行与否不影响我们获取TGS,因此这些不存在的SPN仍然适用于Kerberoasting。
服务账号中有些权限较高,例如有些特殊的服务需要具备域管理员权限的服务账号才能运行正常,因此可以在查询SPN时加以标记和筛选,作为重点攻击的对象。方法是在使用Get-DomainUser -SPN命令时,添加AdminCount参数,表示具备高权限。
获取域内的服务账号与所运行的服务进行对应关系
需要获取访问这些服务的TGS,从而获取由服务账号NTLM加密的加密数据
使用Mimikatz每次只能申请获取一个TGS,impacket工具包提供了批量获取的方法,可一次获取域内所有SPN的TGS,供离线批量破解。
回顾介绍NTLM协议攻击的章节,有多种方式迫使系统选择使用强度较低的加密算法。现在比较容易破解的算法是RC4_HMAC_NT算法,在获取TGS时,可以诱使域服务器采用该算法进行加密。
Kerberoasting攻击的所有条件:
:密数据。获取到的TGS
:算法。要尽量降低算法强度。
:口令字典库。
使用Tim Medin的Kerberoast工具破解获取口令,当然还有算法更快的HashCat工具。下载解压Kerberoast工具后,使用“tgsrepcrack.py wordlist.txt tgs.kirbi”进行破解,其中wordlist.txt是字典文件,tgs.kirbi是前面获取的TGS。破解的概率和时间依赖于口令复杂度、字典以及机器的性能。
破解获取服务账号的口令后,剩下的是如何利用账号,以实现对域的控制。
默认情况下,服务账号不允许以交互式方式登陆域,只允许网络登录或以服务方式登陆。
如果服务账号运行的服务仍然正常在用,则利用比较方便。可以构造类似白银票据的伪造TGS,宣称以管理员用户访问服务账号所在的服务,获取服务的完全控制权。
如果服务账号对应的服务不存在,利用会稍微麻烦一点,可以使用服务账号访问其他服务,往往也能获取较高权限。
在Windows系统中,许多服务在服务器具有较高权限。例如SQL服务,在运行服务的服务器上具有本地管理员权限,如果 以域管理员身份访问SQL服务,既可以控制SQL服务本身,又可以获取服务器本地管理员权限。
在这类服务器上,往往存留又域高权限用户的登录凭证,获取这些凭证后,可快速掌握域的控制权。
在一些密码策略不是很严格的域中,普通用户账号也可能存在弱口令现象,同样可以使用Kerberoasting方式破解获取用户账号的口令。
只有某些特殊情况下,才会明确设置用户不需要预认证。可以使用PowerViewer工具获取域内所有不需要预认证的用户账户。
Kerberoasting攻击的主要前提是口令复杂度较低、加密算法强度较弱。
对抗Kerberoasting攻击也需从这2方面开展:
- 提高服务账号的口令复杂度;
- 尽量将域内的服务器系统升级至少至Windows 2008系统,应用AES256高难度的加密算法
检测Kerberoasting攻击比较难,因为所有在线操作都是合法正常的操作,不过仍然有迹可循。例如批量获取TGS是一个特征,低强度的加密算法是一个特征,可以从这2方面着手进行检测是比较有效的检测思路。
学习资料:
https://github.com/nidem/kerberoast
http://adsecurity.org/?page_id=183
https://github.com/hashcat/hashcat/pull/225
https://github.com/CoreSecurity/impacket/blob/master/examples/GetUserSPNs.py