[一炮双响]第一次实战漏洞挖掘(路由器版)
前言
路由器的洞大部分都是栈溢出,如果想要了解一些相关的知识,可以去看我的pwn和二进制安全虚拟机Protostar靶场系列文章,传送门
什么是缓冲区溢出
在程序运行时,系统会为程序在内存里生成一个固定空间,如果超过了这个空间,就会造成缓冲区溢出,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,甚至可以取得系统特权,进而进行各种非法操作。
工具使用
kali
第一步从路由器官网提取更新固件,放进kali中,用binwalk工具对固件内容进行提取,一般都是.bin文件,大部分的老版本固件都可以提取,新版本涉及到更高的加密,好像是不能完全提取,也可能是我binwalk版本不够
提取命令
binwalk -Me xxxx.bin --run-as=root

提取出来以后,有一个squashfs-root文件夹,类似于Linux系统的根目录,我这里多了几个qemu开头的文件,是因为我进行了虚拟环境测试漏洞存在而产生的,后续会讲到

我们进入此目录后,需要分析的文件在bin目录下的httpd,这是路由器运行的主要文件

使用file指令查看了httpd文件的格式,是32位ELF文件,MIPS架构
qemu虚拟环境
apt安装qemu
apt install qemu
apt install qemu-user-static
sudo apt install qemu-system
使用qemu模拟启动httpd
qemu-mipsel-static -L . ./bin/httpd

启动后就是这样,因为是虚拟环境,有些需要的工具或者文件丢失,不过不影响运行和后续测试
当然还要配置虚拟网桥,可以传送到我的路由器准备工作一文
上面的qemu安装指令,或许有些差异,因为当时我安装qemu时出现过一些问题,经过问询gpt才得以解决,但是过了半个月,具体的安装步骤也记不清了,大家如果安装出现问题,也多问问AI,确实很方便
IDA静态分析文件
确定了文件的格式,直接使用工具IDA Pro进行反编译,开始分析源码逐个寻找漏洞

根据前期的学习,对栈溢出漏洞已经很熟悉了,大部分的栈溢出漏洞都来源于这些函数:
- strcpy、strcat、sprintf 等字符串处理函数,特别是在没有检查缓冲区大小时。
- scanf、sscanf、fgets 等输入输出函数,特别是处理字符串时没有设置最大读取长度。
- gets 和 fgets,gets 是已废弃的最典型的栈溢出来源。
- memcpy、memmove 等内存操作函数,在复制或移动数据时没有对目标缓冲区的大小进行检查。
- alloca,用于栈上动态分配内存时,如果分配的内存过大,可能导致栈溢出。
所以直接ctrl+F进行函数搜索,加快进度,不然几百上千个函数,能给我眼睛看瞎:-(
根据网上的很多博客内容知道了Tenda路由器主要的漏洞就出现在strcpy、sscanf、sprintf函数上,于是我就开门见山先上strcpy函数,还是逐个看,但是已经少了很多工作量

nia,这就是案发现场👇

只能说不枉平日里打比赛的训练,敏锐的观察告诉我,这里就是有漏洞,不找不知道,一找就是俩!


简单给大家解释一下这两个漏洞的原理:
strcpy函数是stringcopy的缩写,顾名思义就是字符串复制,这个函数本身存在的漏洞就是,在进行内容复制,将一个变量里的字符串复制到另一个变量时,不会检查空间大小,当从一个大的变量复制所有内容到小变量时,小变量无法承载所有内容,发生溢出,就会到达缓冲区,这就是所谓的缓冲区溢出,缓冲区是计算机内存中的一块区域,用于临时存储数据,这也是计算机特性,无法避免。
(换个大家都能听懂的说法就是,一瓶1L的水装满了,现在要机器人执行命令把他完全倒入另一个只有500mL容量的瓶里,因为机器人不会判断,只会接受指令,就好比这里的strcpy函数,指令执行了,500mL装满,剩下的溢出)当然这个形容也不是完全恰当,只是关键点就那个意思。

那么了解了这个地方的漏洞点,我们就写POC来尝试验证漏洞是否存在。
继续跟进看见这个函数的利用函数是openSchedwifi函数,一级目录名是goform。

POC
import requests
url = "http://192.168.1.100/goform/openSchedWifi"
data = {
"schedStartTime":b'A'*1000
"schedEndTime":b'A'*1000
}
requests.post(url=url,data=data)
执行POC脚本后,出现Segmentation fault,段错误退出当前程序,说明漏洞利用成功,因为传入了大量数据导致缓冲区溢出,程序返回异常退出!

那么这一次漏洞挖掘到这里就算完了,接下来就是提交CVE官网,等候回复,果然功夫不负有心人,成功收到两个CVE编号。


更多关于该漏洞的内容可以查看我的github。
Over!