目录

Kerberoasting 攻击

Kerberoasting 攻击

背景

Kerberoasting 攻击是 Tim Medin 在 DerbyCon 2014 上发布的一种域口令攻击方法,Tim Medin 同时发布了配套的攻击工具 kerberoast。此后,不少研究人员对 Kerberoasting 进行了改进和扩展,在 GitHub 上开发发布了大量工具,使得 Kerberoasting 逐渐发展成为域攻击的常用方法之一。

原理

kerberos 协议的认证授权过程,3 次涉及使用不同账户的 NTLM 作为密钥加密数据

  • 使用域用户的 NTLM 加密认证请求票据
  • KDC 使用 Krbtgt 账号的 NTLM 加密认证后的票据 TGT
  • KDC 使用运行服务的服务账号的 NTLM 加密授权票据 TGS

Kerberos 使用公开的对称加密算法

y = f(x, key) 为已知的对称加密算法,如 rc4_hmac_nt 等。

x 为待加密的数据,包含时间戳,其它为固定格式的内容;

key 为加密密钥,即 NTLM; y 为加密后的密数据。

如果能从 Kerberos 域网络中获取 y,则根据已知算法,使用不同的 f 可推算出不同的 x

由于 x 中包含简单易辨的时间戳,所以通过时间戳可快速判定数据解密是否正确,从而判定使用的 key 是否为要寻找的口令。

key 越简单、加密算法强 f 度越低,被破解的概率越大,因此需要寻找具有简单 key 的账号,以及使用较低强度的加密算法 f

账号类型

在域内主要有主机账号用户账号服务账号3 种主要账号类型

主机账号的口令由系统随机设置,几乎不能破解,而且每 30 天自动变更一次

用户账号的口令复杂度由策略而定,在复杂度要求较高的域内,破解难度较大。

服务账号的口令存在很大的特殊性

  • 口令在应用软件安装时往往自动设定,复杂度往往较为简单

  • 口令几乎不会更改,因为大部分应用软件没有提供修改服务账号的功能和接口,例如运行 MS SQL Server 服务的 sqlsvc 账号等

服务账号基本满足口令复杂度较低这个条件,可以作为破解的对象

要想达成破解条件,还需要获取加密后的数据,则需获取服务账号的密数据

由于 TGS 由服务账号的 NTLM 加密,因此获取访问服务的 TGS 即可获取密数据,即 Kerberos 协议中的第 4 步。

根据 Kerberos 协议,任何用户均可以向域服务器申请访问某个服务

服务可以不在线,只要该服务在域中注册了 SPN(Service Principal Name) 即可。

SPN

SPN 的格式为 “serviceclass”/“hostname[":“port]["/“servicename]

其中 serviceclass 表示服务的种类,例如 www 表示web服务;

host 尽量用 FQDN 表示;

端口如果是知名端口,可以省略。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200501105628.png-water_print

SPN 存在于账号的属性中,因此可以通过查询所有账号的属性,遍历域内所有 SPN 服务。因为主机账号的口令几乎不能破解,所以只查询用户账号的 SPN。系统提供了 PowerShell 模块供查询,PowerViewer 对模块进行了封装,提供 Get-DomainUser -SPN 命令,可遍历域内 所有的用户账号的 SPN。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200501105653.png-water_print

在一些域中,当一些服务不再运行或者停止服务后,这些服务账号可能仍然遗留在域中,由于服务的运行与否不影响我们获取 TGS,因此这些不存在的 SPN 仍然适用于 Kerberoasting

服务账号中有些权限较高,例如有些特殊的服务需要具备域管理员权限的服务账号才能运行正常,因此可以在查询 SPN 时加以标记和筛选,作为重点攻击的对象。方法是在使用 Get-DomainUser -SPN 命令时,添加 AdminCount 参数,表示具备高权限。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200501105711.png-water_print

攻击流程

获取域内的服务账号与所运行的服务进行对应关系

需要获取访问这些服务的 TGS,从而获取由服务账号 NTLM 加密的加密数据

Mimikatz 提供了该功能,通过 Kerberos 模块的 ask 命令可以获取。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200501110022.png-water_print

使用 Mimikatz 每次只能申请获取一个 TGSimpacket 工具包提供了批量获取的方法,可一次获取域内所有 SPNTGS,供离线批量破解。

微软为了解决系统新旧版本兼容性问题,每个 Windows 系统会支持多种加密算法,例如 AES、DES、RC4、MD5 等。在 Windows 2003、Windows 2000 系统中,主要采用 RC4、MD5、HMAC_MD5 等算法,这些算法相对比较容易破解。所以在选择破解重点时尽量选取运行在这些系统上的服务

有多种方式迫使系统选择使用强度较低的加密算法。现在比较容易破解的算法是 RC4_HMAC_NT 算法,在获取 TGS 时,可以诱使域服务器采用该算法进行加密。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200501110712.png-water_print

Kerberoasting 攻击的所有条件

  • 密数据
  • 算法
  • 口令字典库

使用 Tim Medin 的 kerberoast 工具破解获取口令,当然还有算法更快的 HashCat 工具。下载解压 kerberoast 工具后,使用 tgsrepcrack.py wordlist.txt tgs.kirbi 进行破解,其中wordlist.txt 是字典文件,tgs.kirbi 是前面获取的 TGS。破解的概率和时间依赖于口令复杂度、字典以及机器的性能。

获破解获取服务账号的口令后,剩下的是如何利用账号,以实现对域的控制

默认情况下,服务账号不允许以交互式方式登录域,只允许网络登录或以服务方式登录。

如果服务账号运行的服务仍然正常在用,则利用比较方便,可以构造类似白银票据的伪造TGS,宣称以管理员 用户访问服务账号所在的服务,获取服务的完全控制权

如果服务账号对应的服务不存在,利用会稍微麻烦一点,可以使用服务账号访问其他服务,往往也能获取较高权限

在 Windows 系统中,许多服务在服务器具有较高权限。例如 SQL 服务,在运行服务的服务器上具有本地管理员权限,如果以域管理员身份访问 SQL 服务,既可以控制 SQL 服务本身,又可以获取服务器本地管理员权限。

在这类服务器上,往往存留有域高权限用户的登录凭证,获取这些凭证后,可快速掌握域的控制权。