物聯網裝置韌體分析之小試牛刀
*本文作者:scu-igroup,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
前言
近幾年,物聯網裝置已滲透到生活的方方面面,為人們帶來了極大的方便。但是,因其承載有人們日常生活產生的資料和隱私資訊,其安全性也越來越受到人們的關注。在上一篇中,我們討論了用指令碼控制小米裝置,這主要是從流量層面入手來進行的安全分析;在這一篇,主要從韌體入手,分析韌體的脆弱性。
開篇
“工欲善其事,必先利其器”,在正式開始,先來講講韌體分析環境的搭建,主要就是binwalk的安裝。由於韌體壓縮打包的方式有很多種,單用apt instll binwalk這條命令安裝,很多檔案系統的格式是不支援解壓的,需要將各種解壓外掛一併安裝,才能正確解壓出韌體中的檔案系統。完整安裝可參考binwalk的 ofollow,noindex" target="_blank">官方安裝文件 。但每次都要這樣手動安裝,筆者覺得很麻煩,因此寫了安裝指令碼自動完成安裝。
同時,考慮到有很多依賴包需要安裝,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的值,看下這個值是多少,如下圖所示。
密碼就是:wrgg19_c_dlwbr_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.2 sudo /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/__show_info.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源指令碼 Install_full_binwalk……………安裝完整版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 原創獎勵計劃,未經許可禁止轉載。