工控CTF之某韌體分析解題

  • 2019 年 12 月 23 日
  • 筆記

一、解題

在2019年工業資訊安全技能大賽第一場線上賽中有一道韌體分析的題目,當時雖然Get到了答案,卻終歸是知其然不知其所以然,於是決定搭個環境來完整分析一下,順便學習一下路由器漏洞分析。話不多說,先上題目:

拿到題目後,首先想到的是:這應該是一個被公開過的路由器漏洞吧,會是什麼路由器的洞呢?題目說明中提到了tddp協議,於是先搜索一把,相關結果如下:

還真有發現:TP-Link SR20路由器…數據的第二個位元組為0x31…遠程程式碼執行,難道就這麼巧么?嘗試根據題目提示猜測組合答案:CMD_FTEST_CONFIG+0x02+0x31,進行提交,嗯,答案正確,解題完畢……

二、漏洞復現

基礎環境搭建

解題成功純屬巧合,要搞清楚來龍去脈還得靠漏洞復現+分析,於是決定搭個環境跑跑看(一堆坑啊,各種問題是必然的,一路坎坷一路向遠方)。先下載了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進行解決。

安裝完成後如下所示:

將待分析韌體拷貝進虛擬機,首選binwalk走一波:

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

squashfs-root目錄就是路由器的韌體文件系統:

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虛擬機中:

使用chroot 切換根目錄韌體文件系統:

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

成功切換至韌體文件系統,將韌體跑起來了:

執行PoC程式碼,測試一下是否能遠程執行命令:

連接路由器成功並獲取韌體系統詳細資訊,至此漏洞復現完成。

三、漏洞分析

通過搜索關鍵字元串,嘗試定位相關漏洞函數:

來到函數sub_15E74查看偽碼:

該函數為處理接收到來自UDP Port 1040基於tddp協議的數據,可以看到函數中的switch case,對應著不同情況的處理方式。漏洞發生在分支0x31處理「CMD_FTEST_CONFIG」類型消息,因此漏洞函數為sub_A580,繼續跟進:

此處調用了sscanf函數,將用戶參數根據格式化字元串解析到後面的參數中,然後進入到sub_91DC函數中執行。由於sscanf函數中只判斷了;字元,未對&和|符號進行過濾,因此可進行命令注入,拼接惡意程式碼然後進入sub_91DC函數中得以執行,繼續跟進sub_91DC函數:

這裡直接調用execve函數進行命令執行,至此,漏洞分析完成。

*本文作者:ww5466064,轉載請註明來自FreeBuf.COM

Tags: