0x01 环境配置
所有测试应至少有一个处理器4GB RAM 的CentOS虚拟机可以重复。
需要安装F-Secure Internet Gatekeeper,可以从https://www.f-secure.com/en/business/downloads/internet-gatekeeper下载。但据我们所知,供应商不再提供粗漏洞的版本。
受影响的程序包具有以下功能SHA256哈希值:
1582aa7782f78fcf01fccfe0b59f0a26b4a972020f9da860c19c1076a79c8e26。
继续安装:
1.如果使用的话x64版本的CentOS,请执行 yum install glibc.i686;
2. 使用下列命令进行安装Internet Gatekeeper文件: rpm -I< fsigkbin >.rpm;
3. 为获得更好的调试体验,安装gdb 8 和https://github.com/hugsy/gef。
现在可以用了GHIDRA / IDA反编译器开始逆转Internet Gatekeeperl了!
0x02 漏洞分析
如F-Secure所述,Internet Gatekeeper是“企业网络在网关级别的高效易管理保护解决方案”。
F-Secure Internet Gatekeeper9012 / tcp上运行管理面板。这可用于控制产品中所有可用的服务和规则(HTTP代理,IMAP代理等。fsikgwebui二进制文件通过HTTP服务,二进制文件C编写的。实际上,整个Web所有服务器C / C 写作。有一些关于civetweb参考表明可能使用定制版本CivetWeb。
它是用C / C 写的事实让我们走上了寻找这种语言中常见的内存破坏漏洞的道路。
很快就可以使用了Fuzzotron模糊管理面板,发现本文描述的问题,Fuzzotron使用Radamsa作为底层引擎。fuzzotron内置的TCP支持网络服务的轻松模糊测试。对于种子,我们提取了POST该请求用于更改管理面板上的语言。该请求可由未经身份验证的用户执行,因此非常适合作为模糊测试的种子。
分析突变输入时,通过radamsa快速看到漏洞的根本原因是Content-length标题。导致软件崩溃的测试具有以下标头值:Content-Length: 21487483844,表明整数溢出不正确。
通过在gdb测试后,我们发现导致崩溃的代码位于fs_httpd_civetweb_callback_begin_request函数中。该方法负责处理传入的连接,并将其分配给相关函数,这取决于所使用的函数HTTP,路径或cookie。
为了演示这个问题,我们将面板运行管理POST我们设置了一个大的端口9012发送请求Content-Length标题值。
该应用程序将分析该请求并执行该请求fs_httpd_get_header函数检索内容长度,然后将内容长度传递给函数strtoul(String To Unsigned Long)
以下伪代码提供了控制流的摘要:
strtoul相应的阅读man页面可以理解函数中发生了什么。返回值 strtoul无符号long int,它可能有最大值2^32-1(在32位系统上)。
因为我们提供的数据Content-Length对于无符号long int太大了,所以strtoul将返回对应0xFFFFFFFF于32位系统的ULONG_MAX值。
到目前为止,一切都很好,当fs_httpd_civetweb_callback_begin_request试着发出函数malloc请求认为,当我们的数据腾出空间时,它首先将1添加到content_length然后调用变量malloc。
以下伪代码可见:
因为这个值会导致问题0xFFFFFFFF 1会导致整数溢出,结果是0x00000000,因此,malloc调用将分配0字节内存。
Malloc0字节参数确实允许调用,当malloc(0)将有效指针的堆叠空间返回并指向分配0×10手册页上还可以阅读字节的最小尺寸:
若进一步浏览Internet Gatekeeper代码,可以看对mg_read的调用。
在溢出期间,该代码没有任何限制地读取任何数据。这是一个很好的漏洞使用原语,因为我们可以停止写字节HTTP并且软件将关闭连接,在这种情况下,我们可以完全控制要写的字节数。
总之,我们可以使用它Malloc大小为0x10的块以及任意数据的溢出来覆盖现有的内存结构,以下PoC这证明了这一点。虽然很原始,但它通过翻转标志来利用堆上现有的结构should_delete_file = true,然后用要删除的文件的完整路径喷射堆。Internet Gatekeeper内部处理程序有一种decontruct_http查找此标志并删除文件的方法。攻击者可以使用此漏洞删除任何文件,以证明漏洞的严重性。
可以进行RCE,因为我们可以控制确切的块大小,并覆盖我们想要的块上尽可能多的数据。此外,该应用程序使用多个线程进入干净的堆区域,并尝试多次使用。
此漏洞已在F-Secure Internet Gatekeeper版本5.40 – 5.50修补程序8(2019-07-11)中修复。
0x03 学习堆利用资源
利用
·Linux Heap Exploitation Intro Series: Set you free() – part 1
·Linux Heap Exploitation Intro Series: Set you free() – part 2
GLibC
·GLibC Malloc for Exploiters - YouTube
·Understanding the GLibC Implementation - Part 1
·Understanding the GLibC Implementation - Part 2
工具
·GEF-GDB此外,它还有一些有用的命令来调试堆漏洞
·Villoc-在HTML中图形化显示堆
本文翻译自:https://blog.doyensec.com/2020/02/03/heap-exploit.html若转载,请注明原址: