固件 物聯(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的 官方安裝文檔 。但每次都要這樣手動(dòng)安裝,筆者覺得很麻煩,因此寫了安裝腳本自動(dòng)完成安裝。
同時(shí),考慮到有很多依賴包需要安裝,Ubuntu系統(tǒng)帶的apt源下載賊慢,可將其更換成阿里云的源,主要參考 這篇文章 。但每次照著帖子操作,相當(dāng)浪費(fèi)時(shí)間,也寫了一個(gè)腳本自動(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的不同,形成有針對(duì)性的apt源文件;再將pip的源也換成的阿里云的源。換源后,安裝速度快了幾十倍。
接著,就是對(duì)binwalk完整版的安裝了,binwalk的安裝文件和它的相關(guān)插件,我已從github上下載完成(在后文的工具中,已集成),如下圖所示。
安裝腳本為: install_binwalk.sh,如下所示,即是按照官方的安裝方案編寫的腳本(官方雖然有./deps.sh自動(dòng)安裝腳本,安裝很慢,表示不太好用),該腳本目前只適用于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/
運(yùn)行該腳本,待binwalk安裝好后,大部分的固件都能解壓了。這里以dlink dir-300為例,已在binwalk安裝包中給出,在命令行中運(yùn)行: binwalk -Me DIR-300_REVA_FIRMWARE_1.06B05_WW.zip
這是解壓過程,其中,識(shí)別到squashfs文件系統(tǒng),并解壓出來。
系統(tǒng)文件目錄如上圖所示,已經(jīng)解壓出來了,下一步,即是對(duì)其中的文件進(jìn)行分析了。
正文
1. 遠(yuǎn)程登錄口令分析
很早之前,筆者就在想,很多固件都爆出了看似簡(jiǎn)單但危害又很大的安全隱患,如弱口令登錄、web漏洞等,如果有一個(gè)腳本能自動(dòng)地發(fā)現(xiàn)這些簡(jiǎn)單的安全隱患,那,真是一門省時(shí)的生意。不過,我能想到的東西,別人早實(shí)現(xiàn)了,見項(xiàng)目 firmwalk 。運(yùn)行十分簡(jiǎn)單,在系統(tǒng)當(dāng)前路徑下,運(yùn)行:
firmwalk.sh firmware_file_system_path
后跟固件中文件系統(tǒng)的路徑即可,以dlinkdir-300為例,有如下結(jié)果。
這是腳本運(yùn)行后的部分截圖,可以看到,其中含包含admin,root,password等關(guān)鍵字的文件已列出,這些文件中,都有可能藏有口令信息。那我們就嘗試著找一找這些文件中,是否包含口令信息,比如telnet、ftp、ssh、web等,都可能存在將口令硬編碼到文件的情況。由上圖所示,發(fā)現(xiàn)了telnet關(guān)鍵字,且在/etc/scripts/system.sh文件中出現(xiàn),這個(gè)文件是隨系統(tǒng)啟動(dòng)的腳本文件,那說明telnet服務(wù)是隨系統(tǒng)啟動(dòng)了的,順著這個(gè)線頭捋應(yīng)該有戲。打開這個(gè)文件,果然發(fā)現(xiàn)telnet的啟動(dòng)腳本,如下圖所示。
跟到這個(gè)文件中再看一眼,用vim看下這個(gè)文件,如下所示:
紅色框標(biāo)注的即是telnet的啟動(dòng)命令,嘿,-u就像是跟的用戶名和密碼,用戶名為:Alphanetworks,密碼是一個(gè)變量,這個(gè)變量是cat /etc/config/image_sign的值,看下這個(gè)值是多少,如下圖所示。
密碼就是:wrgg19_c_dlwbr_dir300,按圖索驥很容易就找到了。那為什么-u后就一定確定是用戶名和密碼,可以到telnetd中看一看,用vim打開該二進(jìn)制文件,搜索password,如下圖所示,-u選項(xiàng)后的參數(shù)就一目了然了,即是用戶名和密碼。
圖中已經(jīng)給出了telnetd的用法,同時(shí)在網(wǎng)上搜這個(gè)固件的telnet密碼,也是文中這個(gè)口令,說明已經(jīng)找正確。
另外,在其他一些固件中,會(huì)存在/etc/passwd或/etc/passwd.bak的文件,可用john命令進(jìn)行密碼破解,如下圖所示。
解出來,口令是admin:1234。
2. 簡(jiǎn)單web的web漏洞發(fā)現(xiàn)與利用
大部分固件都支持web訪問,而在提取出的固件文件中,可直接查看到固件的網(wǎng)頁(yè)源碼。那么是否有工具能通過源碼審計(jì)的方式發(fā)現(xiàn)一些簡(jiǎn)單的漏洞,當(dāng)然是有的,這里將一個(gè)簡(jiǎn)單的PHP代碼審計(jì)工具RIPS。它使用了靜態(tài)分析技術(shù),能夠自動(dòng)化地挖掘PHP源代碼中潛在的安全漏洞。先來看看它的安裝,由于這款工具也是由PHP語(yǔ)言編寫,首先需要搭建PHP和web服務(wù)運(yùn)行環(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)頁(yè)源碼,將固件網(wǎng)頁(yè)源碼的路徑填入,點(diǎn)擊scan就能看到結(jié)果了,如下如所示。
掃了320個(gè)文件,Nothing vulnerable found,啥也沒發(fā)現(xiàn)~~。不過木事,算是簡(jiǎn)單的驗(yàn)證了下RIPS的本事,因?yàn)榫W(wǎng)上已爆出了dlink dir-300系列的一些漏洞。比如這個(gè)信息泄露漏洞,漏洞出現(xiàn)在suashfs-root/www/model/__show_info.php文件中,如下圖所示。
這里看到已經(jīng)禁止了$REQUIRE_FILE的參數(shù)為var/etc/httpasswd和var/etc/hnapasswd。這么一看無法獲取賬號(hào)密碼。但是我們可以從根路徑開始配置httpasswd的路徑,就可以繞過這個(gè)過濾了。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ì)進(jìn)行發(fā)現(xiàn)。那現(xiàn)在問題來了,已經(jīng)找到的弱點(diǎn),如何進(jìn)行驗(yàn)證呢。
固件模擬
固件模擬的環(huán)境,筆者搭過,當(dāng)時(shí)覺得很煩雜,本打算著寫腳本來自動(dòng)實(shí)現(xiàn)。不過,這也有人實(shí)現(xiàn)了,并打包成了虛擬機(jī),可直接使用。 AttifyOS ,了解一下,國(guó)外大牛打包的。下載后,在tools/firmadyne中,運(yùn)行程序,模擬dlink dir-300固件運(yùn)行,命令為:
python fat.py ./DIR-300_REVA_FIRMWARE_1.06B05_WW.zip
如上圖所示,當(dāng)模擬出網(wǎng)卡,代表固件模擬成功。我們就可以試一下是否存在上面發(fā)現(xiàn)的脆弱點(diǎn)。先來看看web漏洞,在瀏覽器中運(yùn)行:
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)一步驗(yàn)證,可以下dir-300其他版本的固件,也可以買一個(gè)設(shè)備回來測(cè)。不過,雖然沒有成功,但整個(gè)過程已清楚。下面給出整個(gè)過程用到的工具,本文的安裝環(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源碼審計(jì)工具
總結(jié)
到此,固件安全分析的內(nèi)容已講完,看似內(nèi)容比較簡(jiǎn)單,但對(duì)于剛?cè)腴T來說,已經(jīng)有相當(dāng)?shù)墓ぷ髁苛?。光是分析環(huán)境搭建這一關(guān),若對(duì)Linux不熟,都得費(fèi)一些功夫。不過,耐心地一步一步來,總會(huì)有所得。本文,寫了多個(gè)腳本程序,輔助大家搭建分析環(huán)境,同時(shí),使用了多個(gè)工具來輔助進(jìn)行固件脆弱點(diǎn)發(fā)現(xiàn),也講解了如何使用固件模擬的方式來驗(yàn)證脆弱點(diǎn)。對(duì)于高級(jí)的漏洞發(fā)現(xiàn),那就靠自己不斷地學(xué)習(xí)與分析了。在此,本文僅作拋磚引玉,歡迎大家一起討論,并推薦一些好的固件分析方法,方便大家一起學(xué)習(xí)。
評(píng)論
查看更多