太阳集团2138备用网址

欢迎来到 黑吧太阳集团2138备用网址 是业内专业的游戏平台,为你提供各式各样的精品游戏,最全的游戏项目,同时还为您提供各种游戏专题游戏攻略人气论坛。

成功获取WinRAR 19年历史代码执行漏洞

来源:本站整理 作者:佚名 时间:2019-02-21 TAG: 我要投稿

太阳集团2138备用网址 www.r-island.com 在本文中,我们讲述了如何使用WinAFL模糊测试工具找到WinRAR中的逻辑错误,并利用它来完全控制失陷主机的故事。该漏洞仅通过提取精心构造的存档文件即可成功利用,使超过5亿用户的主机面临风险。这个漏洞存在已达19年之久!并迫使WinRAR完全放弃对易受攻击格式的支持。
 
背景
几个月前,我们的团队构建了一个多处理器模糊测试实验室,并开始使用WinAFL模糊器对Windows环境下的二进制文件进行模糊测试。在收获了Adobe 的模糊测试研究成果后,我们决定扩展我们的模糊测试工作,针对WinRAR进行模糊测试。
模糊测试过程产生的一个Crash指引我们发现了一个WinRAR使用的2006年编译的,没有保护机制(如ASLR,DEP等)的过时的动态链接库。
我们将焦点和模糊测试的主要目标转向这个“容易上手”的dll,找到了一个内存损坏错误,并成功引发远程代码执行。
然而,模糊器产生了一个具有“怪异”行为的测试用例。在研究了这种行为之后,我们发现了一个逻辑错误:绝对路径遍历漏洞。从这一点开始,利用这个漏洞完成远程代码执行变得非常简单。
也许还值得一提的是,这类漏洞在Bug Bounty计划中,有巨大的奖金份额。

 
什么是WinRAR?
WinRAR是Windows的件归档应用程序,可以创建和查看RAR或ZIP文件格式的归档,并解压缩大量归档文件格式。
据WinRAR网站称,全球超过5亿WinRAR用户,这就使其成为当今世界上最受欢迎的压缩工具。
这就是GUI的样子:

 
模糊过程背景
这些是开始模糊WinRAR所采取的步骤:
在WinRAR主函数内部构造harness,使我们能够模糊任何存档类型而无需为每种格式构造相应的harness。这是通过给WinRAR可执行文件打补丁来完成的。
去除用户交互的对话框和GUI等元素,这也可以通过修补WinRAR可执行文件来完成。即使在WinRAR的CLI模式下,也会弹出一些消息框。
使用奥卢大学2005年左右进行的一项有趣研究发布的巨型语料库。
在WinRAR命令行模式下使用WinAFL对程序进行模糊处理。通过这样强制WINRAR解析“已损坏的存档”并设置默认密码(“-p”表示密码,“ – kb”表示保留损坏的解压缩文件)。这些参数和选项可以在WinRAR帮助手册中找到。
在短时间的模糊测试之后,我们发现了几个存档格式的崩溃,例如RAR,LZH和ACE,这些存档格式会导致内存损坏,例如Out-of-Bounds Write。但是,利用这些漏洞并非易事,因为原语提供了对覆盖缓冲区的有限控制。
然而,解析ACE格式时的崩溃引起了我们的注意。我们发现WinRAR使用名为unacev2.dll的DLL来解析ACE归档文件。快速浏览一下这个dll就会发现它是2006年没有保护机制的旧版dll。事实证明,漏洞利用的时候真的不需要绕过保护。
 
构建一个特定的Harness
由于这个dll看起来容易利用,所以我们专注它的模糊测试过程。
另外,就WinRAR而言,只要归档文件具有.rar扩展名,它就会根据文件的Magic字节处理它,在我们的示例中,是ACE格式。
为了提高模糊器性能,并仅增加相关dll的代码覆盖,我们为unacev2.dll创建了一个特定的Harness。
为此,我们需要了解如何使用unacev2.dll。逆向调用unacev2.dll进行ACE归档提取的代码后,我们发现应按以下顺序调用两个导出函数进行归档文件的提取:
名为ACEInitDll的初始化函数,具有以下签名:INT __stdcall ACEInitDll(unknown_struct_1 * struct_1);•struct_1:指向未知结构的指针
名为ACEExtract的提取函数,具有以下签名:INT __stdcall ACEExtract(LPSTR ArchiveName,unknown_struct_2 * struct_2);•ArchiveName:指向要提取的ace文件的路径的字符串指针•struct_2:指向未知结构的指针
这两个函数都需要传递我们不知道的结构。我们有两种方法可以尝试理解未知的结构:逆向,调试WinRAR,或尝试查找使用这些结构的开源项目。
第一种选择更耗时,因此我们选择尝试第二种选择。我们在github.com上找到了ACEInitDll这个导出函数,并找到了一个名为FarManager的项目,该项目使用此dll并包含未知结构的详细头文件。
注意:此项目的创建者也是WinRAR的创建者。
将头文件加载到IDA后,更容易理解两个函数(ACEInitDll和ACEExtract)之前的“未知结构”,因为IDA为每个结构成员显示了正确的名称和类型。
从我们在FarManager项目中找到的标题中,我们提出了以下签名:
INT __stdcall ACEInitDll(pACEInitDllStruc DllData);
INT __stdcall ACEExtract(LPSTR ArchiveName,pACEExtractStruc Extract);
为了模仿WinRAR使用unacev2.dll的方式,我们分配了与WinRAR相同的结构成员。
我们开始模糊这个Harness,但我们没有发现新的崩溃,并且覆盖范围没有在模糊测试的前几个小时内扩展。我们试图了解这种限制的原因。
我们首先查找有关ACE归档格式的信息。
 
了解ACE格式
我们没有找到该格式的RFC,但我们确实在互联网上找到了重要信息。
1.创建ACE存档受专利保护。 唯一允许创建ACE存档的软件是WinACE。 该项目的最后一个版本是在2007年11月编译的。该公司的网站自2017年8月以来一直处于关闭状态。但是,提取ACE存档不受专利保护。
这个维基百科中提到了一个名为acefile的纯Python项目。 它最有用的功能是:
它可以提取ACE档案。
它包含有关ACE文件格式的简要说明。
它有一个非常有用的功能,打印文件格式标题和解释。
要理解ACE文件格式,让我们创建一个简单的.txt文件(名为“simple_file.txt”),并使用WinACE对其进行压缩。 然后,我们将使用acefile检查ACE文件的标头。
simple_file.txt如下:

[1] [2] [3] [4] [5] [6]  下一页

【声明】:太阳集团2138备用网址(http://www.r-island.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@www.r-island.com,我们会在最短的时间内进行处理。