Kerberosating 攻击
第九节-Kerberosating攻击
背景
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 等:
y = f(x, key)
-
x为待加密的数据,包含时间戳和其它固定格式的内容
-
key为加密密钥,即 NTLM
-
y 为加密后的密数据
如果能从 Kerberos 域网络中获取 y,则根据已知算法,使用不同的 f,并配合口令字典可推算出不同的 x。
由于 x中包含简单易辨的时间戳,所以通过时间戳可快速判定数据解密是否正确,从而判定使用的 key 是否为要寻找的口令。
key 越简单、加密算法 f强度越低,被破解的概率越大,因此需要寻找具有简单 key的账号,以及使用较低强度的加密算法 f。
域内账号类型
在域内主要有主机账号
、用户账号
、服务账号
(SPN 注册在域用户账号下) 3 种主要账号类型。
- 主机账号的口令由系统随机设置,几乎不能破解,而且每
30
天自动变更一次 - 用户账号口令复杂度由策略而定,在复杂度要求较高的域内,破解难度较大
- 服务账号的口令存在很大特殊性
- 口令在应用软件安装时往往自动设定,复杂度往往较低
- 口令几乎不会更改,因为大部分应用软件没有提供修改服务账号的功能和接口,例如运行 MSSQL服务的 sqlsvc 账号等
服务账号满足口令复杂度较低这个条件,可以作为破解的对象。
要想达成破解条件,还需要获取加密后的数据,则需获取服务账号的密数据:
由于 TGS
由服务账号的 NTLM
加密,因此获取访问服务的 TGS
即可获取密数据,即 Kerberos
协议中的第 4 步。
根据 Kerberos 协议,任何用户均可以向域服务器申请访问某个服务;而
TGS
的获取是前四步,server不参与,因此该服务可以不在线,只要该服务在域中注册了SPN(Service Principal Name)
即可。
SPN
简介
SPN 是服务器上所运行服务的唯一标识,每个使用 Kerberos 的服务都需要一个 SPN。
-
SPN 分为两种:一种注册在 AD 上**机器帐户(Computers)下,另一种注册在域用户帐户(Users)**下
-
当一个服务的权限为
Local System
或Network Service
,则 SPN 注册在机器帐户(Computers)下 -
当一个服务的权限为一个域用户,则 SPN 注册在域用户帐户(Users)下
SPN的格式:serviceclass/host:port/servicename
- 其中 serviceclass 表示服务的种类,例如 www 表示web服务
- host 尽量用 FQDN 表示
- 端口如果是知名端口,可以省略
例如MSSQL
服务:
查询SPN账号
SPN 存在于账号的属性中,因此可以通过查询所有账号的属性,遍历域内所有 SPN 服务。因为主机账号的口令几乎不能破解,所以只查询用户账号的 SPN。
系统提供了 PowerShell 模块供查询,PowerViewer 对模块进行了封装,提供 Get-DomainUser -SPN
命令,可遍历域内所有的用户账号的 SPN。
Win7 和 Windows Server 2008 自带的工具:
setspn.exe -q */*
一些域中,当一些服务不再运行或者停止服务后,这些服务账号可能仍然遗留在域中,由于服务的运行与否不影响获取 TGS
,因此这些不存在的 SPN
仍然适用于 Kerberoasting
。例如:Exchange。
服务账号中有些权限较高,例如有些特殊的服务需要具备域管理员权限的服务账号才能运行正常,因此可以在查询 SPN 时加以标记和筛选,作为重点攻击的对象。方法是在使用 Get-DomainUser -SPN
命令时,添加 AdminCount
参数,表示具备高权限。
攻击
- 获取域内服务账号与所运行的服务的对应关系
- 获取访问这些服务的TGS,即获取由服务账号 NTLM 加密的加密数据,使用mimikatz工具的Kerberos 模块的
ask
命令
使用 Mimikatz
每次只能申请获取一个 TGS
,impacket
工具包提供了批量获取的方法,可一次获取域内所有 SPN
的 TGS
,供离线批量破解。
微软为了解决系统新旧版本兼容性问题,每个 Windows 系统会支持多种加密算法,例如 AES、DES、RC4、MD5
等。在 Windows 2003、Windows 2000
系统中,主要采用 RC4、MD5、HMAC_MD5
等算法,这些算法相对比较容易破解。所以在选择破解重点时,尽量选取运行在这些系统上的服务。
有多种方式迫使系统选择使用强度较低的加密算法。现在比较容易破解的算法是
RC4_HMAC_NT
算法,在获取TGS
时,可以诱使域服务器采用该算法进行加密。例如mimikatz工具就会告诉KDC我所支持的加密算法就是RC4_HMAC_NT
等,诱使域服务器采用该算法进行加密。
总结
Kerberoasting 攻击的所有条件:
- 密数据
- 算法
- 口令字典库
Tim Medin 的 kerberoast 工具破解获取口令,使用 tgsrepcrack.py wordlist.txt tgs.kirbi
进行破解,其中 wordlist.txt 是字典文件,tgs.kirbi
是之前获取的 TGS
。破解的概率和时间依赖于口令复杂度、字典以及机器的性能。
当然还有算法更快的 HashCat 工具。
Kerberoasting 攻击后续
破解所服务账号的口令后,接下来就是如何利用账号实现对域的控制。
默认情况下,服务账号不允许以交互式方式登录域,只允许网络登录或以服务方式登录。
- 如果服务账号对应服务仍在正常使用,可构造类似白银票据进行伪造TGS,宣称以管理员访问服务账号所在的服务,进而获取该服务完全控制权
- 如果对应服务不存在,往往要使用服务账号访问其他服务,一般也可获取高权限
在Windows系统中,许多服务在服务器具有较高权限。例如MSSQL服务在服务器上具有本地管理员权限,如果以域管理员身份访问该服务,既可以控制服务本身,又可获取服务器本地管理员权限,并且,在这类服务器上,往往也留有高权限用户的登录凭证,获取这些凭证进而快速获取域控制权。
Kerberoasting 攻击例外
有时候存在这样的账号,他不要求进行Kerberos预身份验证,那么根据TGS密数据去破解口令的方式不适用,但是这类账户可能也有弱口令现象,同样可使用Kerberoasting破解用户账号口令。
可使用ARP欺骗,获取用户登录时的AS-REP包,然后离线破解。之所以要在用户登录时窃听,是因为根据Kerberos协议,使用用户NTLM进行加密的情景只出现在用户登录认证时候。
防御
- 提高服务账号的口令复杂度
- 尽量将域内的服务器系统升级至少至 windows2008 系统,应用 AES256 高难度的加密算法
检测Kerberoasting 攻击还是比较困难,因为执行攻击所做的操作都是合法常规操作。但也可从以下方面进行检测:
- 批量获取 TGS
- 声明使用低强度的加密算法