Kerberoasting - 密码学工程的一些思考
我经常了解到各种密码学漏洞,它们通常让我充满嫉妒("为什么我没想到这个")或者让我对发明者的才华印象深刻。但还有另一类漏洞:这些漏洞本不可能存在于重要的生产软件中,因为在2025年没人还会这样做。
今天我想讨论其中一个荒谬的漏洞,微软称之为"低技术、高影响"。这个漏洞并不特别新;实际上最糟糕的是它已经有名字十多年了,而且存在时间更长。我敢打赌大多数Windows用户已经知道这些,但我今天才偶然了解到它,在看到参议员Wyden给微软的信后,信中描述了该漏洞在2024年5月对Ascension Health医院系统的勒索软件攻击中被使用。
这个漏洞叫做Kerberoasting,简而言之,它依赖于微软Active Directory非常非常古老这一事实。还有:RC4。如果你还不知道我要讲什么,请继续阅读。
几个更新:HN上的网友指出我在这里使用了一些不正确的术语(抱歉!)并添加了一些好的注释,所以我正在下面更新。此外,发现并命名该攻击的Tim Medin在这里有一篇很好的文章。
什么是Kerberos和Active Directory?
微软的Active Directory(AD)是一个多触手的章鱼,控制着几乎每个运行Windows机器的网络的访问。该系统使用集中式身份验证服务器来确定谁可以访问哪些网络资源。如果员工的计算机需要访问某些网络服务(比如文件服务器),Active Directory服务器会验证用户身份并帮助他们安全连接到服务。
这意味着AD也是确保攻击者无法进一步深入企业网络的主要屏障。如果攻击者以某种方式在企业内部获得立足点(例如,因为员工点击了恶意的Bing链接),他们绝对不应该能够横向移动并接管关键网络服务。这是因为任何此类访问都需要员工的机器具有访问特权账户(称为"服务账户")的权限,这些账户具有完全控制这些机器的权限。管理良好的网络显然不会允许这种情况发生。这意味着AD是站在大多数公司和完全灾难之间的"守护者"。
不幸的是,Active Directory是从时间深处拖出来的怪物。它使用Kerberos协议,该协议最早于1989年初推出。自1989年以来发生了很多事情!公平地说,Active Directory本身实际上直到1999年才首次亮相;但(不太公平的是)其来自那个时期的大部分遗留密码学似乎仍然在AD中得到支持。这非常糟糕,因为密码学异常糟糕。
让我具体说明。
当你想要获得对某些网络资源(AD术语中的"服务")的访问权限时,你首先联系AD服务器(称为KDC)以获得可以发送给服务进行身份验证的"票据"。该票据使用在KDC和服务本身建立的长期服务"密码"进行加密,并交给进行调用的用户。
理想情况下,这个服务密码根本不是密码:它实际上是一个随机生成的加密密钥。微软甚至有系统定期生成和轮换这些密钥。这意味着即使用户是恶意的,加密的票据对他们来说也是完全难以理解的。但偶尔网络管理员会犯错误,一个(显然)比较常见的错误是设置连接到普通用户账户的服务,并配备人工生成的密码。
由于人工密码可能不是密码学强的,使用它们加密的票据极易被破解。这非常糟糕,因为任何随机用户——包括我们假设的笔记本电脑恶意软件黑客——现在都可以获得此类票据的副本,并尝试通过使用字典攻击尝试许多候选密码来离线破解服务的密码。这样做的结果是用户学习到一个账户密码,使他们能够完全控制该基本服务。而这的结果(经过几个额外步骤)通常是勒索软件。
这不可爱吗?
那实际上似乎不太可爱?
当然不是。这实际上是一个应该在几十年前就被淘汰的糟糕设计。我们不应该构建这样的系统:任何随机攻击者只要攻陷单个员工笔记本电脑就可以请求用关键密码加密的消息!这基本上是在邀请离线破解攻击,这些攻击甚至不需要在受感染的笔记本电脑上执行——它们可以被导出到网络外的另一个位置,并使用GPU和其他硬件执行。
在实践中,有几件事可以阻止这种攻击。正如我们上面指出的,如果账户有足够长(随机!)的密码,那么破解它应该几乎是不可能的。微软可以阻止用户配置使用弱人工生成密码的服务,但显然他们没有——至少因为这种情况已经发生了很多次(包括在Ascension Health)。
假设你没有使用强加密密钥作为服务的密码。你在哪里?
在这种情况下,你最好的希望是加密票据对攻击者来说极具挑战性。因为此时,阻止攻击者访问你服务的唯一因素是计算能力。但是——这是一个非常弱的"但是"——计算能力仍然可以是一种威慑!在"标准"身份验证模式下,票据使用AES加密,使用基于服务密码和每个账户盐(更新:这不是真正的随机盐,它是域和主体名称的组合)通过4,096次PBKDF2哈希迭代派生的密钥。盐意味着攻击者无法轻松预计算哈希密码字典,虽然PBKDF2(加上AES)不是一个惊人的防御,但它限制了在给定时间单位内可以尝试的密码猜测次数。
Chick3nman的这个页面提供了一些使用RTX 5090计算的优秀密码破解统计数据。它暗示黑客每秒可以尝试680万个候选密码,使用AES-128和PBKDF2。
所以这不太好。但也不可怕,对吧?
这不是故事的结束。事实上,很明显这不是故事的结束,因为Active Directory是在1999年发明的,这意味着在某个时候我们将不得不处理RC4。
事情是这样的。任何时候你看到诞生于1990年代但使用AES的密码学,你不可能在处理原始版本。你看到的是原始的现代化、"升级"版本。原始版本可能使用算盘和巫术,或者(如果不行)至少使用一些未加盐的哈希函数和RC4的组合。最糟糕的部分是:事实证明,在Active Directory中,当用户不配置服务账户使用更新的模式时,Kerberos确实会回退到RC4,结合未加盐的NT哈希(基本上,一次MD4迭代)。
使用RC4(和NT哈希)的主要含义是以这种方式加密的票据变得可笑、荒谬地快速破解。根据我们的朋友Chick3nman的说法,相同的RTX 5090每秒可以尝试41.8亿(带"b")密码猜测。这比AES变体快大约1000倍。
顺便说一句,NT哈希没有加盐,这意味着它们容易受到涉及彩虹表的预计算攻击。我最近一直想在这个博客上写关于彩虹表的内容,但说服自己它们大多不重要,因为这些古老的未加盐哈希函数正在消失。我想我可能说得太早了?更新:参见下面Tom Tervoort的优秀评论,其中提到有一个随机的8字节"混淆器"在密钥派生过程中充当盐。
微软对此做了什么?
显然不够。这些"Kerberoasting"攻击已经存在很长时间了:该技术和名称归功于Tim Medin,他在2014年提出了它(许多流行博客随后跟进),但漏洞本身更古老。2024年使用这些想法的实际勒索软件攻击表明(1)系统管理员没有足够地加固系统,但更重要的是,(2)微软仍然没有关闭使这些攻击成为可能的不安全选项。
为了说明我们现在的位置,2024年10月,微软发布了一篇关于如何避免基于Kerberos的攻击的博客文章(注意:我不能再认真地说Kerberoasting了)。
这些建议都有些令人沮丧。他们建议管理员应该使用适当的自动密钥分配,如果做不到,那么尝试选择"真正好的长密码",如果做不到,请务必关闭RC4。但微软似乎没有做任何主动的事情,比如绝对禁止过时的遗留内容,或者完全令人讨厌并强制管理员升级他们奇怪和糟糕的遗留配置。相反,这一切似乎更像是勉强和半生不熟的漏洞管理。
我确信有一些原因,但我拒绝相信它们是好的原因,微软可能应该更加努力确保这些过时的服务消失。现在不是1999年,甚至不是2014年。
如果你不相信我这些观点,去问问Ascension Health。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码