在过去的几个月中,checkpoint公司的漏洞和恶意软件研究团队共同专注于对恶意软件内部的漏洞利用,尤其是漏洞利用开发者本身的研究。本文会从一个事件响应示例开始,构建一个最全面的Windows开发者分析,本文研究人员将这些黑客统称为“Volodya”或“BuggiCorp”。有研究人员发现黑客Volodya是零日漏洞最多产的供应商之一,Volodya也被称为BuggiCorp。卡巴斯基自2015年以来一直在跟踪Volodya,他是一个多产的开发者和零日漏洞卖家。Volodya是“volo”的缩写,这个昵称经常出现在他的开发一些恶意软件中,根据追踪分析,他很有可能是乌克兰人。
另外Volodya似乎是CVE-2019-0859漏洞的开发者,这个漏洞被网络犯罪集团用于金融盗窃。Volodya开发的另一个漏洞CVE-2016-7255,曾被著名的俄罗斯APT组织FancyBear(也称为APT28、PawnStorm、Sednit、Sofacy或Strontium)使用。卡巴斯基的研究人员表示,黑客还与中低端网络犯罪组织合作,这些组织一直在购买和使用零日漏洞。除了零日漏洞之外,Volodya还在开发针对修复程序的漏洞。
到目前为止,研究人员设法跟踪了他们Windows内核本地特权升级(LPE)漏洞中的10多个(!),其中许多漏洞在开发时为零天。
事件响应示例
本文会从一个事件响应示例开始,在分析针对研究人员的一个客户的复杂攻击时,研究人员注意到该恶意软件执行了一个很小的64位可执行文件。该示例包含不寻常的调试字符串,这些调试字符串指向试图利用受害者计算机上的漏洞尝试。更重要的是,该示例具有一个剩余的PDB路径,该路径明确地声明并删除了此二进制文件的目标:...\cve-2019-0859\x64\Release\CmdTest.pdb。由于CVE-2019-0859实现缺少任何在线资源,我这意味着研究人员看到的不是一个公开可用的PoC,而是一个真实的开发工具,这激发了研究人员深入研究的兴趣。
CVE-2019-0859是一个CreateWindowEx函数中的UAF(Use-After-Free)漏洞。成功利用此漏洞的攻击者可以在内核模式下运行任意代码。然后攻击者可以安装程序;查看,更改或删除数据;或创建具有完全用户权限的新帐户。要利用此漏洞,攻击者首先必须登录系统。然后,攻击者可以运行可以利用此漏洞并控制受影响系统的特制应用程序。
对这个漏洞进行逆向工程非常简单,二进制文件很小,并且还能找到调试消息。它利用CreateWindowEx中的UAF漏洞来获取对父进程的提升特权。研究人员很快做出了一个有趣的观察:看来该漏洞利用程序和恶意软件本身的开发者不是同一个人编写的。代码质量、缺乏混淆、PDB和时间戳都表明了这一结论。
在Cutter中可以看到对CreateWindowEx的调用
恶意软件开发者的套路
研究人员倾向于将特定恶意软件家族背后的开发者视为一个完整的整体,这样就可以想象每个组件都是由其中一个人、一个团队或一个小组编写的。事实上,高级一点的恶意软件,都涉及具有不同技能的不同人员。特别是由国家组织开发的黑客软件可能涉及不同的团体和分支机构的数百甚至数千名员工。组织中的每个人员都有特定的角色,并经过特殊的技术培训和多年的专业知识积累。在这样的组织中,编写通用组件的工作量在专业团队之间分解,由不同的团队负责初始访问,收集敏感数据,横向传播等。
旨在将漏洞利用模块嵌入其恶意软件中的运营对象不能仅依靠恶意软件开发者,找到漏洞并可靠地利用漏洞,最有可能由专门从事特定角色的特定团队或个人完成。就其本身而言,恶意软件开发者并不在乎它在后台如何工作,他们只想集成此模块并完成它即可。
为了实现这种分工,两个团队需要就某种API达成一致,该API将成为不同组件之间的桥梁。这种集成API并不是国家所开发的黑客软件所独有的,而是自由市场中常见的特性。无论它涉及地下论坛,漏洞利用经纪人,还是网络公司,它们都向客户提供有关如何将漏洞利用方法集成到其恶意软件中的说明。
从本质上讲,这一整合点是研究人员在研究中要重点关注的关键方面。假设攻击开发者是独立工作的,并且只将他们的代码/二进制模块传播给恶意软件开发者,研究人员决定对他们进行改变。通过分析嵌入在恶意软件示例中的漏洞,研究人员可以了解更多关于漏洞开发者的信息,希望通过研究他们的编码习惯和在他们的开发过程中留下的其他内容作为线索来识别他们。
识别开发者的线索
研究人员没有关注整个恶意软件并寻找恶意软件家族或攻击者的新示例,而是想提供另一种视角,并决定将重点放在由开发人员编写的这些函数上,从事件响应示例中获得这个小的64位二进制文件看起来是一个有不错的开始。
该二进制文件除了利用CVE-2019-0859之外没有任何作用,并且不基于公开共享的源代码或POC。它是研究人员进行线索识别的一个很好的选择,因为可执行文件是从其他人编写的代码中提炼出来的,而不是漏洞开发者。此外,可执行文件与恶意软件(一种臭名昭著的犯罪软件)的主二进制文件是分开的,这让研究人员相信这个漏洞不是恶意软件开发者自己开发的。根据这个线索,研究人员开始寻找同一开发者开发的更多恶意软件。
研究人员首先从已有的二进制文件中收集简单的工件:字符串、内部文件名、时间戳和PDB路径。第一个结果立即出现——一个与64位示例完全匹配的32位可执行文件。具体来说,正如它们的时间戳和嵌入的PDB路径所示,它们是同时从相同的源代码编译在一起的。现在研究人员有了这两个示例,就能够确定研究人员应该寻找什么线索了。
为了确定这个漏洞的开发者,研究人员将注意以下的线索:
1. 二进制文件中的独特工件:
- 硬编码值(加密常数,“垃圾”值,例如0x11223344);
- 数据表(通常是特定于版本的配置);
- 字符串(GDI对象名称:“MyWindow”,“MyClass_56”,“findme1”等);
- PDB路径;
2. 代码段
(1) 独特的函数实现:
- Syscall包装器;
- 内联组装;
- 专有加密函数/实现;
(2) 技术和习惯:
- 首选的泄漏技术(HMValidateHandle,gSharedInfo等);
- 首选提升技术(令牌替换是如何执行的?);
- 堆喷涂技术(使用AcceleratorTables?Windows?Bitmaps?)
(3) 框架
漏洞利用的进程:
- 选项#1:几乎没有分支的主要开发进程;
- 选项#2:针对不同版本的操作系统的多重扭曲和旋钮;
(4) 代码的结构及其中的函数:
- 模块化:函数分离;
- 结构:分离出删除阶段(初始化,配置,喷涂,令牌交换等);
- 全局变量:哪些信息存储在全局变量中?(操作系统版本?操作系统版本枚举?只是特定的字段偏移量?)
(5) 特定于版本的配置:
- 字段偏移量:哪些字段特别重要?
- 首选系统调用:首选系统调用集
(6) 提供给客户的API
研究人员将寻找与利用漏洞相关的工件集
考虑到这些属性,研究人员回顾了研究人员拥有的两个示例,并标记了一些研究人员认为独特的工件。即使研究人员只有两个小的二进制文件(本质上是相同的),研究人员仍然能够创建搜寻规则来查找该开发者编写的更多示例。令研究人员惊讶的是,研究人员能够找到比想象中更多的开发线索。
顺着这个逻辑,一个接一个最后总共发现了几十个示例,并且每个示例都改进了研究人员的搜索规则和方法。通过对示例的仔细分析,研究人员能够了解哪些示例利用了哪个CVE,并以此为基础创建了时间表,以了解该漏洞是在暴露之前写为零日漏洞,一日漏洞还是基于修复程序扩散和类似技术实现的。
到目前为止,仅基于研究人员的线索识别技术,而没有进一步的情报,可以将10多个CVE来自于同一个漏洞利用开发者。后来,公开报道披露了研究人员的目标漏洞利用销售者的名称:Volodya(又名Volodimir),以前称为BuggiCorp。似乎研究人员并不是唯一追踪此漏洞利用者的人,因为卡巴斯基多次报告了有关他们的一些相关信息。此外,ESET在其VB2019关于Buhtrap的演讲中还提到了Volodya的一些重要线索。
根据卡巴斯基的说法,Volodya最初以其“BuggiCorp”绰号被人所熟知,当时他们在臭名昭著的Exploit[.]in网络犯罪论坛上宣传了Windows零日漏洞的待售广告,起价为95000美元。多年来,价格上涨,他们的某些WindowsLPE零日漏洞利用软件的售价高达20万美元。正如卡巴斯基报告中所发表的,后来得到研究人员的确认,Volodya将漏洞利用软件卖给了犯罪软件和APT团体。
漏洞分类
尽管研究人员的一些最初的搜索规则需要进行一些微调,甚至我们收到的即时结果也是相当令人吃惊的。经过进一步的搜索方法改正后,研究人员又设法找到了许多示例,所有示例都是Windows中的本地特权升级(LPE)漏洞。在这些示例中,研究人员能够确定攻击者所利用的以下CVE列表。
另外,在对漏洞进行分类的过程中,研究人员选择了一种保守的方法来判断一个给定的漏洞是在零日漏洞还是一日漏洞。如果其他安全供应商认为只是野外利用,那么它就是零日漏洞。如果研究人员找到足够的证据,证明研究人员的一个样本确实是在野外传播的利用,就像一个供应商在他们的报告中描述的那样,那么研究人员也标记它,除此之外都标记为一日漏洞。
下一篇文章我们来具体讲讲具体的漏洞。