固件 物聯(lián)網(wǎng)
前言
近幾年,物聯(lián)網(wǎng)設(shè)備已滲透到生活的方方面面,為人們帶來了極大的方便。但是,因其承載有人們?nèi)粘I町a(chǎn)生的數(shù)據(jù)和隱私信息,其安全性也越來越受到人們的關(guān)注。在上一篇中,我們討論了用腳本控制小米設(shè)備,這主要是從流量層面入手來進(jìn)行的安全分析;在這一篇,主要從固件入手,分析固件的脆弱性。
開篇
“工欲善其事,必先利其器”,在正式開始,先來講講固件分析環(huán)境的搭建,主要就是binwalk的安裝。由于固件壓縮打包的方式有很多種,單用apt instll binwalk這條命令安裝,很多文件系統(tǒng)的格式是不支持解壓的,需要將各種解壓插件一并安裝,才能正確解壓出固件中的文件系統(tǒng)。完整安裝可參考binwalk的 官方安裝文檔 。但每次都要這樣手動安裝,筆者覺得很麻煩,因此寫了安裝腳本自動完成安裝。
同時,考慮到有很多依賴包需要安裝,Ubuntu系統(tǒng)帶的apt源下載賊慢,可將其更換成阿里云的源,主要參考 這篇文章 。但每次照著帖子操作,相當(dāng)浪費時間,也寫了一個腳本自動換源的腳本,如下所示。
#!/bin/bash
# [*]change ubuntu system sources to aliyun source
#:<
codename=`lsb_release -c | cut -c 11-`
echo "codename is $codename"
sudo touch /etc/apt/sources.list
sudo echo "deb $codename main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src $codename main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb $codename-security main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src $codename-security main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb $codename-updates main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src $codename-updates main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb $codename-backports main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src $codename-backports main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb $codename-proposed main restricted universe multiverse" >> /etc/apt/sources.list
sudo echo "deb-src $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系統(tǒng)的源換成阿里云的源,并按照Ubuntu系統(tǒng)codename的不同,形成有針對性的apt源文件;再將pip的源也換成的阿里云的源。換源后,安裝速度快了幾十倍。
接著,就是對binwalk完整版的安裝了,binwalk的安裝文件和它的相關(guān)插件,我已從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文件系統(tǒng),并解壓出來。
系統(tǒng)文件目錄如上圖所示,已經(jīng)解壓出來了,下一步,即是對其中的文件進(jìn)行分析了。
正文
1. 遠(yuǎn)程登錄口令分析
很早之前,筆者就在想,很多固件都爆出了看似簡單但危害又很大的安全隱患,如弱口令登錄、web漏洞等,如果有一個腳本能自動地發(fā)現(xiàn)這些簡單的安全隱患,那,真是一門省時的生意。不過,我能想到的東西,別人早實現(xiàn)了,見項目 firmwalk 。運行十分簡單,在系統(tǒng)當(dāng)前路徑下,運行:
firmwalk.sh firmware_file_system_path
后跟固件中文件系統(tǒng)的路徑即可,以dlinkdir-300為例,有如下結(jié)果。
這是腳本運行后的部分截圖,可以看到,其中含包含admin,root,password等關(guān)鍵字的文件已列出,這些文件中,都有可能藏有口令信息。那我們就嘗試著找一找這些文件中,是否包含口令信息,比如telnet、ftp、ssh、web等,都可能存在將口令硬編碼到文件的情況。由上圖所示,發(fā)現(xiàn)了telnet關(guān)鍵字,且在/etc/scripts/system.sh文件中出現(xiàn),這個文件是隨系統(tǒng)啟動的腳本文件,那說明telnet服務(wù)是隨系統(tǒng)啟動了的,順著這個線頭捋應(yīng)該有戲。打開這個文件,果然發(fā)現(xiàn)telnet的啟動腳本,如下圖所示。
跟到這個文件中再看一眼,用vim看下這個文件,如下所示:
紅色框標(biāo)注的即是telnet的啟動命令,嘿,-u就像是跟的用戶名和密碼,用戶名為:Alphanetworks,密碼是一個變量,這個變量是cat /etc/config/image_sign的值,看下這個值是多少,如下圖所示。
密碼就是:wrgg19_c_dlwbr_dir300,按圖索驥很容易就找到了。那為什么-u后就一定確定是用戶名和密碼,可以到telnetd中看一看,用vim打開該二進(jìn)制文件,搜索password,如下圖所示,-u選項后的參數(shù)就一目了然了,即是用戶名和密碼。
圖中已經(jīng)給出了telnetd的用法,同時在網(wǎng)上搜這個固件的telnet密碼,也是文中這個口令,說明已經(jīng)找正確。
另外,在其他一些固件中,會存在/etc/passwd或/etc/passwd.bak的文件,可用john命令進(jìn)行密碼破解,如下圖所示。
解出來,口令是admin:1234。
2. 簡單web的web漏洞發(fā)現(xiàn)與利用
大部分固件都支持web訪問,而在提取出的固件文件中,可直接查看到固件的網(wǎng)頁源碼。那么是否有工具能通過源碼審計的方式發(fā)現(xiàn)一些簡單的漏洞,當(dāng)然是有的,這里將一個簡單的PHP代碼審計工具RIPS。它使用了靜態(tài)分析技術(shù),能夠自動化地挖掘PHP源代碼中潛在的安全漏洞。先來看看它的安裝,由于這款工具也是由PHP語言編寫,首先需要搭建PHP和web服務(wù)運行環(huán)境。安裝以下程序:
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這一欄填寫待分析的網(wǎng)頁源碼,將固件網(wǎng)頁源碼的路徑填入,點擊scan就能看到結(jié)果了,如下如所示。
掃了320個文件,Nothing vulnerable found,啥也沒發(fā)現(xiàn)~~。不過木事,算是簡單的驗證了下RIPS的本事,因為網(wǎng)上已爆出了dlink dir-300系列的一些漏洞。比如這個信息泄露漏洞,漏洞出現(xiàn)在suashfs-root/www/model/__show_info.php文件中,如下圖所示。
這里看到已經(jīng)禁止了$REQUIRE_FILE的參數(shù)為var/etc/httpasswd和var/etc/hnapasswd。這么一看無法獲取賬號密碼。但是我們可以從根路徑開始配置httpasswd的路徑,就可以繞過這個過濾了。Payload:
localhost/model/__show_info.php?REQUIRE_FILE=http://www.eefocus.com/var/etc/httpasswd
這里設(shè)置REQUIRE_FILE=http://www.eefocus.com/var/etc/httpasswd 成功繞過上面的 if判斷,進(jìn)行任意文件讀取。這類漏洞看來還是得配合人工審計進(jìn)行發(fā)現(xiàn)。那現(xiàn)在問題來了,已經(jīng)找到的弱點,如何進(jìn)行驗證呢。
固件模擬
固件模擬的環(huán)境,筆者搭過,當(dāng)時覺得很煩雜,本打算著寫腳本來自動實現(xiàn)。不過,這也有人實現(xiàn)了,并打包成了虛擬機,可直接使用。 AttifyOS ,了解一下,國外大牛打包的。下載后,在tools/firmadyne中,運行程序,模擬dlink dir-300固件運行,命令為:
python fat.py ./DIR-300_REVA_FIRMWARE_1.06B05_WW.zip
如上圖所示,當(dāng)模擬出網(wǎng)卡,代表固件模擬成功。我們就可以試一下是否存在上面發(fā)現(xiàn)的脆弱點。先來看看web漏洞,在瀏覽器中運行:
192.168.0.1/model/__show_info.php?REQUIRE_FILE=http://www.eefocus.com/var/etc/httpasswd
如上圖所示,口令已經(jīng)找到,用戶名為admin,密碼為空。以得到的口令嘗試登陸,順利進(jìn)入到web系統(tǒng),如下圖所示。
那么,再來看看,telnet的口令是否能成功。先用nmap掃描,看是否開啟了telnet服務(wù),如下圖所示。
如上圖所示,23端口已經(jīng)打開,表明telnet服務(wù)隨系統(tǒng)開啟了,那么嘗試telnet登錄,如下圖所示。
telnet給出了鏈接信息,感覺已經(jīng)連上,但是沒要求輸入口令,執(zhí)行命令也未回顯。telnet服務(wù)似乎存在問題,想要進(jìn)一步驗證,可以下dir-300其他版本的固件,也可以買一個設(shè)備回來測。不過,雖然沒有成功,但整個過程已清楚。下面給出整個過程用到的工具,本文的安裝環(huán)境搭建和使用到的工具,見如下鏈接:
https://github.com/scu-igroup/firmware_analysis
github上工具文件結(jié)構(gòu):
change_sources.sh……….….更換Ubuntu系統(tǒng)源和pip源腳本
Install_full_binwalk……………安裝完整版binwalk
firmwalk………………….....….固件分析工具
rips……………………………...PHP源碼審計工具
總結(jié)
到此,固件安全分析的內(nèi)容已講完,看似內(nèi)容比較簡單,但對于剛?cè)腴T來說,已經(jīng)有相當(dāng)?shù)墓ぷ髁苛恕9馐欠治霏h(huán)境搭建這一關(guān),若對Linux不熟,都得費一些功夫。不過,耐心地一步一步來,總會有所得。本文,寫了多個腳本程序,輔助大家搭建分析環(huán)境,同時,使用了多個工具來輔助進(jìn)行固件脆弱點發(fā)現(xiàn),也講解了如何使用固件模擬的方式來驗證脆弱點。對于高級的漏洞發(fā)現(xiàn),那就靠自己不斷地學(xué)習(xí)與分析了。在此,本文僅作拋磚引玉,歡迎大家一起討論,并推薦一些好的固件分析方法,方便大家一起學(xué)習(xí)。
評論
查看更多