Kerberoast攻击实战:通过Meterpreter会话远程破解Kerberos票据

本文详细介绍了如何通过已建立的Meterpreter会话远程执行Kerberoast攻击,利用Impacket工具获取服务票据,并通过Hashcat离线破解弱密码服务账户,最终获取域管理员权限的完整技术流程。

Kerberoast攻击实战指南

Derek Banks //

本文将逐步介绍一种技术:通过已建立的Meterpreter会话远程执行Kerberoast攻击,连接到基于互联网的Ubuntu 16.04 C2服务器,并使用Hashcat离线破解票据。

最近,我在Active Directory域环境中使用称为Kerberoasting的攻击技术在权限提升方面取得了很大成功。Tim Medin在2014年SANS Hackfest上介绍了这种技术,此后出现了许多优秀的文章和会议演讲,详细介绍了这种攻击的细节,并编写了不同技术实现工具(参考链接见文末)。

微软的Kerberos实现可能有点复杂,但攻击的要旨是利用旧版Active Directory对较旧Windows客户端的支持,以及用于加密和签名Kerberos票据的加密类型和密钥材料。本质上,当域账户配置为在环境中运行服务(如MS SQL)时,域中使用服务主体名称(SPN)将服务与登录账户关联。当用户希望使用特定资源时,他们会收到一个用运行服务的账户的NTLM哈希签名的Kerberos票据。

这确实是对过程细节的过度简化,但最终结果是任何有效的域用户都可以请求注册服务的SPN(我主要看到的是SQL和IIS),并且收到的Kerberos票据可以离线获取并破解。这很重要,因为通常服务账户至少会是其运行服务器上的管理员。

那么我们如何实现这一点?假设C2服务器上已经安装了Metasploit,我们需要从Core Impact获取Impacket项目。这是一组用于处理网络协议的Python类。如果未安装Metasploit,TrustedSec的PTF框架在Ubuntu 16.04上使其变得容易。

1
#git clone https://github.com/CoreSecurity/impacket

接下来,我们需要安装和配置proxychains。安装后,唯一的配置更改是所需的端口(例如8080)。

1
#apt-get install proxychains

现在我们需要一个已建立的meterpreter会话。在渗透测试中有许多方法可以实现这一点,不同的方法可能取决于具体情况,因此我们假设已建立的活动会话。

接下来,我们在Metasploit中设置路由以覆盖包含域控制器IP地址的内部子网。

我们现在需要一种通过meterpreter连接外部路由到Metasploit工具的方法。为此,Metasploit有一个名为socks4a的模块,使用内置路由来中继连接。将SRVPORT选项设置为与配置proxychains时使用的端口值相同。

我通常是个多疑的人,既然socks代理端口现在是一个通过内部网络路由的开放套接字,我建议使用IP表将到8080的连接限制为本地主机。一些主张裸奔的黑客可能认为这过分了,但有时我认为使用防火墙是合适的——这就是其中之一。我使用的IP表规则文件在这里。

将IP表规则文件放在/etc/iptables.rules中并运行:

1
#/sbin/iptables-restore < /etc/iptables.rules

现在我们都设置好了,可以使用一个Impacket示例脚本和一个有效的非特权域账户,通过meterpreter会话上的proxychains收集通过SPN广告的Kerberos票据。

1
#proxychains GetUserSPNs.py -request -dc-ip 192.168.2.160 lab.local/zuul

GetUserSPNs脚本收集的任何Kerberos票据都可以直接用Hashcat破解,无需任何额外转换(哈希类型在3.0版本中添加)。在我的Windows桌面上,使用单个Radeon R280,服务账户的密码在三分钟内使用Crackstation单词列表破解。

1
hashcat -m 13100 -a 0 sqladmin_kerberos.txt crackstation.txt

更进一步,一旦获得域管理员权限,可以使用相同的通过meterpreter代理工具的方法,使用另一个名为secretsdump.py的Impacket示例脚本从域控制器转储域账户哈希。

在我的实验室示例中,SQL管理员服务账户有一个弱密码,并且也是域管理员组的成员。你可能认为这有点做作,但事实并非如此。在过去的几个月里,尤其是在多年来有机增长的老旧Active Directory环境中,我直接使用Kerberoasting和破解域管理员组成员密码获得了域管理员账户。我随后多次通过进一步 pivoting 提升到域管理员。

1
#proxychains secretsdump.py -just-dc-ntlm LAB/sqladmin@192.168.2.160

目前的修复方法是确保环境中的所有服务账户都有非常长的密码。多长取决于你认为潜在攻击者拥有什么资源来破解密码。我目前的建议(基于潜在的密码破解工具限制)是28个字符或更长,并每6个月轮换一次。

感谢所有花时间、研究和努力攻击Kerberos的人。一如既往,我站在巨人的肩膀上。如果我遗漏了任何参考文献,那不是故意的,如果有其他相关链接应包含,请告诉我们:

https://adsecurity.org/?p=2293 https://www.sans.org/cyber-security-summit/archives/file/summit-archive-1493862736.pdf https://room362.com/post/2016/kerberoast-pt1/ http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz https://github.com/nidem/kerberoast https://msdn.microsoft.com/en-us/library/ms677949(v=vs.85).aspx

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计