18

工控CTF之某固件分析解题

 4 years ago
source link: https://www.freebuf.com/articles/ics-articles/221625.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、解题

在2019年工业信息安全技能大赛第一场线上赛中有一道固件分析的题目,当时虽然Get到了答案,却终归是知其然不知其所以然,于是决定搭个环境来完整分析一下,顺便学习一下路由器漏洞分析。话不多说,先上题目:

NFRz2uq.jpg!web 拿到题目后,首先想到的是:这应该是一个被公开过的路由器漏洞吧,会是什么路由器的洞呢?题目说明中提到了tddp协议,于是先搜索一把,相关结果如下:

jQbqi2z.jpg!web

veENB3v.jpg!webErmqqyi.jpg!web 还真有发现:TP-Link SR20路由器…数据的第二个字节为0×31…远程代码执行,难道就这么巧么?尝试根据题目提示猜测组合答案:CMD_FTEST_CONFIG+0×02+0×31,进行提交,嗯,答案正确,解题完毕……

二、漏洞复现

基础环境搭建

解题成功纯属巧合,要搞清楚来龙去脉还得靠漏洞复现+分析,于是决定搭个环境跑跑看(一堆坑啊,各种问题是必然的,一路坎坷一路向远方)。先下载了Ubuntu18.04 ISO把虚拟机装起,然后下载Qemu,Qemu是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备。可以使用命令:

apt install qemu

直接安装,或者下载源码: https://download.qemu.org/ 编译安装,解压后进入到qemu目录,然后:

./configure  #配置
make #编译
make install

此过程将遇到各种问题,可参考 https://blog.csdn.net/snail_coder/article/details/82935081 进行解决。

安装完成后如下所示:

YBVf6bI.jpg!web

将待分析固件拷贝进虚拟机,首选binwalk走一波:

binwalk 6-bin.bin
binwalk -Me 6-bin.bin

bmEzy2z.jpg!web squashfs-root目录就是路由器的固件文件系统: 7jEVvaJ.jpg!web

7Vjia23.jpg!web

ARM QEMU环境搭建

路由器固件已有,接着需要搭建ARM虚拟化环境,进而将固件跑起来。从Debian官网: https://people.debian.org/ ~aurel32/qemu/armhf/下载Debian ARM系统的相关文件: vmlinuz-3.2.0-4-vexpress、initrd.img-3.2.0-4-vexpress、debian_wheezy_armhf_standard.qcow2;为虚拟机添加一个网卡tap0用以与ARM虚拟机通信:

sudo tunctl -t tap0
sudo ifconfig tap0 10.10.10.1/24

执行命令开启ARM虚拟机:

qemu-system-arm-M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrdinitrd.img-3.2.0-4-vexpress -driveif=sd,file=debian_wheezy_armhf_standard.qcow2 -append
"root=/dev/mmcblk0p2console=ttyAMA0" -net nic -net tap,ifname=tap0,script=no,downscript=no-nographic

给ARM虚拟机配置IP,并将固件拷贝至ARM虚拟机中:

6vqumm2.jpg!web

使用chroot 切换根目录固件文件系统:

mount -o bind /dev ./squashfs-root/dev/
mount -t proc /proc/ ./squashfs-root/proc/
chroot squashfs-root sh

成功切换至固件文件系统,将固件跑起来了:

nUnUR3a.jpg!web 执行PoC代码,测试一下是否能远程执行命令:

RnmMF3f.jpg!web 连接路由器成功并获取固件系统详细信息,至此漏洞复现完成。

三、漏洞分析

通过搜索关键字符串,尝试定位相关漏洞函数:

6FRBF3u.jpg!web

RZjQj2r.jpg!web 来到函数sub_15E74查看伪码: 3EZV32Q.jpg!webrI7Vvu3.jpg!web 该函数为处理接收到来自UDP Port 1040基于tddp协议的数据,可以看到函数中的switch case,对应着不同情况的处理方式。漏洞发生在分支0×31处理“CMD_FTEST_CONFIG”类型消息,因此漏洞函数为sub_A580,继续跟进: JBbYvmq.jpg!web 此处调用了sscanf函数,将用户参数根据格式化字符串解析到后面的参数中,然后进入到sub_91DC函数中执行。由于sscanf函数中只判断了;字符,未对&和|符号进行过滤,因此可进行命令注入,拼接恶意代码然后进入sub_91DC函数中得以执行,继续跟进sub_91DC函数: URBFv2R.jpg!web 这里直接调用execve函数进行命令执行,至此,漏洞分析完成。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK