ubuntu php 无法执行exec_LibreNMS v1.46 远程代码执行 (CVE201820434)

更多全球网络安全资讯尽在邑安全

www.eansec.com

06a72571efa3d662093c2c9034c60c69.png

一、LibreNMS简介

LibreNMS是基于PHP/MySQL/SNMP的开源网络监控工具,它可自动发现网络中的思科设备和Linux等系统,使用通用SNMP协议来监控其它系统。

二、漏洞介绍

该漏洞可以通过以下方式来触发:在添加新的设备时,在community(snmp配置时的一个字段)参数中添加任意命令的方式。随后该设备会向“addhost.inc.php”页面发送发送未经过滤的请求。然后调用capture.inc.php中的popen函数并执行参数,该函数的参数是你添加的任意命令。(可以通过向ajax_output.php发送请求进而调用capture.inc.php,参数为[file_name].inc.php)。

三、分析过程

我们首先分析LibreNMS,我的目标是在该项目中找到RCE(远程代码执行),我下载了项目源代码,第一步是通过python脚本搜索一些不安全的函数,例如system, exec, shell, exec, popen等,这些函数可能导致命令执行。

对执行脚本后的结果进行深入分析和挖掘,我在该文件(html/includes/output/capture.inc.php)第67行找到了一些有趣的代码,如下图所示:

be29927d11f5d07c1a274ca73010bce6.png

我们可以看到,该脚本使用popen函数执行$cmd中存储的命令并返回了命令执行后的结果。我们向上面继续寻找,会发现$cmd变量的赋值被包含在一个switch语句(脚本36行)中,如下图所示,可以分析出当$type(在脚本34行声明)的值等于snmpwalk时,调用gen_snmpwalk_cmd函数(脚本44行)。

 175f47027530f8eae53082a0e06471c9.png

显然,capture.inc.php文件对于用户传递的snmp协议请求做了处理。但现在我们把关注点放在gen_snmpwalk_cmd函数的调用上,调用后的结果会存储在$cmd变量中,然后作为参数传递给popen函数(capture.inc.php文件67行),该函数执行如下图所示的操作:

 ece27c8fffb80a89821c9d435afcc9d5.png

理论上讲,我们可以通过控制gen_snmp_cmd函数的返回值,并传递给popen,便可以获得想要的命令执行。我们接着进行分析,会发现该函数调用了snmp_gen_auth函数,snmp_gen_auth函数的实现在snmp.inc.php文件的768行,如下图所示:

 f64db65341af99dbfbd72c5abd7c2457.png

通过分析,我发现当调用gen_snmpwalk_cmd函数时,参数是设备ID,最终会调用snmp_gen_auth函数,该函数会获取传入设备ID相关的所有设备信息并存储到$cmd变量。我想我们可以通过控制snmp中的“community”字段,进而控制执行的命令。

如上图所示,在脚本的803行,我们可以模仿这种形式把我们的命令传入($(our_command))。

接下来,我们需要找到一个允许我们控制设备信息的入口,即“SNMP community”(snmp中的一个字段,用来鉴别在管理站点和一个包含SNMP信息的代理的路由器之间的信息发送。并将被发送到在管理器和代理之间的每个数据包)。我开始在LibreNMS中添加新的主机,并观察到每当我添加一个新的设备,其配置都会被保存。然后我可以通过snmp_gen_auth函数获取信息。

接下来,使用Karma(为开发人员提供高效的测试环境)发送一个未经过滤的POST请求,并包含我们修改后的community string,如下所示:请看html/pages/addhost.inc.php line文件的第52行:

d39668ed9c1043684ce34425c21b8a32.png

在第52行中,脚本检查输入的snmp版本是否为v1或v2c,第53行检测$_POST[‘community’]是否在POST请求中。第54行显示,如果$_POST[‘community’]存在,则传递给应用程序并添加到snmp的配置中。所以我们可以通过控制community字段进而注入任意命令。

因此,我们可以通过执行以下操作来获取RCE:

1.添加新设备,并修改community string字段,注入任意命令。==> 可以通过向addhost.inc.php发送请求来实现。

2.发送一个请求,触发popen函数。该函数会执行参数中的命令,这个参数通过其它函数获得,并会把community string传入其中。==> 可以通过向capture.inc.php发送请求来实现命令触发。

如下图所示,我们添加新设备,向addhost页面发送请求,该请求将由addhost.inc.php文件进行处理,可以看到如下内容:

 a2fa227d8cd537a6a2c71c5c6528ed39.png

然后触发popen函数,我们需要向ajax_output.php发送请求,ajax_output.php位于html/ajax_output.php下。如下图所示,该请求会调用capture.inc.php:

deb55ea3cfdb402536954712d14f1f94.png

如果$_request [‘id’]被捕获,将调用capture.inc.php(第35行)并从Web界面发送请求。通过http://server/device/device=2/tab=capture/ ==> snmp ==> run链接,我们可以看到对应内容,如下图所示:

 5e542cfa34c113da95526238337c9d60.png

可以看到,请求返回200 OK。这表示我们分析的函数被成功调用,并且我们找到了修改后的community string:“test string”。我们可以成功获取RCE。

您也可以通过github获取完整的漏洞利用代码。

最终演示结果如下图:

 f9dc3144ee2e3f6e4c47817347657137.png

原文链接:https://shells.systems/librenms-v1-46-remote-code-execution-cve-2018-20434

欢迎收藏并分享朋友圈,让五邑人网络更安全

e6f232f69b1657e0b9092c2ec69b3baf.png

欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!

推荐文章

1

Django入门之旅-启程

2

重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值