前面我们介绍了《Windows 本地认证》、《Windows 网络认证》、《Windows 域认证》和《SPN 扫描》,这次继续讲解域内相关的东西。
0x01 介绍
当发布 Windows 2000 和 Active Directory 时,微软打算在 Windows NT 和 Windows 95 上也支持 Active Directory,这意味着不仅会产生各种各样的安全问题也会导致更多不安全的配置方式。同时,也意味着,微软要保证在多个不同版本的 Windows 客户端上均支持 Kerberos 协议。要实现这个想法的一个简单的办法就是在 Kerberos 协议中使用·RC4 加密算法·,并将 NTLM 密码哈希作为该加密算法的私钥,该私钥可用于加密或签名 Kerberos 票证。因此,对于攻击者来说,一旦发现了 NTLM 密码哈希,就可以随意使用,包括重新拿回 Active Directory 域权限(比如:黄金票证和白银票证攻击)。
之前我们已经了解过通过 SPN 来进行域内服务发现,如果对 spn 还没有了解透彻的,请移步“SPN 扫描”
0x02 Kerberos 通信流程
这里借鉴一下网上给出的 Kerberos 的通信流程
用户使用用户名和密码进行登录
1a.
将原始的明文密码转换为 NTLM 哈希,再将这个哈希和时间戳一起加密。最后,将加密的结果作为身份验证者发送到 KDC 进行身份验证的票据(TGT)请求(AS-REQ)。
1b.
域控(KDC)检查用户信息(登录限制,组成员等)并创建票证授权票证(Ticket Granting Ticket-TGT)。
2.
将 TGT 加密,签名并返回给用户(AS-REP)。只有域中的 Kerberos 服务(KRBTGT)才能打开和读取 TGT 数据。
3.
当用户请求票证授权服务(TGS)票证(TGS-REQ)时,会将 TGT 发送给 DC。DC 打开 TGT 并验证 PAC 校验和 – 如果 DC 可以打开票证并且校验和也可以验证通过,那么这个 TGT 就是有效的。之后,复制 TGT 中的数据用于创建 TGS 票证。
4.
使用目标服务帐户的 NTLM 密码哈希对 TGS 进行加密并将加密结果发送给用户(TGS-REP)。
5.
用户连接到服务器托管的服务的相应端口上并发送 TGS(AP-REQ)给服务器。被托管的服务会使用服务账户的 NTLM 密码哈希打开 TGS 票证。
6.
如果客户端需要进行相互之间的身份验证(可以想想 MS15-011:在 2 月份发布的强化 UNC 的组策略补丁)就会执行这一步。
在第四步的时候,用户将受到由目标服务实例的 NTLM hash 加密生成的 TGS,他的加密算法为·RC4-HMAC·,那么我们在获得这个 TGS 后,便可以通过穷举的方式,生成 TGS 与它进行比较,如果相同,就可以代表密码正确
然后还有几点是需要大家明白的
1. 当域控查询某一个服务的 SPN 时
如果该 SPN 注册在 机器账户 computers
下,将会查询所有 机器账户
的 servicePrincipalName 属性,找到所对应的账户。
如果是注册在 域用户账户 users
下,将会查询所有 域用户账户
的 servicePrincipalName 属性,找到其所对应的账户。
找到对应的账户之后,使用它的 NTLM hash 生成 TGS。
2. 域内的 所有主机
都是可以查询 SPN 的
3. 域内的 任何用户
都是可以向域内的任何服务请求 TGS
所以,域内的任何一台主机,都可以通过查询 SPN,向域内的所有服务请求 TGS,然后进行暴力破解,但是对于破解出的明文,只有域用户的是可以利用的,机器账户的不能用于远程连接,所以我们的关注点主要就在域用户下注册的 SPN
。
0x03 实验
首先我们先登陆服务器
域控
192.168.5.130
Administrator
Win7
192.168.5.238
机器账号 SECQUAN_WIN7-PC\secquan_win7
域用户账号 ZHUJIAN\win7
我们使用下列命令来进行查询
setspn -q */*
这个内容我们在 spn 扫描中也已经说明了,而且我们也发现 MSSQL 服务是注册在机器账户下的,前面也说过了,我们要关注的是域用户下注册的 SPN
这里还有一个东西需要注意一下,在使用 Kerberos 身份验证的网络中,必须在内置计算机帐户(如 NetworkService 或 LocalSystem)或用户帐户下为服务器注册 SPN。
** 对于内置帐户,SPN 将自动进行注册。但是,如果在域用户帐户下运行服务,则必须为要使用的帐户手动注册 SPN,所以我们需要手动在域用户下注册 SPN。
我们先使用 klist
命令,查询一下当前计算机下所存在的票据
紧接着,我们来给域用户下的 MSSQL 服务注册 SPN
setspn -A MSSQLSvc/SECQUAN_WIN7-PC.zhujian.com zhujian\win7
注册完成后,我们再进行查看,确保已经注册到这个域用户下
可以发现已经多了一行域用户的值
然后 请求 SPN Kerberos Tickets
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/SECQUAN_WIN7-PC.zhujian.com"
然后再次查询所存放的票据
比之前多了一条,且加密类型是RC4-HMAC
然后使用 mimikatz
来导出票据
接下来便可以使用 tgsrepcrack 或者保存 hash 使用 hashcat 破解
这里我们使用 tgsrepcrack 来进行测试
python tgsrepcrack.py mima.txt 1-40a00000-win7@MSSQLSvc~SECQUAN_WIN7-PC.zhujian.com-ZHUJIAN.COM.kirbi
可以发现已经成功爆破得到密码
** PS:使用其他工具的方法都是类似的,工具都一样,重点在字典上
0x04 kerberoasting 后门利用
如果我们有了 SPN 的注册权限,我们就可以给指定的域用户注册一个 SPN,然后获取到 TGS,然后破解得到密码
这里我们用网上的一个例子来让大家明白一下流程即可,其他的内容均与前面所讲到的相同
文章首发公众号:无心的梦呓(wuxinmengyi)
这是一个记录红队学习、信安笔记,个人成长的公众号
扫码关注即可