前言
路由器的洞大部分都是栈溢出,如果想要了解一些相关的知识,可以去看我的pwn和二进制安全虚拟机Protostar靶场系列文章,传送门:
https://blog.csdn.net/qq_45894840/category_12002228.html?spm=1001.2014.3001.5482
ghidra安装
Ghidra是一个由美国国家安全局(NSA)开发并公开发布的软件逆向工程(SRE)工具套件。它是一个完全开源的项目,旨在提供一个全面的工具集合,用于执行对编译代码(如二进制文件和执行文件)的逆向工程任务。Ghidra的发布旨在帮助安全研究人员分析恶意代码和漏洞,以及提高软件的安全性
https://github.com/NationalSecurityAgency/ghidra
apt install openjdk-17-jdk #java环境安装
提取路由器固件
下载路由器官网更新的固件后,可以用binwalk工具对固件进行提取
解压文件夹后,可以看到一个.bin文件,这个就是路由器的固件
现在可以用binwalk提取路由器固件里的文件
binwalk -eM 路由器固件.bin
进入目录后,查看文件夹,会发现会有一个类似linux目录的文件夹
wwwroot_ro目录下是路由器网站的源代码
需要分析的固件在bin目录下,bin/httpd这个程序就是路由器主要运行的固件
使用ghidra对固件进行静态分析
ghidra的简单使用的文章
https://blog.csdn.net/qq_45894840/article/details/124556441
将httpd程序导入ghidra
双击程序进行分析
等右下角没有进度条了就说明Ghidra分析完成了
什么是缓冲区溢出
在程序运行时,系统会为程序在内存里生成一个固定空间,如果超过了这个空间,就会造成缓冲区溢出,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,甚至可以取得系统特权,进而进行各种非法操作。
strcpy
strcpy这个函数比较危险,因为它是直接把一个变量里的内容复制到另一个变量里的,它不会检查字符串的长度,很容易发生缓冲区溢出
按住ctrl+shift+e,呼出搜索界面,搜索strcpy函数
注意要勾选上图中的选项和点击搜索全部
这些就是程序调用了strcpy的地方,点击就能看到对应函数伪代码
把这些搜索到的调用strcpy函数的地方一个一个看,很容易发现栈溢出漏洞
这次演示的漏洞点在setSchedWifi函数中,找到setSchedWifi函数,点击它,查看源代码
在setSchedWifi函数中,__src变量会将用户交互的schedStartTime字符串后面的值作为字符串存入
之后程序会用strcpy函数将__src变量里的值传入__ptr+2指针指向的地址处
由于__src并未设置缓冲区,而strcpy函数不会检查字符串的长度,传入过长的字符串会造成缓冲区溢出,使程序崩溃退出
交叉定位,全局搜索调用setSchedWifi函数的地方,找到调用setSchedWifi函数的接口
在formDefineTendDa这个函数下面找到了setSchedWifi函数的路由
ctrl+f快速定位setSchedWifi函数
调用setSchedWifi函数的接口是openSchedWifi
payload:
import requests
url = "http://ip/goform/openSchedWifi"
data = {
"schedStartTime":b'A'*1000
}
requests.post(url=url,data=data)
system
system这个函数会执行指定的命令,如果程序将我们的输入传入了这个函数里,那么有可能会造成rce
ctrl+shift+e搜索system
绕过
||id
|id
如果要输入空格,可以用以下命令代替空格:
${IFS}
路由器环境安装
什么是qemu
QEMU是一种流行的开源机器模拟与虚拟化软件。它的全称是Quick Emulator,意即“快速模拟器”。QEMU允许用户模拟完整的计算机系统,包括处理器和各种外设,这样可以在一个主机系统上运行一个或多个客户操作系统。它支持多种硬件架构,这意味着不仅可以模拟您的当前硬件架构,还可以模拟其他架构,以运行为那些架构专门设计的软件。
安装qemu
sudo apt install qemu-user-static
qemu-user-static -L . ./bin/httpd #运行
找到漏洞并复现成功后,可以在这个网站提交漏洞,获取cve编号
https://vuldb.com/?id.add