欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Fortigate SSL VPN漏洞分析

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


 
0x00 前言
上个月我们分析了Palo Alto Networks GlobalProtect中的RCE漏洞,今天来看重头戏:针对Fortigate SSL VPN的漏洞分析。我们已经在Black Hat和DEFCON上发表过相关演讲,如果大家想了解更多细节,可以下载演讲文稿。
整个故事从8月份开始讲起,当时我们开始研究SSL VPN。与site-to-site VPN相比(如IPSEC和PPTP),SSL VPN更便于使用,并且可以与任何网络环境相兼容。因此,现在SSL VPN已经成为企业领域最流行的远程访问方式。
然而,如果这类“可靠的”设备不再安全那怎么办?虽然这类设备是重要的企业资产,但通常却疏于管理。根据我们对财富500强企业的调查结果,前3大SSL VPN厂商占据了75%的市场份额,SSL VPN市场并没有太复杂,因此一旦我们在常见的SSL VPN中找到严重漏洞,就会造成巨大的影响。此外,SSL VPN必须对互联网开放,因此也是绝佳的攻击点。
在研究之初,我们对SSL VPN主要企业涉及到的CVE数量进行了统计,结果如下:

似乎Fortinet以及Pulse Secure是最为安全的解决方案,但这是真的吗?我们一直都是勇敢的挑战者,因此决定开始寻找Fortinet及Pulse Secure的弱点。本文介绍了关于Fortigate SSL VPN漏洞方面的内容,下一篇文章会介绍关于Pulse Secure的内容,那部分最为精彩,敬请关注。
 
0x01 Fortigate SSL VPN
Fortinet将其SSL VPN产品线称为Fortigate SSL VPN,主要应用于最终用户以及中型企业。目前互联网上这些服务器的数量已超过48万台,主要集中在亚洲及欧洲区域。Fortigate SSL VPN在URL中有一个/remote/login特征,并且包含如下3个特点:
1、一体化程序
我们从文件系统开始研究,尝试列出/bin/目录中的所有程序,发现这些都是符号链接,指向/bin/init,如下所示:

Fortigate将所有程序编译并配置成一个统一的程序,因此会让最终的init程序变得非常庞大。这个程序包含上千个函数,并且没有符号,只包含SSL VPN所需的必要程序,整个环境对黑客来说非常不友好。比如,我们在这个文件系统中甚至找不到/bin/ls或者/bin/cat。
2、Web守护进程
Fortigate上运行着2个web接口,一个用于管理界面,监听在443端口,由/bin/httpsd负责处理;另一个是普通用户界面,默认监听在4433端口上,由/bin/sslvpnd负责处理。通常情况下,管理员页面不会对互联网开放,因此我们只能访问用户接口。
经过调查后,我们发现这个web服务器是apache的修改版,但竟然源自于2002年的apache。显然官方对2002版的apache进行了修改,添加了自己的功能。我们可以对照apache的源码,来加快分析进度。
这两个web服务都将自己的apache模块编译到程序文件中,以处理每个URL路径。我们可以找到标明处理函数的一张表,继续深入研究这些函数。
3、WebVPN
WebVPN是一种非常方便的代理功能,可以让我们简单通过浏览器连接到所有服务。WebVPN支持许多协议,比如HTTP、FTP、RDP,也能处理各种web资源,比如WebSocket以及Flash。为了正确处理网站业务,WebVPN会解析HTML,重写所有网址。这个过程涉及到大量字符串操作,很容易产生内存错误。
 
0x02 漏洞描述
我们找到了一些漏洞:
CVE-2018-13379:预认证任意文件读取
在获取对应的语言文件时,目标设备会使用lang参数来生成json文件路径:
snprintf(s, 0x40, "/migadmin/lang/%s.json", lang);
该操作没有保护措施,会直接附加文件扩展名。看上去我们似乎只能读取json文件,然而实际上我们可以滥用snprintf的功能。根据man页面,snprintf最多会将size-1大小的数据写入输出字符串中。因此,我们只需要让数据超过缓冲区大小,就可以剔除.json扩展符,从而实现任意文件读取。
CVE-2018-13380:预认证XSS
目标服务存在几个XSS点,如下所示:
/remote/error?errmsg=ABABAB--%3E%3Cscript%3Ealert(1)%3C/script%3E
/remote/loginredir?redir=6a6176617363726970743a616c65727428646f63756d656e742e646f6d61696e29
/message?title=x&msg=%26%23svg/onload=alert(1)>;
CVE-2018-13381:预认证堆溢出
目标分2阶段对HTML实体代码进行编码。服务器首先会计算编码字符串所需的缓冲区大小,然后将编码结果存放到该缓冲区中。举个例子,在计算阶段,字符串的编码结果为,这样就会占用5个字节。如果服务器碰到了以&#开头的字符串(比如),就认为该字符出已经经过编码,会直接计算字符串长度,例如:
c = token[idx];
if (c == '(' || c == ')' || c == '#' || c == ' || c == '>')
    cnt += 5;
else if(c == '&' && html[idx+1] == '#')
    cnt += len(strchr(html[idx], ';')-idx);
然而,长度计算过程以及编码过程中存在不一致的部分,编码部分并没有充分考虑到这种情况。
switch (c)
{
    case ':
        memcpy(buf[counter], ", 5);
        counter += 4;

[1] [2] [3]  下一页

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