當前位置:
首頁 > 新聞 > 物聯網設備固件分析之小試牛刀

物聯網設備固件分析之小試牛刀

前言


近幾年,物聯網設備已滲透到生活的方方面面,為人們帶來了極大的方便。但是,因其承載有人們日常生活產生的數據和隱私信息,其安全性也越來越受到人們的關注。在上一篇中,我們討論了用腳本控制小米設備,這主要是從流量層面入手來進行的安全分析;在這一篇,主要從固件入手,分析固件的脆弱性。

開篇


「工欲善其事,必先利其器」,在正式開始,先來講講固件分析環境的搭建,主要就是binwalk的安裝。由於固件壓縮打包的方式有很多種,單用apt instll binwalk這條命令安裝,很多文件系統的格式是不支持解壓的,需要將各種解壓插件一併安裝,才能正確解壓出固件中的文件系統。完整安裝可參考binwalk的官方安裝文檔。但每次都要這樣手動安裝,筆者覺得很麻煩,因此寫了安裝腳本自動完成安裝。


同時,考慮到有很多依賴包需要安裝,Ubuntu系統帶的apt源下載賊慢,可將其更換成阿里雲的源,主要參考這篇文章。但每次照著帖子操作,相當浪費時間,也寫了一個腳本自動換源的腳本,如下所示。

#!/bin/bash

# [*]change ubuntu system sources to aliyun source
#:<<BLOCK
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak.1

codename=`lsb_release -c | cut -c 11-`
echo "codename is $codename"

sudo touch /etc/apt/sources.list

sudo echo "deb http://mirrors.aliyun.com/ubuntu/ $codename main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src http://mirrors.aliyun.com/ubuntu/ $codename main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb http://mirrors.aliyun.com/ubuntu/ $codename-security main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src http://mirrors.aliyun.com/ubuntu/ $codename-security main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb http://mirrors.aliyun.com/ubuntu/ $codename-updates main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src http://mirrors.aliyun.com/ubuntu/ $codename-updates main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb http://mirrors.aliyun.com/ubuntu/ $codename-backports main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src http://mirrors.aliyun.com/ubuntu/ $codename-backports main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb http://mirrors.aliyun.com/ubuntu/ $codename-proposed main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src http://mirrors.aliyun.com/ubuntu/ $codename-proposed main restricted universe multiverse" >> /etc/apt/sources.list

sudo apt-get update
#BLOCK
# [*]change pip sources to aliyun source
if [ ! -d ~/.pip ];then
   mkdir ~/.pip
fi

if [ -f ~/.pip/pip.conf ];
then
   sudo mv ~/.pip/pip.conf ~/.pip/pip.conf.bak
   sudo touch ~/.pip/pip.conf
else
   sudo touch ~/.pip/pip.conf
fi

sudo echo "[global]" >> ~/.pip/pip.conf
sudo echo "index-url = https://mirrors.aliyun.com/pypi/simple" >> ~/.pip/pip.conf

在腳本中,主要分為兩部分,先是將Ubuntu系統的源換成阿里雲的源,並按照Ubuntu系統codename的不同,形成有針對性的apt源文件;再將pip的源也換成的阿里雲的源。換源後,安裝速度快了幾十倍。


接著,就是對binwalk完整版的安裝了,binwalk的安裝文件和它的相關插件,我已從github上下載完成(在後文的工具中,已集成),如下圖所示。



安裝腳本為: install_binwalk.sh,如下所示,即是按照官方的安裝方案編寫的腳本(官方雖然有./deps.sh自動安裝腳本,安裝很慢,表示不太好用),該腳本目前只適用於Python2.7。

#!/bin/bash

#dependencies
sudo apt -y install python-lzma python-crypto
sudo apt -y install libqt4-opengl python-opengl python-qt4 python-qt4-gl python-numpy python-scipy python-pip

sudo pip install pyqtgraph
sudo pip install capstone

# Install standard extraction utilities(必選)  
sudo apt -y install mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsswap squashfs-tools sleuthkit default-jdk lzop srecord
#Install binwalk
#sudo apt-get install binwalk
cd binwalk
sudo python setup.py install
cd ..

# Install sasquatch to extract non-standard SquashFS images(必選)  
sudo apt -y install zlib1g-dev liblzma-dev liblzo2-dev  
cd sasquatch && sudo ./build.sh
cd ..

# Install jefferson to extract JFFS2 file systems(可選)  
sudo pip install cstruct  
cd jefferson && sudo python setup.py install
cd ..

# Install ubi_reader to extract UBIFS file systems(可選)  
sudo apt -y install liblzo2-dev python-lzo  
cd ubi_reader && sudo python setup.py install
cd ..
# Install yaffshiv to extract YAFFS file systems(可選)  
cd yaffshiv && sudo python setup.py install
cd ..

#install unstuff (closed source) to extract StuffIt archive files
sudo cp stuff/bin/unstuff /usr/local/bin/

運行該腳本,待binwalk安裝好後,大部分的固件都能解壓了。這裡以dlink dir-300為例,已在binwalk安裝包中給出,在命令行中運行:binwalk -Me DIR-300_REVA_FIRMWARE_1.06B05_WW.zip



這是解壓過程,其中,識別到squashfs文件系統,並解壓出來。


系統文件目錄如上圖所示,已經解壓出來了,下一步,即是對其中的文件進行分析了。


正文


1. 遠程登錄口令分析


很早之前,筆者就在想,很多固件都爆出了看似簡單但危害又很大的安全隱患,如弱口令登錄、web漏洞等,如果有一個腳本能自動地發現這些簡單的安全隱患,那,真是一門省時的生意。不過,我能想到的東西,別人早實現了,見項目firmwalk。運行十分簡單,在系統當前路徑下,運行:

firmwalk.sh firmware_file_system_path

後跟固件中文件系統的路徑即可,以dlinkdir-300為例,有如下結果。



這是腳本運行後的部分截圖,可以看到,其中含包含admin,root,password等關鍵字的文件已列出,這些文件中,都有可能藏有口令信息。那我們就嘗試著找一找這些文件中,是否包含口令信息,比如telnet、ftp、ssh、web等,都可能存在將口令硬編碼到文件的情況。由上圖所示,發現了telnet關鍵字,且在/etc/scripts/system.sh文件中出現,這個文件是隨系統啟動的腳本文件,那說明telnet服務是隨系統啟動了的,順著這個線頭捋應該有戲。打開這個文件,果然發現telnet的啟動腳本,如下圖所示。



跟到這個文件中再看一眼,用vim看下這個文件,如下所示:


紅色框標註的即是telnet的啟動命令,嘿,-u就像是跟的用戶名和密碼,用戶名為:Alphanetworks,密碼是一個變數,這個變數是cat /etc/config/image_sign的值,看下這個值是多少,如下圖所示。



密碼就是:wrgg19cdlwbr_dir300,按圖索驥很容易就找到了。那為什麼-u後就一定確定是用戶名和密碼,可以到telnetd中看一看,用vim打開該二進位文件,搜索password,如下圖所示,-u選項後的參數就一目了然了,即是用戶名和密碼。



圖中已經給出了telnetd的用法,同時在網上搜這個固件的telnet密碼,也是文中這個口令,說明已經找正確。


另外,在其他一些固件中,會存在/etc/passwd或/etc/passwd.bak的文件,可用john命令進行密碼破解,如下圖所示。



解出來,口令是admin:1234。


2. 簡單web的web漏洞發現與利用

大部分固件都支持web訪問,而在提取出的固件文件中,可直接查看到固件的網頁源碼。那麼是否有工具能通過源碼審計的方式發現一些簡單的漏洞,當然是有的,這裡將一個簡單的PHP代碼審計工具RIPS。它使用了靜態分析技術,能夠自動化地挖掘PHP源代碼中潛在的安全漏洞。先來看看它的安裝,由於這款工具也是由PHP語言編寫,首先需要搭建PHP和web服務運行環境。安裝以下程序:

sudo apt install apache2 php7.2 libapache2-mod-php7.2sudo /etc/init.d/apache2 restart

下載RIPS,下載地址為見這裡;下載完成後將其解壓並放到/var/www/html/目錄下,如下圖所示。



再在瀏覽器中訪問該路徑即可:127.0.0.1/rips。



在path/file這一欄填寫待分析的網頁源碼,將固件網頁源碼的路徑填入,點擊scan就能看到結果了,如下如所示。



掃了320個文件,Nothing vulnerable found,啥也沒發現~~。不過木事,算是簡單的驗證了下RIPS的本事,因為網上已爆出了dlink dir-300系列的一些漏洞。比如這個信息泄露漏洞,漏洞出現在suashfs-root/www/model/_showinfo.php文件中,如下圖所示。



這裡看到已經禁止了$REQUIRE_FILE的參數為var/etc/httpasswd和var/etc/hnapasswd。這麼一看無法獲取賬號密碼。但是我們可以從根路徑開始配置httpasswd的路徑,就可以繞過這個過濾了。Payload:

localhost/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd

這裡設置REQUIRE_FILE=/var/etc/httpasswd 成功繞過上面的 if判斷,進行任意文件讀取。這類漏洞看來還是得配合人工審計進行發現。那現在問題來了,已經找到的弱點,如何進行驗證呢。


固件模擬


固件模擬的環境,筆者搭過,當時覺得很煩雜,本打算著寫腳本來自動實現。不過,這也有人實現了,並打包成了虛擬機,可直接使用。AttifyOS,了解一下,國外大牛打包的。下載後,在tools/firmadyne中,運行程序,模擬dlink dir-300固件運行,命令為:

python fat.py ./DIR-300_REVA_FIRMWARE_1.06B05_WW.zip


如上圖所示,當模擬出網卡,代表固件模擬成功。我們就可以試一下是否存在上面發現的脆弱點。先來看看web漏洞,在瀏覽器中運行:

192.168.0.1/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd


如上圖所示,口令已經找到,用戶名為admin,密碼為空。以得到的口令嘗試登陸,順利進入到web系統,如下圖所示。



那麼,再來看看,telnet的口令是否能成功。先用nmap掃描,看是否開啟了telnet服務,如下圖所示。


如上圖所示,23埠已經打開,表明telnet服務隨系統開啟了,那麼嘗試telnet登錄,如下圖所示。



telnet給出了鏈接信息,感覺已經連上,但是沒要求輸入口令,執行命令也未回顯。telnet服務似乎存在問題,想要進一步驗證,可以下dir-300其他版本的固件,也可以買一個設備回來測。不過,雖然沒有成功,但整個過程已清楚。下面給出整個過程用到的工具,本文的安裝環境搭建和使用到的工具,見如下鏈接:



https://github.com/scu-igroup/firmware_analysis


github上工具文件結構:



change_sources.sh……….….更換Ubuntu系統源和pip源腳本


Installfullbinwalk……………安裝完整版binwalk


firmwalk………………….....….固件分析工具


rips……………………………...PHP源碼審計工具


總結


到此,固件安全分析的內容已講完,看似內容比較簡單,但對於剛入門來說,已經有相當的工作量了。光是分析環境搭建這一關,若對Linux不熟,都得費一些功夫。不過,耐心地一步一步來,總會有所得。本文,寫了多個腳本程序,輔助大家搭建分析環境,同時,使用了多個工具來輔助進行固件脆弱點發現,也講解了如何使用固件模擬的方式來驗證脆弱點。對於高級的漏洞發現,那就靠自己不斷地學習與分析了。在此,本文僅作拋磚引玉,歡迎大家一起討論,並推薦一些好的固件分析方法,方便大家一起學習。


參考資料



1.

 

https://github.com/ReFirmLabs/binwalk/blob/master/INSTALL.md


2.

 

https://blog.csdn.net/zhangjiahao14/article/details/80554616


3.

 

https://github.com/craigz28/firmwalker

4.

 

https://sourceforge.net/projects/rips-scanner/


5.

 

https://github.com/adi0x90/attifyos


*

本文作者:scu-igroup,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

Frida在爆破Windows程序中的應用
美國投票系統早已千瘡百孔,十分鐘內竟被11歲少年攻破?

TAG:FreeBuf |