漏洞简介
环境搭建
binwalk -Me TOTOLINK_C834FR-1C_NR1800X_IP04469_MT7621A_SPI_16M256M_V9.1.0u.6279_B20210910_ALL.web
查看文件相关信息,mips架构,小端序,使用mipsel来进行模拟。readelf -h ./bin/busybox
固件模拟
cp $(which qemu-mipsel-static) .
sudo chroot . ./qemu-mipsel-static ./usr/sbin/lighttpd
会报错,显示No configuration available. Try using -f option.
,这个报错是需要-f指定已有的配置文件。
sudo chroot . ./qemu-mipsel-static ./usr/sbin/lighttpd -f ./lighttp/lighttpd.conf
即可,接着又会报错,说缺少一个文件,创建在对应目录创建一个即可。cd ./var
mkdir run
cd run
touch touch lighttpd.pid
然后运行,可以看到服务启动成功。
但是这个路由器登录是需要密码的,并且由于是模拟的关系,大部分功能无法正常使用,登录不进去,但是还好经过搜索,发现看雪上有一篇文章讲述了如何进行绕过登录,登录过后,能观察到里面的一些设置,通过bp抓包能分析出一些有效的请求头内容,其数据传输通过json实现。
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
#set network
sudo brctl addbr virbr0
sudo ifconfig virbr0 192.168.5.1/24 up
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.5.11/24 up
sudo brctl addif virbr0 tap0qemu-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=tap0,script=no -device rtl8139,netdev=tapnet -nographic
sudo ./test.sh
执行。在启动的虚拟机里面添加一个IP,是在上面图片中的qemu虚拟机中执行命令。
ifconfig eth0 192.168.5.12 up
scp -r squashfs-root/ [email protected]:/root/
chroot ./squashfs-root/ /bin/sh./usr/sbin/lighttpd -f ./lighttp/lighttpd.conf
界面这些和user模式都是差不多一样的。
漏洞分析
登录验证绕过
然后中间会有段比较password和http_passwd的代码,其会修改v18的值。
v17 = strcmp(v6, v30); // username http_username
if ( !strcmp(v35, v32) ) // passwd http_passwd
v18 = v17 != 0;
else
v18 = 1;
这里不知道是否是因为模拟环境的原因,无论使用什么密码都无法正常登陆,但是这里的v18,需要注意下,这是第二个包的参数之一,而且这个值在最后会为0。
接下来我们看第二个包,可以看到和我们前面分析的一样,get访问了这个url。
接着向下看。
http://xxx.xxx.xxx.xxx/formLoginAuth.htm?authCode=1&userName=admin&goURL=home.html&action=login
http://xxx.xxx.xxx.xxx/formLoginAuth.htm?authCode=1&userName=admin&goURL=&action=login
goURL可有可无,因为goURL无值时,自动会strcpy “home.html”,效果如下。
第一个是 /cgi-bin/cstecgi.cgi 中的 OpModeCfg 函数的命令注入漏洞,其漏洞原因是传入的hostName参数,可执行到doSystem函数,通过简单的构造即可导致命令执行。但是想要执行到doSystem函数,需要绕过一些判断语句,proto不能为0,3,4,6,hostName不能为空。
这个命令注入不需要绕过什么东西,代码位置比较靠前。
攻击测试
先尝试bp发一下包,可以看到攻击成功,并且带有回显
编写个poc进行攻击,先进行登录绕过获取cookie,然后进行攻击,攻击效果如下
对于另一个命令注入攻击方式也差不多,只是没有回显,简单修改下poc,在tmp目录创建一个hack文件,攻击效果如下
参考
环境搭建usr模式和system模式,并绕过登录检测:https://bbs.pediy.com/thread-271765.htm#msg_header_h2_1
作者名片
END