本文适用于IOT新手,请看完全文再进行实验。
1、前言
在IOT安全中,qemu是必不可少的工具,因为不是每一个人都买得起实体设备的,所以需要qemu对固件进行仿真,而仿真会带来另一个问题,就是相关环境确实,可能你在跑一个web服务时,会发生各种报错,毫无头绪,本文以Vigor3900路由器为实验对象,对其进行固件仿真,并着重复现几个漏洞,这是因为其内部有着大量的栈溢出和命令注入漏洞,适合初次接触IOT的新手学习ヽ( ̄▽ ̄)ノ,同时vigor环境的搭建过程网络上并没有,大多使用的是公网中的设备进行复现,故在在此记录一些环境搭建的过程。
阅读本系列,你可以学到如下:
(1)web服务启动过程中的一些解决方法。
(2)漏洞挖掘过程中的一些思路。
(3)IDA反汇编过程中的相关技巧。
2、vigor3900
Vigor 是由台湾公司 DrayTek 开发的一系列路由器产品。DrayTek 以其专业级的网络设备而闻名,尤其在小型企业和中小企业市场中,Vigor 路由器被广泛使用。Vigor 3900是一款企业级的VPN管理中心,通过灵活、可靠以及高性能的LAN to LAN和远程接入方案,为客户的商务活动提供了安全保障,同时也节省了成本。
近些年也爆出了一些漏洞,CVE-2020-14472、CVE-2020-14473、CVE-2021-43118、CVE-2020-8515等,大多是命令注入和栈溢出等漏洞,并且发现的过程不是很难,很适合新手学习。
3、环境搭建
本文的复现环境如下:
kali2024、vigor39001.4.1、IDA pro 7.7
(1)下载固件
在该网站上可以下载到所有的相关固件 https://fw.draytek.com.tw/
我们这边下载vigor3900的1.4.1版本,命令如下
wget https://fw.draytek.com.tw/Vigor3900/Firmware/v1.4.1/Vigor3900_v1.4.1.ota
(2)binwalk提取固件
尝试用binwalk提取一下,发现binwalk提取出来的是一个以ubi结尾的二进制文件。
binwalk -Me Vigor3900_v1.4.1.ota
查阅资料可以知道,这是一个ubi格式的文件系统,则可以安装ubi_reader
GitHub - onekey-sec/ubi_reader: Collection of Python scripts for reading information about and extracting data from UBI and UBIFS images.,然后里面的ubireader_extract_files脚本可以对二进制文件进行提取(其实如果从源码构建binwalk的时候,binwalk是自带ubireader_extract_files脚本的)
然后查看相关架构,是arm小端,一般来说,都是查看busybox
,其他二进制文件也可,LSB表示小端,MSB表示大端。
(3)firmwalker扫描固件
由于没有实体的设备,直接用nmap扫描端口不现实,一般来说,路由器等设备的漏洞都存在于web服务,可以先跑一下firmwalker_pro,该工具是fiemwalker的加强版,用于搜索固件的文件系统中的敏感信息等内容。当然,也有其他的固件扫描工具开源固件扫描工具对比 - 知冰 - 博客园 (cnblogs.com),尤其是EMBA,据说效果很好,有兴趣的可以试一下,firmwalker
的命令如下。
./firmwalker.sh ../ubifs-root/1095410974/rootfs res.txt
可以看到,在usr/sbin
目录下有lighttpd
服务,Lighttpd是一种轻量级的Web服务器,常用于嵌入式系统,因此后面可以着重对该服务进行分析。
同时这边也看到了相关的配置文件lighttpd.conf
,如下所示。
之后可以查看一下init.d
目录,init.d
目录通常位于/etc
目录下,并且包含了一系列的脚本。这些脚本用于在系统启动或关机时启动或停止各种服务和进程,重点查看一下lighttpd
服务的启动流程,如下所示。
(3)系统模拟
1. qemu启动
确定好分析的目标之后,则可以尝试开始进行系统的模拟,这边介绍一个简单脚本https://github.com/N1nEmAn/Sevnup进行模拟(qemu模拟的具体过程可以查看上一篇博客),执行该脚本可以根据文件系统的信息自行下载相关的内核文件并进行自动的配置ip地址,同时把文件系统打包,命令如下所示。
git clone https://github.com/N1nEmAn/Sevnup.git
cd Sevnup
./run.sh armel ../rootfs
该脚本其实就是自动下载一些内核镜像文件,免去了一些麻烦。
下载完之后,启动如下所示,需要在qemu中输入一些配置命令,即红色框中框出的命令
不过使用qemu的图形化界面不好操作,不如修改一下脚本,将 QEMU 的输出重定向到当前终端,并且可以通过终端直接与虚拟机的控制台进行交互,用如下脚本替换run.sh
中的内容。
#!/bin/bash
# Print ASCII art at the beginning
echo " "
echo " ███████╗███████╗██╗ ██╗███╗ ██╗██╗ ██╗██████╗ "
echo " ██╔════╝██╔════╝██║ ██║████╗ ██║██║ ██║██╔══██╗"
echo " ███████╗█████╗ ██║ ██║██╔██╗ ██║██║ ██║██████╔╝"
echo " ╚════██║██╔══╝ ╚██╗ ██╔╝██║╚██╗██║██║ ██║██╔═══╝ "
echo " ███████║███████╗ ╚████╔╝ ██║ ╚████║╚██████╔╝██║ "
echo " ╚══════╝╚══════╝ ╚═══╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ "
echo " "
echo " Welcome to Sevnup firmware analysis script for MIPSel "
echo " By N1nEmAn - https://github.com/N1nEmAn/Sevnup"
echo " "
# Display help information
print_help() {
echo "Usage: $0 [ARCHITECTURE] [ROOT_PATH]"
echo
echo "ARCHITECTURE:"
echo " mipsel - MIPS architecture"
echo " armel - ARM architecture"
echo
echo "ROOT_PATH:"
echo " The path to the root directory of the squashfs-root."
echo
echo "Example:"
echo " $0 armel /path/to/squashfs-root"
exit 1
}
# Check for arguments
if [ "$#" -ne 2 ]; then
echo -e "\033[0;31m[x]\033[0m Invalid number of arguments."
print_help
fi
# Check for architecture argument
arch="$1"
if [ "$arch" != "mipsel" ] && [ "$arch" != "armel" ]; then
echo -e "\033[0;31m[x]\033[0m Unsupported architecture: $arch"
print_help
fi
# Check for root path argument
squashfs_root_path="$2"
if [ ! -d "$squashfs_root_path" ]; then
echo -e "\033[0;31m[x]\033[0m The provided path is not a directory."
print_help
fi
sudo chmod 777 $squashfs_root_path/lib/*
su