前言
资安业者Fortinet在2022年2月至3月,观察到僵尸网路Beastmode(亦称B3astmode)在一个月内,锁定了数个CVSS风险层级达到9.8分的重大漏洞,且其中的CVE-2022-26210、CVE-2022-26186,以及CVE-2022-25075至CVE-2022-25084,与多款Totolink路由器有关。其中就包含CVE-2022-25084远程命令注入漏洞。目前根据fofa网络空间测绘中进行检索,发现仍有13w余台totolink相关设备存在于公网当中。
最近在学习IOT方向的各类知识,将自己的理解分享给大家,希望能给大家带来帮助,下面来详细讲解一下该漏洞如何造成远程命令注入的。
环境搭建
本次环境使用kali,qemu进行固件模拟,该模拟效果可能因缺少硬件与实体路由器存在差异。
下载路由器固件
wget https://www.totolink.net/data/upload/20190823/7709dc2d95f5da71d8af89f5921f5ffb.zip --no-check-certificate
qemu安装
binwalk (kali已集成)
apt install qemu-user
apt install qemu-user-static
apt install qemu-system
安装网桥工具
apt install bridge-utils uml-utilities
使用binwalk分解固件
binwalk -Me TOTOLINK_C818NR_T6_IP04338_8197FN_SPI_16M128M_V5.9c.4085_B20190428_ALL.web --run-as=root
查看分解出来的固件
查看架构
file busybox
32位LSB mips,所以使用qemu-system-mipsel
下载镜像和虚拟磁盘
wget https://people.debian.org/~aurel32/qemu/mipsel/debian_wheezy_mipsel_standard.qcow2 && wget https://people.debian.org/~aurel32/qemu/mipsel/vmlinux-3.2.0-4-4kc-malta
配置网络
brctl addbr virbr2 # 创建网桥
ifconfig virbr2 192.168.6.1/24 up # 配置网桥IP
tunctl -t tap2 # 添加虚拟网卡tap2
ifconfig tap2 192.168.6.11/24 up # 配置虚拟网卡IP
brctl addif virbr2 tap2 # 配置虚拟网卡与网桥连接
进入到squashfs-root目录下,创建路由器web服务所需的pidmkdir ./var/run && touch ./var/run/lighttpd.pid
启动虚拟机
qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1" -netdev tap,id=tapnet,ifname=tap2,script=no -device rtl8139,netdev=tapnet -nographic
这时启动的是一个阉割版的debian系统,默认密码是root/root
然后配置网络,并上传路由器系统的软件包,可以通过wget下载或scp命令进行上传
ifconfig eth0 192.168.6.15 up # 配置路由器IP
scp -r squashfs-root/ root@192.168.6.15:/root/ # 拷贝路由器文件到虚拟机
挂载路由器系统并启动web服务
chroot ./squashfs-root/ /bin/sh # 挂载路由器系统
./bin/lighttpd -f ./lighttp/lighttpd.conf -m ./lighttp/lib # 启动路由器服务
验证是否启动成功
漏洞分析
找到需要分析的文件目录squashfs-root
使用IDA分析cgi文件downloadFlile.cgi
文件
注意下面system执行命令
v14 = (const char *)getenv("QUERY_STRING");
memset(v24, 0, sizeof(v24));
memset(v25, 0, sizeof(v25));
sprintf(v24, "echo QUERY_STRING:%s >/tmp/download", v14);
system(v24);
这里使用getenv
从请求URL中获取参数,传递给V14,再通过sprintf赋值给V24,使用system函数进行命令执行。
通过构造请求包控制QUERY_STRING
参数执行恶意得命令。
这里为什么加``,因为根据Linux的特性,echo `id`,这样才能执行。
漏洞复现
总结
CGI程序大部分的命令注入漏洞都是因为使用了一些危险函数,且利用Linux的特性,因此才产生的漏洞。看在我写这么辛苦的份上,要个点赞和转发不过分吧。