目录

Kerberoasting 攻击

Kerberoasting 攻击

1 背景

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

2 原理

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 账号类型

在域内主要有主机账号用户账号服务账号(SPN 注册在域用户账号下) 等 3 种主要账号类型

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

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

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

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

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

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

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

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

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

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

4 SPN

4.1 SPN 相关概念

SPN 是服务器上所运行服务的唯一标识,每个使用 Kerberos 的服务都需要一个 SPN

SPN 分为两种,一种注册在 AD 上机器帐户(Computers)下,另一种注册在域用户帐户(Users)下

当一个服务的权限为 Local SystemNetwork Service,则 SPN 注册在机器帐户(Computers)下

当一个服务的权限为一个域用户,则 SPN 注册在域用户帐户(Users)下

SPN 的格式为 serviceclass/host:port/servicename

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

  • host 尽量用 FQDN 表示;

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

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

4.2 查询 SPN

SPN 存在于账号的属性中,因此可以通过查询所有账号的属性,遍历域内所有 SPN 服务。因为主机账号的口令几乎不能破解,所以只查询用户账号的 SPN。

系统提供了 PowerShell 模块供查询,PowerViewer 对模块进行了封装,提供 Get-DomainUser -SPN 命令,可遍历域内所有的用户账号的 SPN。

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

  • Win7 和 Windows Server 2008 自带的工具
    • setspn.exe -q */*

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

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

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

5 攻击流程

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

需要获取访问这些服务的 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。破解的概率和时间依赖于口令复杂度、字典以及机器的性能。

./tgsrepcrack.py wordlist.txt test.kirbi

6 防御

Kerberoasting 攻击的主要前提是口令复杂度较低、加密算法强度较弱 对抗 Kerberoasting 攻击也需从这 2 方面开展

  • 提高服务账号的口令复杂度;
  • 尽量将域内的服务器系统升级至少至 windows2008 系统,应用 AES256 高难度的加密算法

检测 Kerberoasting 攻击比较难,因为所有在线操作都是合法正常的操作,不过仍然有迹可循。例如批量获取 TGS 是一个特征,低强度的加密算法是一个特征,可以从这两方面着手进行检测是比较有效的检测思路。