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

FortiClient本地提权0day漏洞分析

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

一、前言
我们在FortiClient中找到了3个漏洞,低权限用户可以组合利用这3个漏洞提升至NT AUTHORITY/SYSTEM权限。我们尝试与Fortinet沟通,共同解决这些问题,但对方在长达8个多月时间内没有回复我们,并且在没有通知任何人的情况下公布了一个比较糟糕的补丁。
注意:FortiClient
 
二、漏洞描述
我们滥用了FortiClient的命名管道(named pipes)来强制更新,可以触发漏洞扫描操作,然后强制FortiClient更新并不在目标主机上的软件。结合目录遍历漏洞和命令执行漏洞后,我们就可以获得NT AUTHORITY/SYSTEM权限。
 
三、漏洞分析
命名管道写入漏洞
我们可以使用ioninja监控forticlient在命名管道中的通信数据。在我的测试系统中,该命名管道为FC_{F18F86FD-7503-4564-80CF-B6B199519837}。
我们尝试在所有用户可用的UI中各种点击,很快就看到了一个有趣的数据包。程序使用这种方法来告诉调度程序(scheduler)执行按需扫描。这里比较奇怪的是我们可以在数据包中指定具体路径及命令行参数。
逆向分析该协议后,我伪造了一个数据包:

我发现包头的60 80为命令的魔术字节(magic byte),并且十六进制18(第9个字节)代表apptype。在PoC中,我们滥用的正是apptype,将其指定为0x18(代表FCVbltScan.exe)。
FCDBLog.exe这个进程会读取命名管道中的信息,然后更新HKLM\SOFTWARE\Fortinet\FortiClient\FA_Scheduler\000020注册表项。该进程只是简单读取相关信息,然后将其写入param键值中(如果我们修改apptype/第9个字节,我们就可以在FA_Scheduler中写入其他服务信息)。

如上图所示,我们可以写入-t 1 -p c:\users\lowpriv\Desktop\lasla\evil.tmp -u字符串,触发目标开始安装在evil.tmp中发现的所有漏洞补丁。
完成如上步骤后,scheduler.exe(系统权限)进程就会读取相关键值,以系统权限启动服务。
因此这里的问题是我们可以指定自定义的XML文件(如evil.tmp),程序会从其中读取当前系统存在的漏洞信息。
路径遍历漏洞
注意,这里之所以涉及到vcm2.exe,是因为该程序由FCVbltScan.exe所启动。
第二个问题在于程序对-p参数所指定的文件的解析过程。该文件内容与FortiClient漏洞扫描器的处理结果有关。FortiClient会读取这个json文件,根据每个Install元素中VID键的值来判断系统需要安装哪些补丁(我们构造的json文件如下图所示)。
通常情况下,这个VID值为20440或者其他相关值,这是一个整数值字段。然后vcm2.exe会查找扫描目录中以VID为名称的.json文件。
然而我们发现,我们可以在VID中实现路径遍历,将其指向我们能够控制的某个路径。这意味着我们可以提供漏洞安装文件的配置信息。
如下图所示,我们将该字段指向\users\IEUser\Desktop\lasla\vuln,而vcm2.exe现在会搜索该目录中的vuln.json文件,获取安装信息。

因此我们现在可以精确控制哪些补丁需要安装到当前系统中。
LUA补丁脚本中的命令注入漏洞
以上漏洞引导我们发现第3个,也是最后一个漏洞:LUA中的命令注入漏洞。
evil.tmp中的vulnjson实际上是安装文件的配置信息。我们对比了合法的文件,并做了相应修改。该文件用来指定哪些目标需要修补。
FortiClient的所有lua脚本都存放在名为flat-db.dat的一个文件中,这是一个SQLITE文件,因此数据库表中包含与脚本匹配的VID,用来指定待执行的脚本。
vcm2.exe的功能是从FortiClient目录的flat-db.dat中读取相关LUA脚本,然后执行与我们指定的VID匹配的脚本。
vuln.json文件内容如下:

然而这里我们可以将DetectedProducts字段中的某些参数传递给lua脚本。在DetectedProducts键中,我们指定了Product、Product Path以及Detected Version字段的值。我们使用LUA脚本来给Mozilla产品打上补丁,并且我们发现了如下几行代码:

如上所示,filepath = arg[2]这个参数会一路传递给GetLanguage函数。
GetLanguage函数如下所示:

在第50行我们看到脚本首先将我们提供的setupPath放入cmd参数中,然后在52行,脚本会直接执行相关命令,没有检查是我们是否使用了不被允许的字符。因此如果我们回头看vuln.json文件,可以看到我们的Product Path字段值为c:\tes"&calc&"tingfire\firefox.exe,这样就可以将calc命令注入os.capture中。
现在我们已经得到以system权限运行的calc,也可以将其替换为其他命令或者其他程序。

 
四、补丁说明
快速逆向分析补丁后,我发现厂商在product以及detected_version字段上做了assert处理。

[1] [2]  下一页

一、前言
我们在FortiClient中找到了3个漏洞,低权限用户可以组合利用这3个漏洞提升至NT AUTHORITY/SYSTEM权限。我们尝试与Fortinet沟通,共同解决这些问题,但对方在长达8个多月时间内没有回复我们,并且在没有通知任何人的情况下公布了一个比较糟糕的补丁。
注意:FortiClient
 
二、漏洞描述
我们滥用了FortiClient的命名管道(named pipes)来强制更新,可以触发漏洞扫描操作,然后强制FortiClient更新并不在目标主机上的软件。结合目录遍历漏洞和命令执行漏洞后,我们就可以获得NT AUTHORITY/SYSTEM权限。
 
三、漏洞分析
命名管道写入漏洞
我们可以使用ioninja监控forticlient在命名管道中的通信数据。在我的测试系统中,该命名管道为FC_{F18F86FD-7503-4564-80CF-B6B199519837}。
我们尝试在所有用户可用的UI中各种点击,很快就看到了一个有趣的数据包。程序使用这种方法来告诉调度程序(scheduler)执行按需扫描。这里比较奇怪的是我们可以在数据包中指定具体路径及命令行参数。
逆向分析该协议后,我伪造了一个数据包:

无奈人生安全网

我发现包头的60 80为命令的魔术字节(magic byte),并且十六进制18(第9个字节)代表apptype。在PoC中,我们滥用的正是apptype,将其指定为0x18(代表FCVbltScan.exe)。
FCDBLog.exe这个进程会读取命名管道中的信息,然后更新HKLM\SOFTWARE\Fortinet\FortiClient\FA_Scheduler\000020注册表项。该进程只是简单读取相关信息,然后将其写入param键值中(如果我们修改apptype/第9个字节,我们就可以在FA_Scheduler中写入其他服务信息)。

如上图所示,我们可以写入-t 1 -p c:\users\lowpriv\Desktop\lasla\evil.tmp -u字符串,触发目标开始安装在evil.tmp中发现的所有漏洞补丁。
完成如上步骤后,scheduler.exe(系统权限)进程就会读取相关键值,以系统权限启动服务。
因此这里的问题是我们可以指定自定义的XML文件(如evil.tmp),程序会从其中读取当前系统存在的漏洞信息。
路径遍历漏洞
注意,这里之所以涉及到vcm2.exe,是因为该程序由FCVbltScan.exe所启动。
第二个问题在于程序对-p参数所指定的文件的解析过程。该文件内容与FortiClient漏洞扫描器的处理结果有关。FortiClient会读取这个json文件,根据每个Install元素中VID键的值来判断系统需要安装哪些补丁(我们构造的json文件如下图所示)。

无奈人生安全网


通常情况下,这个VID值为20440或者其他相关值,这是一个整数值字段。然后vcm2.exe会查找扫描目录中以VID为名称的.json文件。
然而我们发现,我们可以在VID中实现路径遍历,将其指向我们能够控制的某个路径。这意味着我们可以提供漏洞安装文件的配置信息。
如下图所示,我们将该字段指向\users\IEUser\Desktop\lasla\vuln,而vcm2.exe现在会搜索该目录中的vuln.json文件,获取安装信息。

因此我们现在可以精确控制哪些补丁需要安装到当前系统中。
LUA补丁脚本中的命令注入漏洞
以上漏洞引导我们发现第3个,也是最后一个漏洞:LUA中的命令注入漏洞。
evil.tmp中的vulnjson实际上是安装文件的配置信息。我们对比了合法的文件,并做了相应修改。该文件用来指定哪些目标需要修补。
FortiClient的所有lua脚本都存放在名为flat-db.dat的一个文件中,这是一个SQLITE文件,因此数据库表中包含与脚本匹配的VID,用来指定待执行的脚本。
vcm2.exe的功能是从FortiClient目录的flat-db.dat中读取相关LUA脚本,然后执行与我们指定的VID匹配的脚本。 www.wnhack.com
vuln.json文件内容如下:

然而这里我们可以将DetectedProducts字段中的某些参数传递给lua脚本。在DetectedProducts键中,我们指定了Product、Product Path以及Detected Version字段的值。我们使用LUA脚本来给Mozilla产品打上补丁,并且我们发现了如下几行代码:

如上所示,filepath = arg[2]这个参数会一路传递给GetLanguage函数。
GetLanguage函数如下所示:

在第50行我们看到脚本首先将我们提供的setupPath放入cmd参数中,然后在52行,脚本会直接执行相关命令,没有检查是我们是否使用了不被允许的字符。因此如果我们回头看vuln.json文件,可以看到我们的Product Path字段值为c:\tes"&calc&"tingfire\firefox.exe,这样就可以将calc命令注入os.capture中。
内容来自无奈安全网

现在我们已经得到以system权限运行的calc,也可以将其替换为其他命令或者其他程序。

 
四、补丁说明
快速逆向分析补丁后,我发现厂商在product以及detected_version字段上做了assert处理。
本文来自无奈人生安全网

[1] [2]  下一页 www.wnhack.com

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