想象一个装有宝贵知识产权的文件保险柜。一名受雇的间谍打开它,拍下里面的文件,再关上柜门,然后离开。第二天早上,保险柜看起来和前一晚一模一样:同样的门,同样的密码,没有任何东西被移动过。没有什么需要放回原处,因为按照恢复工具所能理解的逻辑,什么都没有被拿走。损失早已以副本的形式离开了大楼。
这就是一大类 Active Directory 攻击所呈现的令人不安的形态,也是业界最青睐的防御叙事之所以留有一个漏洞的原因。
十年来,Active Directory 安全市场一直只在一个维度上竞争:你能多快撤销一次恶意更改。检测到恶意写入,发出警报,然后回滚到已知的良好状态。防篡改的更改跟踪和自动回滚,构成了整套方案的全部内容。作为一个恢复叙事,这确实是个好故事,而恢复也确实重要。但它让步于真正重要的那一点:更改已经发生了,而有些更改一旦发生,就无法变得"从未发生"。
那些在你能回滚之前就已经完成的 Active Directory 攻击
想想最快的 AD 攻击实际上是如何运作的。勒索软件团伙会串联利用像 noPac 这样的漏洞——即 CVE-2021-42278 和 CVE-2021-42287 背后的 sAMAccountName 欺骗组合——在几分钟内从一个普通账户提升到对整个域的完全控制权。一旦攻击者取得了这个位置,后续的技术手段就不再是那种可以事后清理的喧闹式破坏。它们是读取和身份冒充,会在回滚有任何东西可以恢复之前,就已经完成了全部工作。
DCSync 是最典型的例子,也直接对应前面保险柜的比喻。攻击者滥用目录自身的复制协议,向域控制器请求账户的密码哈希,并像另一台控制器那样接收这些数据。目录中不会留下任何被更改的对象,供恢复工具去发现和撤销。要说有什么"更改",那也只是一份已经流出的凭据副本。你事后可以重置所有密码,而且也应该这样做,但那时你所做的是清理一次盗窃留下的残局,而不是阻止这次盗窃本身。
DCShadow 则从相反的方向运作。它注册一台非法、伪造的域控制器,通过复制通道将攻击者选定的更改注入目录,绕过了监控所关注的常规写入路径。在这种情况下,有效的控制机制会在伪造复制被尝试的那一刻就将其拒绝,因此被注入的更改根本不会进入目录,也就没有什么可供回滚的对象。
现在再来看一次对组策略对象(GPO)的恶意编辑——比如那种会向每一台读取该策略的计算机分发勒索软件载荷的编辑,或者向某个特权组悄悄添加成员的操作。将该对象回滚,目录状态确实会被恢复。但策略早已分发出去,它所携带的载荷也早已运行。恢复该对象,对已经造成的影响范围毫无作用。
这正是恢复叙事走到尽头的地方。对于这整个类别的攻击而言,检测与回滚在结构上注定为时已晚,而预防并不是同一思路的更快版本——它是一门完全不同的学科。检测只能确认某种危险的东西已经到达了目录。预防则是在目录接受该操作之前,就将其阻止。
检测与预防之争:以两种方式推演一次 GPO 攻击
假设攻击者编辑了一个与你的服务器关联的 GPO,打算在下一次策略刷新时部署载荷。先按照恢复模型推演一遍。恶意设置被检测到并回滚,GPO 恢复到之前的状态;从纸面上看,事件已经了结。但在实际中,在编辑与回滚之间的这段时间窗口内拉取过该策略的每一台机器,都已经运行了载荷,无论如何恢复该对象,都无法撤销这次已经发生的执行。
现在反过来推演一遍。对该 GPO 的写入操作会被内联评估,并在 Active Directory 提交(commit)它之前予以拒绝。策略从未发生改变,因此也从未被分发,也就没有留下任何需要调查的载荷执行行为。同样的攻击,两种防御模型,而只有其中一种能让你无需清理任何东西。
为什么关键词是"预防",而不是"快速检测"
第二种结果,只有位于写入路径本身的控制机制才能实现。这正是 Netwrix Threat Manager 背后的机制:它对操作(对关键对象和 GPO 的更改、特权组的修改、以及复制请求)进行内联评估,并在目录提交该写入之前,就在源头将其阻止。即使原生日志记录已被禁用或清除,它也能在事件发生的源头捕获这些事件,因此攻击者无法通过先清除日志来蒙蔽该控制机制。这正是"预防"这个词真正配得上的原因,而不是披着更强硬措辞外衣的"快速检测"。
这一切都不意味着预防可以取代检测。有些攻击只能在事后被发现和应对,而假装并非如此,经不起任何一位称职的 CISO 会问出的第一个直接问题。过度承诺只会招致其应得的质疑。真正站得住脚的立场,比一句口号更为狭窄,也更为坚实:对于那些可以确定性地加以阻止的更改,优先采用预防;对于其余的一切,则采用检测与响应。
在这一切之下,存在着一种一以贯之的理念。坚持在危险更改被尝试的那一刻就将其阻止,正是"坚持在访问权限被使用的那一刻就知道是谁在使用它"这一理念在韧性层面的对应体现。二者都坚持在行动发生的那一瞬间采取行动,而不是等到事后再去清理。
这又把我们带回了那个看似完好无损的保险柜。回滚是一种承诺:你可以迅速撤销损害。预防则是一种保证:根本就没有需要撤销的损害。对于那些复制 Secret、冒充控制器、或是在你能够回滚之前就已经引爆的 Active Directory 攻击而言,这两种承诺中,只有一种是该机制真正能够兑现的——而这正是那个从未让更改被提交(commit)的控制机制所做出的承诺。
分享到
了解更多
关于作者
Dirk Schrader
安全研究高级副总裁(VP)
Dirk Schrader 是 Netwrix 的常驻 CISO(EMEA)以及安全研究高级副总裁(VP)。他拥有 CISSP(ISC²)和 CISM(ISACA)等资质,是一位在 IT 安全领域拥有 25 年经验的老兵。Dirk 致力于以现代化的方式应对网络威胁,从而推动网络韧性的发展。Dirk 曾参与全球范围内的网络安全项目:职业初期从技术与支持岗位做起,随后在大型跨国公司和小型初创企业中分别担任销售、市场与产品管理等职务。他已发表大量文章,强调为实现网络韧性,需要重视变更管理与漏洞管理。