当前位置: 首页 > 科技观察

如何通过寻找恶意开发者的线索来发现漏洞(下)

时间:2023-03-21 01:08:43 科技观察

接上一篇:如何通过寻找恶意开发者的线索来寻找漏洞(上)如何通过寻找恶意开发者的线索来寻找漏洞(下))内核地址泄漏在绝大多数漏洞利用中,攻击者使用内核指针泄漏原语来调整漏洞利用。在除CVE-2019-1458之外的所有漏洞利用中,这个泄露的原语是众所周知的HMValidateHandle技术。HMValidateHandle()是user32.dll的内部未导出函数,可以被isMenu()等各种函数利用,可用于获取所有Windows版本(直到Windows10RS4)中不同Window对象的内核地址。这种技术是众所周知的,甚至早在2011年就开始使用,因此大多数开发教程都选择专门解析isMenu()来查找HMValidateHandle()的地址。令人惊讶的是,在可用于查找HMValidateHandle()的数十种不同函数中,攻击者只是遵循了一个著名的教程并选择了也使用isMenu()。更令人惊讶的是,这种常见的利用技术多年来仍然运作良好,攻击者没有动机通过选择更高级的技术(例如CheckMenuRadioItem())来尝试“隐藏”。泄漏为研究人员提供了以下跟踪信息:窗口的内核地址;THREAD_INFO的内核地址(pti字段);此跟踪信息将在漏洞利用过程的多个步骤中使用:指向/创建假内核结构时使用地址;确保研究人员的内核地址是有效的Unicode字符串(不包含两个连续的“\x00”字节);pti用于定位一个有效的EPROCESS,然后在令牌交换阶段使用它;与PlayBit的对比:PlayBit选择了直接访问用户态桌面堆来实现这个功能。令牌交换这种攻击的最终目标是根据给定的PID参数将系统权限授予所需的进程。实现的方法是将EPROCESS/KPROCESS结构体中的进程替换为系统进程token的token。下面是执行此操作的一些常用技术,您会惊讶于有多少种不同的选项可以实现此功能。使用Ps表示法,Windows内核包含以下函数和进程相关函数的全局变量:PsLookupProcessByProcessId:检索指向进程EPROCESS的指针;PsInitialSystemProcess:包含指向系统EPROCESS指针的全局变量;指针;通过在内核模式下执行这些函数,一个给定的shellcode可以很容易地找到SYSTEM的token,但是仍然没有解决如何在期望的EPROCESS中分配token的问题。有两种常见的解决方案:使用版本特定的偏移量直接在EPROCESS中访问正确的偏移量;扫描EPROCESS以查找研究人员自己的指针(之前调用PsReferencePrimaryToken时已知的指针),并在进入时找到匹配项;该技术需要在内核模式下执行代码,因此它将被SMEP保护阻止,除非部署了另一个SMEP旁路。为目标和系统进程的EPROCESS扫描PsList的一个常见替代方法是扫描称为PsList的进程的双向链表,该技术涉及的步骤是:使用泄漏的pti字段,定位初始EPROCESS;使用目标PIDEPROCESS扫描PsList以查找EPROCESS;通过查找PID4或名称SYS来扫描PsList以搜索SYSTEM的EPROCESS;提取令牌并将其放置在目标进程中的匹配偏移量处;谨慎更新SYSTEM令牌的引用计数。Volodya漏洞利用Arbitrary-Read原语来搜索SYS,如Cutter所示。该技术需要PsList的主标记和LIST_ENTRY的偏移量,基本上要求将它们都存储为特定于版本的配置的一部分。这种技术的主要优点是,虽然它仍然可以在内核模式下作为简单的shellcode执行,就像在CVE-2017-0263的漏洞利用中所做的那样),它也可以在用户模式下完全实现。为此,您需要两种利用原语,一种用于任意读取(从内核空间),另一种用于任意写入(写入内核空间)。在用户模式下运行解决了研究人员之前为SMEP详细说明的问题,使这种保护对于这种利用原语毫无用处。由于令牌是一个引用计数对象,因此正确注册您刚刚添加的引用非常重要,以避免在提升的进程终止时出现蓝屏死机(BSOD)。实际上,有两种不同的引用计数:令牌是一个EX_FAST_REF对象,指针的低位用作引用计数;OBJECT_HEADER存储在令牌之前并保留另一个引用计数;由于攻击者选择更新后一个引用计数字段,因此需要执行以下步骤:屏蔽令牌指针的引用计数位:在32位进程中应该对齐到8个字节,并且应该是在64位进程中对齐到16字节。减去指向OBJECT_HEADER的引用计数字段所需的常量;读取值(使用任意读取利用原语);相应地增加它;写回更新后的值;在包含该函数的所有32位exploit中发现了以下漏洞:32位Exploits中ReferenceCountingUpdates中实现的漏洞读取引用计数值的对齐掩码是8字节对齐,而回写时使用不同的掩码更新值时。如果令牌将存储在与8字节而不是16字节对齐的内存地址中,则写操作将更新易受攻击的字段。尽管CVE-2016-0040和CVE-2016-0167使用Ps技术,但研究人员发现,扫描PsList是迄今为止攻击者最喜欢的执行令牌交换的方式,以这种方式用于他们的所有8次攻击。在其中的7个中,他们使用了用户模式任意读取和任意写入。与PlayBit的比较:在他们所有的例子中,研究人员经常会看到PlayBit使用Ps函数进行代币交换。这一决定迫使攻击者采用一些SMEP绕过方法,将它们集成到CVE-2016-7255和CVE-2018-8453的后续攻击中。这种设计选择说明了为什么攻击者不愿意将适当的任意读取原语作为攻击的一部分。PlayBit总是使用0x300或0x600作为搜索上限,而不是在EPROCESS中使用特定于版本的配置来进行令牌偏移,它总是扫描EPROCESS进行搜索。值得注意的是,PlayBit在不同漏洞利用中使用的内存破坏技术也被Duqu2.0使用,并在微软2015年发布的VBtalk中进行了分析。利用这种内存破坏,它们可以触发一些内存读写操作.PlayBit漏洞扫描EPROCESS以搜索代币,如Cutter所示。尽管研究人员还可以讨论其他方面,例如每个攻击者在开发过程中喜欢使用的不同系统调用、对已建立对象(如Windows和ScrollBars创建对象的命名约定)的影响。但研究人员认为,上述列表已经清楚地证明了研究人员方法的效率或有效性。从上面的列表中可以看出,几乎每个漏洞的每个方面都可以通过几种不同的方式实现。尽管如此,研究人员发现的这两名攻击者的攻击方法非常一致,每个人都坚持自己喜欢的方法。在整个研究过程中,研究人员希望将重点放在漏洞编写者身上,无论他们是Volodya、PlayBit还是其他人。然而,研究人员认为,通过查看漏洞开发者的客户群,也可以学到很多东西。Volodya的客户名单各不相同,包括Ursnif等银行木马的开发者,GandCrab、Cerber和Magniber等勒索软件开发者,以及Turla、APT28和Buhtrap等APT组织,这些组织最初是网络犯罪分子,后来演变成网络间谍活动。有趣的是,研究人员可以看到,Volodya的零日漏洞更有可能被出售给PT集团,而一日漏洞则被多个犯罪软件集团购买。在没有更多信息的情况下,研究人员只能假设一旦安全行业检测到零日漏洞,它就会被回收并以较低的价格出售。APT客户Turla、APT28和Buhtrap通常都来自俄罗斯,有趣的是,即使是这些高级团队也购买漏洞而不是在内部开发。这些事实进一步加强了研究人员的假设,即书面漏洞利用可以被视为恶意软件利用的前奏。下表总结并显示了来自Volodya的CVE,以及使用这些漏洞发现的客户端或恶意软件组。蓝色标记的CVE是零日漏洞,自然成本更高。左侧突出显示的组被视为APT。Volodya的客户和他们使用的CVE总而言之,研究人员在检查了一段时间内的漏洞样本后发现,他们还无法讨论尚未发现的零日漏洞。此外,研究人员只能尝试将样本追溯到它们被捕获之前的时间段,但可悲的事实是,研究人员通常可以确定此类攻击首次在野外出现的时间。此外,值得一提的是,Volodya从一开始就非常专业地开发了CVE-2015-2546的第一个漏洞。例如,它具有独特的任意写入原语,研究人员无法追踪到任何其他漏洞利用指南。在对研究人员收集的漏洞利用和数十个恶意软件样本进行分析时,研究人员注意到了一个有趣的变化。早期的Volodya漏洞是作为嵌入到恶意软件中的源代码出售的,而后来的漏洞是作为接受API的外部实用程序出售的,这一变化可能表明Volodya正在采取更多的反检测措施。在2015年至2019年期间,研究人员还注意到Volodya的技术水平有了显着提高。随着团队变得更好、更有经验,Volodya开始使用更高效的任意读写原语,他们甚至修复了这些原语之间的错误。CVE-2015-2546和CVE-2016-0165,并且随着大型函数被拆分成更小的子例程,漏洞利用代码变得更加模块化。此外,他们在各种结构中搜索和访问特定偏移量的技术也得到了改进,并且在最近的实现中,它更好地处理了Windows次要版本中的更改,从而变得更加动态和安全。这不仅表明攻击者的学习能力越来越强,也意味着他们的技能也在提高。找到并可靠地利用Windows内核漏洞的能力真的不是那么简单。相比之下,研究人员可以看到PlayBit在2015-2018年期间在这个市场非常活跃,他们的重点是销售单日漏洞,其中之一就是Volodya的零日漏洞(CVE-2016-7255)。总结研究人员的方法是在将这些特征用作独特的搜索签名之前识别漏洞利用开发者特征的线索。研究人员在追踪Volodya和PlayBit中的漏洞时两次使用了这种技术。通过这两个成功的测试实例,研究人员相信该研究方法可以用于搜索其他漏洞开发者。研究人员建议其他研究人员尝试本文中介绍的技术,并将它们用作他们武器库中的附加工具。在这项研究中,研究人员重点关注不同恶意软件家族在APT攻击和流行恶意软件(尤其是勒索软件)中使用或嵌入的漏洞。令人惊讶的是,研究人员能够重复使用研究人员的技术来跟踪由两个不同的攻击者编写和销售的16个WindowsLPE漏洞。考虑到其中15个处于2015-2019年的时间范围内,可以假设它们构成了漏洞利用市场的重要份额,尤其是WindowsLPE漏洞利用。最后,研究人员不可能知道Windows内核零日漏洞的总数。话虽这么说,研究人员仍然可以通过审查他们捕获的漏洞来了解整个情况。去年,卡巴斯基报告称,一名攻击者传播了一个漏洞利用框架,其中包括三个额外的零日漏洞。将这些数字相加,研究人员发现15个零日漏洞中有8个(超过“市场份额”的一半)仅来自两个开发团队。这意味着研究人员的研究技术有可能被用于追踪可见市场中的许多攻击者。本文翻译自:https://research.checkpoint.com/2020/graphology-of-an-exploit-volodya/