第3章
固件分析與漏洞利用
本章将主要讨論以下主題:
- 固件分析方法。
- 固件提取。
- 固件分析。
- 檔案系統分析。
- 基于固件仿真的動态分析。
- ARM與MIPS架構下二進制檔案的分析入門。
- MIPS架構下的漏洞利用。
3.1 簡介
到目前為止,我們已經介紹了IoT生态系統中的所有基本原理,并且通過威脅模組化确定了各種威脅對應的風險,這些内容對于我們開展滲透測試大有幫助。雖然單純借助目前普遍應用的漏洞掃描技術,有些漏洞和威脅識别起來可能會更簡單一些,但是,在本章中,我們将把注意力聚焦在固件的逆向分析上,希望通過對固件内容的分析實作運作時對固件的操作。我們需要撸起袖子讨論如何對固件進行反彙編,如何使用常見的固件工具分析固件内容與固件架構,以及如何修改固件用于攻擊。同其他軟體逆向分析方法類似,固件分析也絕對是一門藝術。讀者将會了解到有很多工具都可以用來幫助自己挖掘常見的漏洞,但是,針對固件二進制鏡像的安全性分析仍需要大量的手工分析。
在我們開始固件分析之前,重要的是讨論固件提取的通用方法,以及分析勾勒出哪些資料較為重要。在之前介紹的輕量級固件威脅模組化演練過程中,這一内容已經讨論過了,但是這裡我們依然從讨論固件分析的目标開始接下來的内容。
3.2 固件分析方法
固件是控制IoT裝置的核心,這也是我們在分析IoT裝置的其他元件之前,希望從固件分析開始的原因。根據IoT裝置所面向的行業,提取固件鏡像并且對其内容進行反彙編的過程可能非常簡單。與之類似,對于某些行業的垂直細分領域而言,其采取了專用保護措施,而這些保護措施可能會導緻逆向分析過程更加困難或更加耗時。盡管如此,固件分析時還是存在一些通用模式的。通常,測試人員在固件分析時最關注的内容主要包括:
- 密碼。
- API Token。
- API Endpoint(URL)。
- 存在漏洞的服務。
- 後門賬戶。
- 配置檔案。
- 源代碼。
- 私鑰。
- 資料的存儲方式。
在後面的章節中,進行固件分析時我們也會重點關注這些内容。本節将向讀者概要介紹固件正向分析與逆向分析的方法。
下面列出了IoT固件分析時所用到的基本方法:
1)固件提取。
2)固件分析。
3)檔案系統提取。
4)檔案系統加載。
5)檔案系統分析。
6)基于固件仿真的動态分析。
3.3 固件提取
在對固件内容進行分析前,我們首先需要擷取固件的二進制檔案。本節将會對目标裝置固件提取所涉及的各種技術進行介紹。
3.3.1 準備工作
提取固件的過程中我們會用到多個工具。由于Kali Linux中已經預設安裝了所需要的大多數工具,是以在這裡将主要使用Kali Linux系統。下面是需要用到的工具:
- Kali Linux:Kali Linux可以從網站 https://www.kali.org/downloads/ 直接下載下傳。如果讀者使用VMware或者VirtualBox虛拟機,那麼建議從連結 https://www.offensive-security.com/kali-linux-vmware-virtualbox-imagedownload/ 下載下傳Kali的虛拟鏡像。
- Ettercap:雖然Kali Linux中已經預設安裝了Ettercap,但是也可以從連結 https://ettercap.github.io/ettercap/downloads.html 下載下傳。
- Wireshark:Wireshark也預設包含在Kali Linux中,也可以從連結 http://www.wire-shark.org
- SSLstrip:Kali Linux中已經預設安裝了SSLstrip,也可以從連結 https://github.com/moxie0/sslstrip
- Flashrom:Kali Linux中并未預設安裝Flashrom,但是可以執行以下指令友善地安裝該工具:
帶你讀《物聯網滲透測試》之三:固件分析與漏洞利用第3章
此外,還可以通過連結
https://www.flashrom.org/Downloads下載下傳Flashrom。
3.3.2 測試流程
目前,從IoT裝置中提取固件的方法有很多。我們将在本節中對其中的大部分方法進行介紹。固件鏡像的擷取方法主要包括:
- 從廠商網站下載下傳。
- 代理或鏡像裝置更新時的流量。
- 直接從裝置轉儲固件。
- 通過Google搜尋引擎搜尋/科研管道。
- 反編譯與之相關的移動應用。
1.從廠商網站下載下傳
擷取固件最簡單的方法就是從廠商網站下載下傳固件。
圖3-1~圖3-5中的截圖展示了如何從廠商網站擷取固件:
1)進入目标廠商的網站。
2)在搜尋欄中輸入目标裝置,如圖3-1所示。
3)選擇Support頁籤,如圖3-2所示。
4)單擊Drivers&Tools按鈕,如圖3-3所示。
5)單擊下載下傳連結,如圖3-4所示。
6)使用者也可以選擇Copy Link Address,在測試主機上直接執行wget(wget
http://URL.com)指令進行檔案下載下傳,如圖3-5所示。
2.代理或鏡像裝置更新時的流量
有時候廠商網站可能并不支援固件下載下傳,此時讀者可以選擇第2種方法(即在裝置固件更新過程中,代理轉發裝置更新時的流量),或者選擇第3種方法(直接從裝置轉儲固件)。為了在裝置更新過程中實作對固件更新流量的代理轉發,讀者必須在更新期間實施中間人(Man-In-The-Middile,MITM)攻擊或者鏡像裝置流量。或者,讀者也可以代理轉發Web或移動應用的流量,從中提取出固件下載下傳的URL位址。
衆所周知,廠商會對固件下載下傳請求中的user-agent字段進行驗證,是以讀者可能還需要調整資料包首部中的user-agent字段。以下是針對IoT裝置實施MITM攻擊進而監控裝置流量的基本步驟,用到的工具包括Kali Linux、Ettercap、Wireshark和SSLstrip。其中Kali Linux中已經安裝了本節中需要用到的所有工具。
目前有多種方法和工具可以對目标裝置發起MITM攻擊,進而實作流量轉發。下面介紹的就是其中一種捕獲裝置流量的方法。
1)啟用IP轉發功能:
2)配置iptables,将目的端口80的流量重定向至SSLstrip監聽的端口10000。
3)啟動SSLstrip:
4)啟動Ettercap GUI:
5)圖3-6展示了上述操作的運作結果。
6)單擊菜單欄中的Sniff菜單,再單擊Unified sniffing選項,如圖3-7所示。
7)選擇所要監聽的網卡,如圖3-8所示。
8)選擇Scan for hosts選項,如圖3-9所示。
9)此時即啟動Wireshark程式,可以看到部分接口有流量通過,如圖3-10所示。
10)單擊Start capturing packets按鈕開始捕獲目标裝置的網絡流量,如圖3-11所示。
11)根據實際需求過濾出所關注的網絡封包。在本例中,目标裝置的IP位址為192.168.1.137,如圖3-12所示。
3.直接從裝置轉儲固件
如果通過廠商網站或者流量代理的方法均無法擷取固件,還可以嘗試通過UART、SPI或者JTAG接口直接轉儲固件。直接進行固件轉儲需要拿到實體裝置,并拆解裝置找到其中的閃存晶片。找到閃存晶片之後,讀者可以直接通過UART接口也可以使用SOIC8測試夾來連接配接晶片進而轉儲固件,其中用到了工具Flashrom以及支援SPI的硬體開發闆,例如Shikra。圖3-13展示了如何使用SOIC測試夾和Shikra連接配接裝置。
将固件内容轉儲為bin檔案的指令如下所示:
使用Flashrom或者前面介紹的某種方法提取到了裝置固件之後,分析人員就可以開始對固件的二進制檔案進行分析了。
4. Google搜尋
如果出于某些原因,我們難以借助前面介紹的方法提取出固件鏡像,那麼最後的選擇就是求助于Google搜尋。可以直接在Google中輸入想要查找的固件名稱,搜尋是否存在目标固件的下載下傳連結,也可以搜尋一下其他人的工作成果,看看是否已經有人對該裝置的固件進行了研究。此外,裝置廠商在崗或者離職的從業人員也可能會将固件檔案上傳到其個人的存儲空間或Web伺服器上。無論哪種情況,都可以使用Google dorking技術縮小指定目标裝置的搜尋範圍。我們還可以通過連結
https://www.exploit-db.com/google-hacking-database利用Google Hacking資料庫來搜尋固件或裝置。
3.3.3 測試分析
在本節中,我們簡要介紹了如何通過廠商站點、部署MITM測試環境捕獲裝置流量、直接從裝置轉儲固件以及Google搜尋等方法來擷取固件。現在,我們來解釋下為什麼需要通過這些方法擷取固件,難道不是直接從廠商網站下載下傳就行了嗎?
當從廠商網站下載下傳固件時,通常情況下,使用者可以通過廠商提供的服務連結、檔案共享或社群論壇下載下傳到需要的固件。但有時廠商在下載下傳固件前要求使用者提供密碼,或者将固件打包為需要密碼才能解壓的ZIP檔案。如果碰到了這種情況,為了節省時間我們就可以直接采用其他方法擷取固件。
接下來,我們簡要介紹了如何使用Kali Linux、SSLstrip、Ettercap和Wireshark搭建MITM測試環境,以在裝置更新期間捕獲裝置流量。
3.4 固件分析
一旦我們提取到了固件,接下來的主要工作就是對固件進行分析。其中涉及如何深入固件内部,發現盡可能多的安全隐患,這也正是本節中我們所要做的主要工作。
3.4.1 準備工作
在本節中,我們将會了解提取出固件二進制檔案後如何開展固件分析。在這一過程中,有多種固件分析方法供我們選擇,幫助我們找到固件中的安全隐患。
正如前面提過的,固件中包含了很多滲透測試人員感興趣的内容,如API key、私有證書、寫死的認證資訊以及後門等。
3.4.2 測試流程
為了分析固件,我們将對其逆向以檢視其内部元件。固件中的内部元件包括boot-loader、核心、檔案系統以及其他内容。其中我們最感興趣的是檔案系統,因為檔案系統中儲存了我們需要的所有資訊。顯然,讀者也可以分析bootloader并檢視其中包含的内容,還可以篡改固件并建構新的固件(我們将在接下來的章節中讨論),但是現在我們隻關心如何對固件進行逆向分析以及從中提取出檔案系統。
正如之前已經介紹過的,固件是一個二進制檔案壓縮包,而檔案系統隻是其中的一個元件,存儲在二進制檔案的特定偏移位址中,且具有一定的尺寸。然而,此時我們還不知道關于固件中檔案系統的任何資訊,包括其偏移量和尺寸。為了找到這些資訊,需要使用hexdump和grep等工具來搜尋我們所關注内容的特征資訊。下面以Squashfs檔案系統為例進行介紹:
1)如果想要查找Squashfs檔案系統,可以使用grep指令在hexdump的執行結果中查找“hsqs”字元串,如圖3-14所示。
2)讀者可以看到,我們在位址0x000e20c0處發現了Squashfs檔案系統。獲得了這些資訊之後,就可以使用dd指令将從該位址開始到檔案末尾的内容全部轉儲下來,如圖3-15所示。
3)一旦獲得了從固件二進制檔案中截取出來的Squashfs檔案系統,就可以運作unsquashfs等指令來檢視整個檔案系統,這一過程非常簡單。
接下來使用unsquashfs指令來看一下我們是否能夠提取出整個檔案系統,如圖3-16所示。
4)正如在前面的截圖中所看到的,我們提取出了Squashfs檔案系統鏡像。讀者可以忽略圖3-16中的警告和錯誤,這隻是在提示我們沒有以root使用者權限運作該指令。一旦我們提取出了檔案系統,就可以浏覽檔案系統中的各個目錄,對其中的各個檔案分别進行分析來挖掘漏洞。圖3-17是對整個檔案系統目錄的截圖。
上面就是對固件進行逆向分析并從固件二進制鏡像中提取檔案系統的方法。我們還可以采用Binwalk等工具自動執行前面的所有操作。Binwalk由Craig Heffner開發,借助Binwalk我們隻需要一條指令就能夠從固件二進制鏡像中提取檔案系統。
5)為了安裝Binwalk,首先需要從位于
https://github.com/devttys0/binwalk.git的Git-Hub 代碼庫中克隆Binwalk代碼,指令如下:
6)然後運作./deps.sh指令安裝Binwalk需要的所有依賴檔案和二進制檔案。
7)Binwalk安裝成功後,讀者可以在指令行中敲入Binwalk指令并按Enter鍵來确認安裝是否成功。如果安裝成功,此時指令行視窗會顯示出Binwalk的幫助菜單,如圖3-18所示。
8)下面我們使用Binwalk指令從相同的固件中提取出檔案系統。這裡在執行提取操作時将用到-e參數:
9)接下來視窗中會顯示出固件中的所有分段,并提取出固件内容,如圖3-19所示。
10)參數-t和-vv可以采用可讀性更強以及更加詳細的方式列印出指令執行結果。Binwalk執行完畢之後,會生成名為_[firmwarename].extracted的檔案夾,該檔案夾中儲存了Binwalk提取出的整個檔案系統,如圖3-20所示。
以上就是采用手工和自動兩種方式從固件的二進制檔案中提取檔案系統的過程。
3.4.3 測試分析
本例中的檔案系統提取方法同我們之前采用的方法相同,均是首先使用magic位元組以及首部特征字元串(例如Squashfs檔案系統中的sqsh字元串等)檢測檔案系統以及其他元件的偏移。在下面的URL連結中可以檢視Binwalk所能識别的檔案系統類型:
https://github.com/devttys0/binwalk/blob/62e9caa164305a18d7d1f037ab27d14ac933d3cf/src/binwalk/magic/filesystems。
讀者還可以在Binwalk中手工添加更多特征,然後重新編譯Binwalk源代碼,進而實作對其他檔案系統的識别。
3.4.4 拓展學習
除了提取檔案系統,讀者還可以使用Binwalk進行一系列其他操作,例如針對某個特定固件鏡像進行熵分析,該操作能夠幫助讀者判斷固件鏡像是否進行了壓縮或者加密。熵分析需要在運作Binwalk時帶上-E參數,之後再跟固件名,操作指令如圖3-21所示。
從上面的截圖中可以看出,該固件并未加密,因為加密的固件鏡像熵值會出現大幅波動。
3.4.5 延伸閱讀
想了解更多關于固件分析與逆向分析的内容,可以通路Binwalk開發者Craig Heffner的部落格。讀者可以從博文中了解到不同的固件鏡像會如何變化,以及可能存在哪些漏洞。Craig Heffner的部落格連結為
http://www.devttys0.com/3.5 檔案系統分析
現在我們已經知道如何逆向固件并從中提取出檔案系統了,在本節中将關注檔案系統中的内容并對其開展漏洞分析。這部分内容能夠幫助讀者更加深入地了解如何從固件鏡像中挖掘漏洞并加以利用,進而入侵IoT裝置。
3.5.1 準備工作
針對檔案系統内容的分析主要包括兩種方法:
- 手工分析。
- 自動化工具和腳本。
1.手工分析
采用手工方法挖掘固件檔案系統漏洞時,需要對檔案系統中的各個檔案與檔案夾進行分析。分析内容包括檢視配置檔案、Web目錄、密碼檔案以及查找後門等。手工分析方法是在指定固件中挖掘漏洞的理想方法,本節我們也将主要關注這種方法。
2.自動化工具和腳本
本書出版時,除了部分自動化分析腳本,尚沒有一套完整的架構或者工具能夠幫助我們挖掘固件漏洞。是以,如果讀者對Web應用安全或者網絡安全比較熟悉,那麼應該了解目前在固件安全分析領域也沒有類似于Arachni、w3af、Metasploit之類的工具。
3.5.2 測試流程
我們首先從固件分析開始,看看是否能夠發現敏感資訊或者後門。
在這個練習中我們使用的是路由器D-Link DWR 932B的固件,版本号為DWR-932_fw_revB_2_02_eu_en_20150709。安全研究員Gianni Carabelli和Pierre Kim已經在這款固件中挖掘出了漏洞:
1)第一步是從固件中提取檔案系統。但是,本例中的固件為經過加密的ZIP檔案。是以,在本例中首先使用fcrackzip工具進行密碼破解,破解出的密碼是beUT9Z。運作結果如圖3-22所示。
2)擷取了固件鏡像之後,可以采用Binwalk從固件的ZIP檔案中提取出yaffs2格式的檔案系統。接下來,讀者可以使用針對yaffs2格式的工具解壓檔案系統,也可以直接通過Binwalk來完成提取工作。
3)在yaffs2-root檔案夾中,我們提取得到了完整的檔案系統,如圖3-23所示。
4)從這裡開始,我們開始周遊檔案系統中不同的目錄,并從安全視角查找其中可能存在漏洞的檔案。我們需要做的第一件事是查找所有配置檔案,這可以通過運作find指令查找所有字尾為.conf的檔案來實作,搜尋結果如圖3-24所示。
5)接着檢視配置檔案的内容。舉個例子,圖3-25所示為配置檔案wpa-supplicant.conf中的内容。
6)接下來檢視其他配置檔案,例如inadyn-mt.conf,如圖3-26所示。
出乎意料的是,該檔案中包含了大量敏感資訊,而這些資訊本不應該被其他人通路到。正如我們在前面的截圖中看到的,檔案inadyn-mt.conf中存儲了路由器的no-IP配置資訊,包括用于通路網站
https://www.no-ip.com的使用者名和密碼。
這就是我們在固件中查找隐藏敏感資訊的方法。顯然,讀者可以在固件的檔案系統中進行更加全面的查找,進而發現更多的敏感資訊。
現在我們已經知道了如何對固件進行手工分析,接下來将介紹如何采用自動化的方式來挖掘漏洞。為此,我們将用到Craig Smith開發的工具Firmwalker,該工具通過靜态分析來識别固件中可能包含的常見敏感資訊。
1)克隆GitHub代碼庫中的Firmwalker代碼并完成部署,指令如下:
2)Firmwalker代碼庫克隆完成後,我們以提取出的檔案系統位置為參數,運作./firm-walker.sh腳本:
3)Firmwalker腳本能夠識别出多種敏感資訊,包括二進制檔案、證書、IP位址、私鑰等,同時将輸出結果都儲存在firmwalker.txt檔案之中(使用者也可指定存儲檔案)。如圖3-27所示。
拿到Firmwalker生成的報告之後,我們就可以分别檢視報告中所列出的各個檔案并對其開展進一步分析了。在某些情況下,讀者還需要對基于ARM和MIPS架構的二進制檔案進行逆向分析,以便更好地了解檔案執行流程進而挖掘出漏洞。
3.5.3 測試分析
分析并了解檔案系統及其中的内容取決于攻擊者的手工分析技巧。而這正是能否挖掘出漏洞的關鍵。即使采用了各種自動化工具,讀者也會意識到分析過程最終都會轉化為針對二進制檔案的手工分析與漏洞挖掘。
3.5.4 拓展學習
為了更加深入地對固件的檔案系統開展分析,讀者還可以使用諸如firmware diffing之類的技術,即将固件同之前的固件版本進行比較,進而查找出兩者之間的差異。通過比較,讀者能夠了解新版本中所做的安全修複和改動,甚至發現之前版本中未公開的安全漏洞。
我們還可以基于固件檔案系統開展另一項工作,就是檢視系統使用的庫檔案群組件,并判斷這些元件是否是早期存在漏洞的版本。
3.5.5 延伸閱讀
在分析固件檔案系統中的内容時,最好多了解一些關于二進制分析和逆向分析的相關知識,并且熟悉Linux二進制檔案分析、調試以及針對ARM和MIPS等平台的反彙編技術。
3.6 基于固件仿真的動态分析
通常,開展IoT裝置分析會受到這樣或那樣的限制,其中一個就是我們難以在沒有實體裝置的情況下開展大量測試并進行漏洞利用。但是在本節中,我們将讨論固件仿真方法,讀者可以同仿真裝置進行互動,就如同和網絡中的實體裝置互動一樣。
3.6.1 準備工作
為了進行固件仿真,我們将用到由本書作者開發的腳本Firmware Analysis Toolkit(FAT)。FAT采用Firmadyne工具實作固件鏡像的仿真。
Firmadyne工具底層基于QEMU虛拟機,這使得使用者能夠對整個系統架構進行仿真并在該架構之上運作固件,其中還用到了工具開發者編寫的其他腳本,例如NVRAM仿真器,該仿真器可以從位址
https://github.com/firmadyne/libnvram下載下傳。同時還使用了類似于Binwalk之類的工具,在前面的章節中我們對Binwalk已經進行了介紹,借助該工具能夠從固件中提取出檔案系統,繼而開展固件仿真。
接下來從GitHub中克隆FAT的代碼庫,并部署固件仿真實驗環境。我們強烈建議讀者在Ubuntu系統上進行操作,這樣可以避免在仿真過程中出現各種奇奇怪怪的問題。
3.6.2 測試流程
固件仿真步驟如下:
1)從連結
https://github.com/attify/firmware-analysis-toolkit/處克隆FAT代碼庫,然後安裝:
安裝過程中将為Firmadyne建立資料庫,将關于固件的資訊存儲起來并進行管理。資料庫密碼預設設定為firmadyne。
全部設定完畢之後,下一步就是選擇固件并對其進行仿真,下面來看看我們能夠針對仿真固件開展哪些工作。
在本節練習中,我們将以D-Link固件DWP2360b為例進行示範,D-Link公司出品的PoE供電無線接入點采用了該固件。
2)此時,我們要做的第一件事就是運作./fat.py,該腳本運作後會請求使用者輸入固件名稱和固件鏡像的品牌。輸入固件鏡像品牌的作用主要在于建立資料庫,這樣我們就可以在需要時搜尋資料庫,檢視我們已經對哪些品牌的固件進行了仿真。運作後的執行結果如圖3-28所示。
3)接下來工具會多次請求使用者輸入資料庫的密碼,在本例中我們将密碼設定為fir-madyne。程式完成初始化、鏡像建立、網絡配置并配置設定IP位址之後,FAT将會在指令行視窗中顯示其IP位址,并提示使用者已經完成了固件仿真,如圖3-29所示。
4)獲得了IP位址之後,我們就可以在浏覽器中輸入該IP位址,之後就可以打開仿真路由器的登入頁面了,本例中裝置的登入頁面如圖3-30所示。
以上就是在沒有實體裝置的情況下如何借助FAT實作固件仿真的過程。
3.6.3 測試分析
前面的仿真實驗主要基于QEMU和NVRAM仿真器。NVRAM是非易失性随機通路存儲器,固件能夠通路該存儲器擷取裝置資訊。然而,由于沒有實體裝置,固件需要通路該存儲器時就會導緻服務運作出錯或崩潰,而這正是NVRAM仿真器發揮作用的地方。使用Firmadyne工具集還能對固件進行修改,以便讓使用者通路Console口以進行調試。
以下是FAT腳本能夠執行的操作:
1)從固件中提取檔案系統。
2)擷取固件架構。
3)制作所需的鏡像。
4)網絡設定。
5)鏡像仿真。
上述所有操作均可手工完成,但是利用FAT之類的腳本可以幫助我們快速完成操作。
3.6.4 拓展學習
另一種仿真方法是手工下載下傳目标架構的Debian鏡像檔案,然後将鏡像檔案從固件中複制到新建立的Debian執行個體中,再使用chroot指令運作Web伺服器(或是其他需要測試的元件)。讀者可以從連結
https://people.debian.org/~aurel32/qemu/下載下傳最新的Debian鏡像。
3.7 ARM與MIPS架構下二進制檔案的分析入門
現在我們知道了如何進行固件仿真并開展基本的分析,但是讀者會發現在現實工作中經常會遇到不同架構的二進制檔案,對此需要開展進一步分析。由于我們難以在一本書中涵蓋嵌入式裝置用到的所有架構,是以在這裡我們主要關注兩款流行架構—ARM和MIPS。
然而,在這裡我們将隻介紹針對MIPS架構下的漏洞利用,并對ARM架構下的二進制檔案逆向分析進行簡單介紹。從漏洞利用的角度來看,ARM架構和MIPS架構非常相似,隻要分析其中一個架構同樣也有助于讀者了解其他架構。
3.7.1 準備工作
現在開始我們的二進制分析之旅,首先從基本分析開始,看看如何從D-Link固件中發現後門。這個後門是由Pierre Kim首先發現的。為了驗證這個後門的存在,要求讀者對基于ARM架構的二進制檔案逆向分析具備一定的基礎。盡管我們不會深入分析寄存器和架構(因為我們将在MIPS架構中介紹這些内容),但是本節内容将幫助讀者了解二進制檔案的分析過程以及如何發現較為簡單的漏洞。
本例中我們将要使用的固件是D-Link裝置的固件DWR 932B。使用Binwalk提取出固件後,可以注意到其中包含一個名為appmgr的二進制檔案,這正是我們感興趣的檔案。
在分析過程中,我們可以使用讀者熟悉的所有反彙編工具,例如Radare2、IDA、Hopper等。本例中我們使用Hopper來對二進制檔案appmgr進行逆向分析,這是一個基于ARM架構的小端序(Little Endian)二進制檔案。
3.7.2 測試流程
可以使用Hopper的僞代碼生成功能來更好地了解二進制檔案。步驟如下:
1)在Hopper中加載目标二進制檔案進行分析,如圖3-31所示。
2)檔案加載成功後,搜尋telnet字元串,然後就可以看到telnet字元串在樣本代碼中的位置,如圖3-32所示。
3)為了找到該字元串的調用位置,可以右鍵單擊該字元串并選擇References to address選項,然後将展示出字元串的調用位置和調用指令。在本例中,如果執行References to address操作,我們會發現調用該字元串的記憶體位址為0x13048,如圖3-33所示。
4)輕按兩下該記憶體位址跳轉到引用該字元串的位址,在本例中即0x13048位址處。跳轉到該位址之後,就可以看到所有的反彙編代碼了,單擊Pseudo-code mode按鈕會生成僞代碼,如圖3-34所示。
5)僞代碼生成功能對于我們的分析工作而言非常有用,因為如果使用者對反彙編不是太熟悉的話,借助僞代碼就可以把一段反彙編指令看作一個邏輯上相對獨立完整的程式,這樣了解起來更為容易。本例中的僞代碼如圖3-35所示。
正如我們從前面的截圖中看到的那樣,程式調用了strncmp函數,參數為字元串HELODBG 。我們知道,strncmp函數用于字元串比較,在本例中的作用是在運作Telnet前對二進制檔案的輸入字元串進行檢查,上述操作在圖3-35中以高亮方框的形式進行了标記。
是以我們可以肯定,appmgr檔案中存在後門,程式查找字元串HELODBG,一旦接收到該字元串,它就會使用bin/sh shell啟動Telnet服務。
上面的内容就是我們對ARM架構下二進制檔案進行的分析,所采用的方法也是對二進制檔案進行分析以查找敏感資訊、挖掘漏洞與後門的基本方法。
3.7.3 拓展學習
既然讀者已經知道了對ARM架構二進制檔案開展分析的基本方法,我們建議對ARM彙編語言以及架構進行更加深入的了解。對彙編指令和底層架構的了解能夠幫助讀者更好地了解反彙編代碼,即使在不借助僞代碼的情況下也能夠開展二進制檔案的分析。
3.8 MIPS架構下的漏洞利用
現在我們已經掌握了逆向二進制檔案的基本方法,那麼是時候深入了解如何對IoT裝置所采用的主要平台架構開展漏洞利用了。由于本節内容隻是幫助讀者了解二進制檔案漏洞利用的基礎知識,是以在這裡我們隻關注MIPS架構,但是強烈建議讀者采用相同的方法自行針對基于ARM的架構開展漏洞利用練習。
3.8.1 準備工作
為了開展MIPS架構下的漏洞利用,在這裡我們主要使用QEMU仿真器和chroot指令,這些内容我們在本章開頭已經進行了簡要介紹。現在将研究如何在MIPS二進制檔案中進行緩沖區溢出漏洞利用,并改變程式的執行流程使其跳轉到我們想要執行的内容,而不是程式原本應該執行的代碼。為了簡化漏洞利用過程,在這裡我們不會涉及諸如面向傳回的程式設計(Return Oriented Programming,ROP)之類的内容,這樣可以使利用過程盡量簡單一些。
3.8.2 測試流程
在這個練習中需要用到以下工具:
- 路由器漏洞攻防演練靶機(Damn Vulnerable Router Firmware,DVRF)—該靶機可以從GitHub下載下傳
- GDB-Multiarch
- GDB Enhanced Features(GEF腳本)
- QEMU
- chroot
- IDA Pro/Radare2(可選)
下面我們将對上述工具及其安裝部署方式進行逐一介紹。首先從下面的URL連結下載下傳DVRF固件:
https://github.com/praetorian-inc/DVRF/tree/master/FirmwareDVRF是由b1ack0wl專門為MIPS平台開發的固件。盡管該固件原本用于Linksys E1550裝置,但其也可以在基于QEMU的仿真環境中運作,我們随後開展的漏洞利用也在該環境中加以示範:
1)現在我們已經拿到了固件,為了便于漏洞利用過程中的調試,接下來安裝GDB(GNU調試器)和GEF:
同時還要確定已經在系統中安裝了所需的QEMU軟體包。現在我們已經準備就緒了,接下來利用QEMU提供的二進制仿真功能運作其中的二進制檔案。
2)仿真之前,首先需要使用Binwalk工具從固件中提取出檔案系統,操作指令如圖3-36所示。
3)提取出檔案系統後,就可以将對應架構下的QEMU二進制檔案複制到檔案系統的根目錄下,在本例中是squashfs-root檔案夾,如圖3-37所示。但是在此之前需要确認目标二進制檔案是基于MIPS架構的,通過readelf指令可以檢視目标二進制檔案的架構資訊。
4)根據圖3-37所示,目标二進制檔案需要運作在小端的MIPS架構上,如圖3-38所示。
5)此時将針對小端MIPS(mipsel)架構的QEMU二進制檔案複制到squashfs-root檔案夾下:
6)将qemu-mipsel-static檔案複制到目前檔案夾下後,再使用chroot指令和QEMU虛拟機仿真運作目标二進制檔案,同時使二進制檔案認為其根目錄就是目前我們執行指令的目錄。上述操作指令如下:
7)運作結果如圖3-39所示,即使某個二進制檔案最初是針對其他架構開發的,我們依然能夠運作該檔案。基于QEMU虛拟機對目标系統的仿真,再通過chroot指令對根目錄進行調整,上述操作是可能實作的。
8)正如我們在指令輸出結果所看到的那樣(如圖3-39所示),該二進制檔案在運作時需要輸入參數。此外,如果我們檢視目标二進制檔案的源代碼,會發現該檔案存在棧溢出漏洞。圖3-40是二進制檔案stack_bof_01的源代碼。
從源代碼中不難發現,變量buf在棧中的緩沖區容易遭受緩沖區溢出攻擊,而實施溢出攻擊的目的則在于修改程式執行流程,使其指向dat_shell的位址,這樣我們就可以利用該漏洞來獲得shell。
9)現在開始調試程式,運作QEMU和chroot指令,運作chroot指令時使用參數-g把調試器GDB附加到程序之上:
10)如圖3-41所示,此時程式暫停執行,等待調試器的連接配接。
11)程式暫停運作後,我們即可以啟動GDB調試器,使用之前配置設定的端口連接配接目标程序進行遠端調試。另外我們還需要将架構設定為MIPS以確定能夠正确地反彙編二進制檔案,如圖3-42所示。
12)當我們連接配接上目标程序時,會發現程序已經暫停,此時可以輸入字元c讓程序繼續執行。
13)我們還可以輸入info functions指令在螢幕上列印出二進制檔案中可用函數的清單,如圖3-43所示,這樣可以幫助分析人員從滲透測試的角度查找可能存在漏洞的函數。
14)接下來輸入disass main指令反彙編main函數檢視函數内部結構。
15)disass main指令的執行結果如圖3-44所示,此時得到main函數的反彙編代碼。
如果讀者熟悉反彙編結果中的某些指令,會發現這些指令非常有用。反彙編結果中依次訓示了指令位址、指令和操作數。
MIPS架構中共包含32個通用寄存器,分别是$zero、$at、$v0~$v1、$a0~$a3、$t0~$t9、$s0~$s7、$k0、$k1、$gp、$sp、$fp和$ra。在這些寄存器中,$a0~$a3寄存器的作用是存放函數參數,$t0~$t9寄存器用于臨時資料存儲,$gp寄存器存放全局指針(在利用過程中盡量不要修改$gp寄存器的值),$sp寄存器存放棧指針,$fp寄存器存放幀指針,$ra寄存器存放傳回位址。另外還有一個專用寄存器即程式計數器(Program Counter, PC),其作用是存儲下一條指令的記憶體位址,也就是目前正在執行指令的下一條指令。
為了控制基于MIPS架構的二進制代碼執行流程,我們主要關注2個寄存器,即RA寄存器和PC寄存器。在處理MIPS架構下的二進制檔案時,讀者可能已經意識到相對于RA寄存器而言,控制PC寄存器中的内容更加複雜。是以,為了簡單起見,在本練習中我們将主要關注如何控制RA寄存器中的内容。
16)由于我們已經知道了目前分析的二進制檔案stack_bof_01中存在棧溢出漏洞,是以在程式運作時可以嘗試帶上一個非常長的參數。我們将使用GEF的模式字元串建立功能生成該參數,運作結果如圖3-45所示。
17)生成了測試用的模式字元串後,我們就可以将其作為程式stack_bof_01的參數運作程式,看看執行過程中是否會導緻RA寄存器溢出。本例中,我們使用GEF生成了300個字元長的字元串,以該字元串為參數,程式stack_bof_01後的執行情況如圖3-46所示。
18)正如我們所預期的一樣,由于在指令中使用了-g參數,指令執行後二進制檔案處于暫停狀态,等待調試器附加進來。現在打開GEF終端視窗敲入target指令,指令執行結果如圖3-47所示。
19)使用target指令完成遠端主機IP與端口的設定後,我們輸入指令c,程式将繼續執行直到出現以下三種情況之一,即運作完成、命中斷點或者出現異常。本例中,程式在執行過程中出現了SIGSEGV錯誤,如圖3-48所示。
GEF還顯示出了捕獲異常時棧和寄存器的全部狀态。在本例中,我們可以看到RA寄存器中的值被覆寫為0x63616162,這正是字元串baac的十六進制形式。
了解了上述資訊後,可以使用模式搜尋功能找到覆寫RA寄存器的位元組的偏移。取得了偏移之後,我們就找到了放置惡意位址的位置,進而能夠控制程式的執行流程。
20)我們可以使用指令pattern search RA-overflown-bytes-in-hex實作模式字元串的搜尋工作,搜尋指令如圖3-49所示。
根據指令執行結果,我們找到了導緻寄存器RA溢出的字元串的偏移,在本例中該偏移為204。這意味着通路到RA寄存器之前需要填充204位元組的垃圾位元組,而接下來的4個位元組就是填充RA寄存器的值。
21)如果讀者還記得本次練習的目的在于更改程式的執行流程,并調用在程式正常流程中原本不會調用的dat_shell函數,那麼下一步工作就是确定dat_shell函數的位址。為了找到dat_shell函數的位址,我們要麼列印出dat_shell函數的位址,要麼通過反彙編查找dat_shell函數的起始位址。這可以通過指令disass function-name來完成,執行結果如圖3-50所示。
從在上面的截圖中我們可以看到,dat_shell函數的起始位址為0x00400950。然而,前3條指令中用到了全局指針(GP寄存器),而我們并不希望在這個時候使用該指針,這就是我們跳轉到0x0040095c而不是0x00400950的原因。
22)接下來在位址0x0040095c後填充204個垃圾字元後,繼續運作二進制檔案,這次我們去掉了參數-g,執行如下指令:
在圖3-51中可見,二進制檔案現在已經執行了我們想要執行的dat_shell函數。上述内容就是如何在MIPS架構下開展棧溢出漏洞利用的過程。
3.8.3 測試分析
緩沖區溢出漏洞的基本思路是在緩沖區中放入超過程式預期長度的字元串,這樣就可以控制棧中的寄存器。而控制了棧中的寄存器就可以跳轉到shellcode的位置或系統的libc庫來執行其他載荷。
3.8.4 拓展學習
盡管在實驗環境中我們成功對存在漏洞的二進制檔案實作了漏洞利用,但通常在現實情況中遇到的場景更為複雜。其中一種情況是我們希望利用的函數在現實二進制檔案中卻并不存在,此時攻擊者就需要跳轉到system函數來執行bin/sh,或者建立ROP鍊執行自己的shellcode。
3.9 使用firmware-mod-kit(FMK)在固件中添加後門
在漏洞利用過程中,經常需要用到的一種方法就是篡改固件。也就是從固件中提取檔案系統,對其内容進行修改,然後再将其重新打包成新的固件,随後攻擊者可以将這個新打包的固件刷進裝置。
3.9.1 準備工作
固件篡改的過程會用到工具FMK,該工具由Jeremy Collake和Craig Heffner開發。FMK不僅可以利用Binwalk或其他工具從固件中提取出檔案系統,還具有将篡改後的檔案系統重新打包成新固件的功能。
FMK可以從
https://github.com/brianpow/firmware-mod-kit/下載下傳,如果讀者之前從GitHub中克隆了FAT代碼,那麼該工具應該已經存在于讀者的系統中了。下載下傳完該工具後,接下來我們就可以找一個固件一試身手了。出于簡單起見,同時讓本書的讀者在無須投入資金購買硬體的情況下也能夠複現以下步驟,我們主要以能夠采用FAT進行仿真的固件為例進行介紹。
3.9.2 測試流程
篡改固件的步驟如下:
1)在本例中我們使用的固件來自D-Link DIR-300路由器。在這裡我們使用FMK目錄下的extract-firmware.sh腳本從固件中提取檔案系統,而未使用Binwalk。操作指令如圖3-52所示。
xt-align:center">
提取出固件後,腳本會生成一個新目錄,其中包括rootfs、image_part和logs等檔案夾。由于攻擊者的目的大多是添加後門和修改固件,是以這裡我們隻關心rootfs檔案夾。
rootfs檔案夾中包含了固件中的整套檔案系統。而我們所要做的工作就是在固件中添加後門,然後找到固件啟動後自動調用後門的方法。
2)首先檢視固件所基于的架構。對固件中任一檔案執行readelf指令就可以檢視其架構,以BusyBox檔案為例,指令執行結果如圖3-53所示。
3)正如我們從圖3-53中看到的,固件是基于MIPS小端架構的。這意味着我們需要開發符合MIPS小端架構的後門并進行編譯。下面是我們将要使用的後門源碼,該後門由Osanda Malith開發編寫:
代碼寫好後,我們就可以使用針對MIPSEL架構的Buildroot,并使用該Buildroot建構的交叉編譯器編譯代碼。這裡不對安裝配置Buildroot的過程進行過多介紹,因為這個過程非常簡單,并且在Buildroot的說明文檔中已經進行了詳細說明。
4)為MIPSEL架建構立了交叉編譯器後,我們接下來将bindshell.c編譯為能夠植入檔案系統的二進制檔案bindshell:
下一步是在檔案系統中尋找可以放置該二進制檔案的地方,以及如何在啟動過程中将其設定為自啟動。這裡我們的思路是分析在啟動過程中自動調用的腳本,看看是否能夠實作自啟動。
5)在檔案系統中,我們可以在etc/templates/目錄中放入後門的二進制檔案,然後在system.sh腳本中調用該二進制檔案,其中system.sh腳本位于/etc/scripts/目錄下,腳本編寫如圖3-54所示。
6)接下來使用build-firmware.sh腳本将修改後的檔案系統重新打包為新的固件,打包過程如圖3-55所示。
執行完成後,會在目錄firmware-name/中生成新的固件,新固件名為new-firmware.bin。
7)此時就建立完成了新的固件鏡像,我們可以将新固件複制到FAT目錄中,并通過仿真來驗證新添加的後門是否能夠正常運作。這裡同之前固件仿真的步驟相同。操作步驟如圖3-56所示。
如圖3-56所示,固件仿真時獲得的IP位址為192.168.0.1,此時可以嘗試通路該位址。但我們更關注在固件中添加的後門bindshell是否已經成功啟動。
8)現在嘗試運作Netcat連接配接目标IP的9999端口,檢查後門是否成功啟動,如圖3-57所示。
根據執行結果,可以看到我們已經對固件進行了修改并成功植入了後門,是以此時成功獲得了裝置中具有root權限的shell。而獲得擁有root權限的shell之後,使用者還可以修改裝置的其他配置,或者将其作為跳闆遠端通路其他植入惡意固件的裝置。
3.9.3 測試分析
固件篡改的功能強大,對于攻擊者而言是夢寐以求的目标。這是因為,如果能夠實作對固件的篡改,那麼攻擊者就能夠實作繞過保護機制、移除安全防護措施等操作。而利用本章介紹的FMK等工具,攻擊者可以很容易地将自己開發的惡意軟體或後門植入到任意IoT裝置固件中,這樣攻擊者就可以在全球任何地方通過後門通路IoT裝置了。
正是由于固件篡改在攻擊者手中具有如此強大的威力,是以如果能夠對固件進行簽名和校驗值驗證,那麼對于防止惡意修改固件的攻擊而言将具有非常重要的意義。