初步接触物联网设备,很多都是一头雾水,以一个初学者的角度对漏洞 CVE-2020-8515 进行分析,主要从固件的下载、提取、分析这几个方面进行阐述。
官网对漏洞的描述
Vigor2960 <v1.5.1
Vigor300B <v1.5.1
Vigor3900 <v1.5.1
VigorSwitch20P2121 <= v2.3.2
VigorSwitch20G1280 <= v2.3.2
VigorSwitch20P1280 <= v2.3.2
VigorSwitch20G2280 <= v2.3.2
VigorSwitch20P2280 <= v2.3.2
我们注意到了漏洞影响的版本和型号,并且在公告页面给出了修补后的固件下载地址
https://www.draytek.com.tw/ftp/Vigor2960/Firmware/v1.5.1/Vigor2960_v1.5.1.zip
找半天没找到老版本的固件下载地址,直接在 url 上面进行操作
https://www.draytek.com.tw/ftp/Vigor2960/Firmware/v1.4.1/Vigor2960_v1.4.1.zip
如此就下载到了老版本的固件
解压下载下来的压缩包,利用 binwalk 先进行分析
binwalk Vigor2960_v1.4.1.all
注意到提示是 UBI image 文件系统,先用 binwalk 将其提取出来,再利用 UBI Reader UBIFS Dumper 将系统读取出来
binwalk -Me Vigor2960_v1.4.1.all
UBI Reader 的安装及使用
sudo apt install python2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py -i https://pypi.tuna.tsinghua.edu.cn/simple
## 安装依赖
sudo apt-get upgrade
sudo apt-get update
sudo apt-get install aptitude
sudo aptitude install build-essential # 一路选 "n" 直到显示相同选 "Y"
sudo apt-get install python-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev gcc cmake
## 安装 LZO
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
tar -xvzf lzo-2.10.tar.gz
cd lzo-2.10
mkdir build
cd build
cmake ..
make -j4
sudo make install
## 安装 python-lzo
sudo python2 -m pip install python-lzo
sudo pip install ubi_reader
ubi_reader工具提供了四个脚本:
ubireader_display_info //获取UBI信息以及布局块等信息
ubireader_extract_images //提取镜像
ubireader_extract_files //提取文件内容
ubireader_utils_info //分析UBI镜像并创建shell脚本和UBI配置文件
后来发现也是可以通过ubi_reader 直接提取出文件的
ubireader_extract_files Vigor2960_v1.4.1.all
UBIFS Dumper的安装及使用
git clone git://github.com/nlitsme/ubidump.git
cd ubidump/
sudo python2 -m pip install python-lzo
sudo python2 -m pip install crcmod
python ubidump.py -l 20030.ubi
显示镜像内容
python ubidump.py -s . 20030.ubi
提取镜像
我们看到网络上的分析描述大都基于 两个0day漏洞命令注入点是keyPath和rtick,位于/www/cgi-bin/mainfunction.cgi,对应的Web Server程序是/usr/sbin/lighttpd
通过 keypath 传入的参数仅经过了 函数 sub_AD58 的处理
发现对传入的字符串进行了处理会将
;` $ | > 空格 都替换成了 +
要是往常来看的话我会认为此处就没有命令执行了,因为一般都是通过拼接来实现命令执行,但是通过查看 poc ,学到了一种新的思路
POC keyPath=%27%0A%2fbin%2f" + cmd + "%0A%27
'
/bin/" + cmd + "
'
单引号闭合前后的单引号,然后通过换行实现了多命令的执行,同时 {IFS}
可以绕过对空格的过滤
在 1.5.1 版本中对 keypath 字段做了限制,限制长度为30,并做了相应的过滤。
在 1.5.1 版本中对 rtick 字段做了限制,限制仅使用[0-9]。
整体看下来漏洞并不是很难,但如果仅仅黑盒测试的话,大概花费更长时间才能发现这些漏洞问题,结合固件提取源代码,对代码进行分析才是王道。
本文作者:Whippet
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/166775.html