【技术分享】Linux下的McAfee安全扫描软件存在多个漏洞

阅读量180271

|

发布时间 : 2016-12-14 10:44:05

x
译文声明

本文是翻译文章,文章来源:nation.state.actor

原文地址:http://nation.state.actor/mcafee.html#vuln7

译文仅供参考,具体内容表达以及含义原文为准。

t0111e89ae96b9383ef.png

翻译:ResoLutiOn

预估稿费:260RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

事件综述

近期,有网络安全人员发现:Linux系统下的安全扫描软件McAfee中存在多个安全漏洞【软件传送门:McAfee for Linux】,黑客可利用其中一些漏洞盗用Linux系统的root权限,发动RCE攻击。


关于McAfee软件的情况介绍

McAfee VirusScan Enterprise for Linux,一款利用Linux独特访问扫描程序,对系统进行实时防护的安全检测软件,由Intel旗下的子公司McAfee推出。该软件适用于使用Linux系统的企业用户。它能够检测隐藏在存档文件中的Linux病毒并予以阻止;阻止Microsoft Windows恶意软件,防止其通过Linux环境传播;同时还能借助来自McAfee Labs的自动安全更新,确保始终提供最新的Linux病毒防护。由此可见,McAfee VirusScan Enterprise for Linux的功能可谓十分强大。

起初,在很多安全专家看来,这款安全防护软件似乎是“尽善尽美”,它近乎拥有了漏洞研究人员所期待的所有优点,例如:它能够利用系统root权限,这便能够保证用户PC的安全;但在最近一段时间里,McAfee似乎有点淡出人们视野的味道,原因在于在很长一段时间里,McAfee公司已没有对其进行更新了。当发现这些情况时,我决定要细致地了解有关该软件的具体情况。


受到漏洞影响的McAfee版本

安全研究人员证实:从McAfee 1.9.2版本(于2015年2月19日发布)到2.0.2版本(于2016年4月22日发布),都存在多个相同的安全漏洞。它们之间唯一的差别便是:在漏洞利用方面,新版本要比旧版本更容易实施,也即是说:近期的McAfee软件的安全性下降了很多,更容易遭到黑客利用。


漏洞报告时间轴

1.2016年6月23日:安全人员将漏洞的相关情况向McAfee公司的安全应急响应中心(CERT)做了汇报;McAfee公司定于2016年8月23日向公众披露漏洞的具体细节。

2.2016年7月19日:McAfee公司发表声明称: 鉴于关于漏洞的细节仍在不断更新中,他们决定将发布公告的时间延期至9月,最晚可至12月;

3.2016年9月-11月期间:安全人员未与McAfee公司取得联系;

4.2016年12月5日:McAfee公司发布消息称:公司将于12月12日发布关于McAfee软件漏洞的完整报告;

5.2016年12月9日:McAfee公司发表安全公告,定义了漏洞的数字ID;

6.2016年12月12日:完整的McAfee漏洞报告披露。


McAfee软件系统结构

在深入探究McAfee软件漏洞的具体情况之前,我认为有必要先了解有关的软件结构,磨刀不误砍柴工,这将会对之后的漏洞研究有着一定的帮助。

(1)软件所提供的服务:

McAfee VirusScan Enterprise for Linux可向用户提供两种单独的服务:一是用户能够以系统root权限运行该软件;二是还可以一种名为“nails”的非特权用户的身份运行该软件。具体说来,用户可用root权限使用该软件的主要扫描功能,它能够侦听一个本地的Unix网络套接字包(/var/opt/NAI/LinuxShield/dev/nails_monitor)。而网络服务器则可以用nails用户身份来运行,它能够侦听端口0.0.0:55443发出的数据包。

(2)实现进程间的通信

在该软件的架构中,网络服务器是设置在扫描服务上的一个用户交互界面。当用户向网络服务器提交了一个请求时,该请求会被重新格式化,以另一种形式发送给root扫描程序;系统将会在一个HTML界面中显示该用户提交的请求及其相关信息。由于在交互过程中,web服务器不会对用户传递的数据做出太多的限制,这便给黑客利用该漏洞,向系统注入恶意代码提供了可趁之机。

10个具体的McAfee漏洞:

接下来,我将为大家具体介绍10个McAfee VirusScan Enterprise for Linux软件中存在的漏洞。

No.1  CVE-2016-8016:未经验证的远程文件存在性校验漏洞

http://p4.qhimg.com/t01b6818492d28fc4f6.png

当我们在浏览网页的编译代码时,即会发现该html文件的存放路径是由tpIt参数来决定。在上图中,该tpIt参数是放置在tasks.html文件中。而运行在web服务器上的Linux Strace工具会显示:可打开/opt/NAI/LinuxShield/apache/htdocs/0409/tasks.html文件,如下所示:

http://p4.qhimg.com/t01c6ad4f32fa42bc65.png

在编译时,如果将tpIt参数放置在地址为..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd(该字符串经过URL加密处理)的不同的页面中,那么编译过程就会出错,系统会返回一个格式错误的页面,并附有错误返回值14。而JavaScript语言中的lookupErrorCode功能函数会根据错误返回值14,向用户发送“web模块使用错误”的提示语句。若将tpIt参数放置在一个不存在的系统路径中,那么错误返回值将变为10,错误提示语句为“系统无法打开该文件”。如下图所示:

http://p3.qhimg.com/t01be454ec16abc5f66.png

http://p0.qhimg.com/t0190383181dcc35ce1.png

若系统中有类似的,已被命名的文件存在,那么系统会向未经授权的用户提示这两种错误编译消息。

那么问题来了,有效的网页编译文件(例如:tasks.html)和无效网页编译文件(例如:..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd)之间的区别是什么呢?

我将会继续深入探究这一问题。

No.2  CVE-2016-8017:非法读取未经授权的远程文件(含有约束条件)

经过查看web服务器所使用的不同类型文件,我发现在有效编译文件的任何两个语句之间要么含有__REPLACE_THIS__字符串,要么含有【% %】标识符。

如果攻击者能够将以上的语句添加到系统的任何一个文件中(其中包括系统日志文件),那么他便可以通过web服务器进行远程读取文件。对于该漏洞的防护措施之一便是,对用户的身份进行严格限制:只允许具有nails身份的用户读取系统中的文件。

No.3  CVE-2016-8018:软件中不含CSRF(跨站请求伪造)令牌验证机制

由于在软件的网页交互界面中,不含有防止CSRF攻击的令牌认证功能,这便使得黑客在通过了系统的身份验证后,可以随意地向系统提交认证请求,发动CSRF攻击。现在,看到一个安全软件竟然存在这样一个高危漏洞,令我着实感到很惊讶。利用CSRF令牌保护缺失而发动攻击,这只是黑客实施远程攻击的手段之一。

No.4  CVE-2016-8019:跨站脚本攻击

当将tpIt参数设置为指向NailsConfig.html文件或Monitor.html文件时,info:7和info:5这两个参数值将会替换用户的不可信输入,并将结果返回给JavaScript的formatData函数。info:7代表的是一个执行语句的清单,其中可能包含:single,show,serverUtcOffset=-25200等语句值。之后,系统会将其放入一个由单引号引导的字符串语句中,传递给formatData函数。若info:7被用来指向形如single’.prototype.constructor=eval('alert(“xss”)’)的语句时,eval函数将在formatData函数被调用之前,便会按照函数的功能,计算字符串中恶意代码的值。

http://p1.qhimg.com/t010e3bbb88be01f5f1.png

之后,经过修改数据包中的信息,系统会向用户发出一条关于XSS攻击的消息,如下所示:

http://p4.qhimg.com/t01ceefc29cf0145a0d.png

No.5 CVE-2016-8020:远程代码执行及提权漏洞

在进行扫描系统之前,用户需要填写一个4页的表格:

http://p4.qhimg.com/t01111882d769925ea2.png

在表格提交之后,系统会向web服务器提交一个请求。下图展示的是整个过程中使用到的部分参数:

http://p5.qhimg.com/t016d3b07ca0171aae8.png

nailsd.profile.ODS_9.scannerPath变量所包含的文件路径,也即是系统进行扫描操作的执行路径。若将路径修改为:/bin/sh,则在网页界面中会出现以下的错误结果:

http://p5.qhimg.com/t01f9cb308e4c65ae89.png

Strace工具将会给出信息,表明系统会通过一个以root权限运行的进程,将该参数传递给一个execve文件(可执行文件)。

http://p8.qhimg.com/t01e281e4ff5c30ec30.png

No.6  CVE-2016-8021:利用web界面,可向已知地址写入任意文件

用户可通过web界面指定使用一台网络服务器,并从该服务器上获取有关的更新信息。自从我决定要找到一种能够帮助用户远程向系统内写入文件的方法之后,我便意识到前面提到的那个特点会对我有所帮助。

为了查明更新服务器是如何运作的,我先是备份了本地的资源库,之后从我的服务器上下载了新的资源库,重新配置新的服务器。以此来探究服务器的运作过程。

http://p1.qhimg.com/t0168dc4a0364dbee40.png

系统日志文件记录了更新进程所完成的操作,包括:下载一个更新程序包、验证其完成性、解压以及安装等。

http://p4.qhimg.com/t01b38912f1a25ec3a7.png

生成一个shell脚本其实很简单,但这需要花费一定的时间来进行下载,而且必须在一个网络数据包开始发送之前就要完成。这里有一个替代的方法,即为创建一个带有需求数据包的脚本程序,并在其中加入描述信息,就能够实现与shell脚本相同的功能。

结合CVE-2016-8020(漏洞5)和CVE-2016-8021(漏洞6),我们就能够实现提升用户的系统权限(从nails变为root)。使用CSRF或XSS攻击方式,我们便可以实现远程提权。

No.7  CVE-2016-8022:远程利用身份验证令牌

在一次尝试利用一个XSS漏洞和CSRF漏洞的过程中,我将一个简易的cookie工具和从一名授权用户的系统中“拿到”的cookie融合在一起,作为测试工具来使用。但当我准备试着利用我的PC发起“攻击”时,发现我的身份验证失败了:

http://p4.qhimg.com/t01353caee65b61e645.png

我还尝试着写出了一个脚本程序,它能够重设在数据通信过程中的阻断和拦截程序。

接下来的两张图能够告诉我们有效请求和无效请求之间的区别:

有效请求:

http://p6.qhimg.com/t0194b60c72b25c3900.png

无效请求

http://p2.qhimg.com/t01adff403a77e73f5f.png

这看起来似乎有点奇怪:当用户向服务器提交了一个系统已授权的请求时,web服务器就会发送该台PC的IP地址(cookie除外)。虽然这种方式有点不寻常,但能够保证通信的安全。

No.8  CVE-2016-8023:暴力破解身份验证令牌

鉴于之前逻辑解析测试的失败,我更想要探究其他的cookie是如何进行逻辑确认测试的。

下面给出的是nailsSessionId cookie的取值情况。它们是在用户进行登录和注销操作的过程中产生的,仅限于nails身份用户。

http://p8.qhimg.com/t01014cee2a851ad212.png

而在常规的登录过程中,似乎仅有两部分的cookie的情况发生了改变。Cookie的格式为:

http://p6.qhimg.com/t015d07913ba112a901.png

相关变量的参数为:

http://p8.qhimg.com/t012f5b1a305c4f62dc.png

No.9  CVE-2016-8024HTTP响应拆分攻击

用户可通过点击“系统事件”界面上的导出按钮,以此来导出记录系统日志数据的CSV文件。

http://p4.qhimg.com/t01e39de8568732418e.png

当用户发送请求之后,参数info的值会被置为%3A0。一般情况下,该参数的值为multi%2Capplication%2Fvnd.ms-excel。之后,服务器会给系统发送一个名为Content-Type: application/vnd.ms-excel的标头文件(Header)作为响应。攻击者可通过简单地url加密处理标头文件的方式,创建一个藏有恶意标头文件的链接。

http://p8.qhimg.com/t01be474d130ec18236.png

http://p1.qhimg.com/t01e2c000e724ed11f0.png

No.10  CVE-2016-8025:验证性SQL注入攻击

我在实验中所使用的数据库是SQLite轻型数据库,用来保存相关的设置数据和扫描数据。经过观察我发现,该数据库的安全性较弱,黑客可在该数据库的每一个接口处实施SQL代码注入攻击。这款数据库能够将URL参数转换为SQLite命令语句。使用我在第九号漏洞介绍中提到的CSV导出方法,我们可通过点击一个URL的方式,丢弃CSV文件中的sqlite_master标签。而SQLite中的查询函数select * from sqlite_master;则是被嵌入到了一个URL中。(URL:localhost:55443/0409/nails?pg=proxy&tplt=-&addr=127.0.0.1%3A65443&mon%3A0=db+select+_show%3D%24*++_output%3Dcsv+_table%3Dsqlite_master+&info%3A0=multi%2Capplication%2Fvnd.ms-excel.

http://p9.qhimg.com/t01646c5540fe129251.png

该数据库不用于身份验证,而是用于追踪被扫描过的文件以及系统事件日志。在了解了系统相关的漏洞情况之后,攻击者便可以通过SQL注入攻击来修改系统事件日志,以清除他们在系统中留下的文件追踪记录。

该数据库的模型如下所示:

http://p7.qhimg.com/t01549d19a468ce62f2.png

http://p3.qhimg.com/t0197c0bd46d15c9440.png

http://p3.qhimg.com/t019a8a9d194e600a9b.png


总结

黑客若将以上所有漏洞均加以利用,便能在Linux系统中以root权限执行RCE攻击,具体如下:

1. 利用CVE-2016-8022(漏洞7)和CVE-2016-8023(漏洞8),可暴力破解身份验证令牌。

2. 可运行被恶意代码感染的更新服务器。

3. 利用CVE-2016-8022(漏洞7),可向服务器发送带有验证令牌的请求,要求服务器自动更新数据。

4. 利用CVE-2016-8021(漏洞6),可迫使目标PC自动创建恶意脚本。

5. 利用CVE-2016-8020(漏洞5)和CVE-2016-8021(漏洞6),可采用发送带有验证令牌的不正确请求的方式来发动攻击,以代替原先执行恶意脚本的攻击方式。

6. 在受到感染的PC上,获得root权限的攻击者可直接运行恶意脚本。

更多细节以及代码描述请阅读原文:原文传送门

本文翻译自nation.state.actor 原文链接。如若转载请注明出处。
分享到:微信
+11赞
收藏
ResoLuT1On
分享到:微信

发表评论

内容需知
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 三六零数字安全科技集团有限公司 安全客 All Rights Reserved 京ICP备08010314号-66