原文作者:Juan Carlos Jiménez

翻譯者:光棍節

原文地址:http://jcjc-dev.com/2016/12/14/reversing-huawei-5-reversing-firmware/

在第四部分我們得到了完整的固件,并成功解壓得到其中的所有內容。本節主要是挖掘固件中有趣的代碼,通用的漏洞等。

在翻譯的過程中,我們跳過了一些關于Linux系統、二進制反編譯以及其他一些相關概念的介紹。

一、收集和分析開源組件

華為根據GPL的要求,HG533路由器開源了相關的源代碼:下載地址,源代碼目錄結構如圖一所示。

圖一 華為HG533開源代碼

Bootloader源代碼 本路由器的bootloader就是uboot。根據GPL授權要求,華為應該將uboot的源代碼開源在官方網站上。本文中沒有對其進一步分析。 內核源代碼 首先我們看看源代碼是否給我們的分析帶來幫助,恢復出廠設置按鈕是用戶用來強制設置路由器的配置恢復成出廠設置,在之前的分析中,已有按下出廠設置按鈕后UART打印的信息,如圖二所示。

圖二 出廠設置UART打印信息

用簡單的grep命令,我們可以看到不同該組件(內核、二進制和共享庫)的協同工作,如圖三所示。

圖三 源碼中查找部分字符串

有了內核代碼能夠幫助我們發現安全相關的弱算法以及其他被廠商任何事可以接受的偏弱的實現方法。更重要的是,我們可以編譯內核代碼,從而實現自己想要的

用戶空間源代碼

在源代碼中,其中部分的組件如busybox、iptables等也已經開源,如果其中的版本偏舊,這些組件本身就可能帶有已公開的漏洞。

如果是奔著去找0day漏洞或者后門以及敏感數據的話,你的目標就不是這些開源的組件了,廠商或者某提供商開發的面向設備的非開源的代碼一般不會進行詳細的安全測試,可能含有較多的bug。這些代碼會編譯成二進制文件存放在用戶空間中,我們有所有的文件系統,當然就有這些文件了。但是因為沒有源代碼,所以需要逆向分析這些二進制文件。

二、反編譯器

市場上針對MIPS流行的反編譯器如IDA Pro、Radare2和Binary Ninja等,(此處不做具體介紹翻譯)。 收集文件系統中的二進制文件的信息,如:

$ file bin/busybox
bin/busybox: ELF 32-bit LSB executable, MIPS, MIPS-II version 1 (SYSV), dynamically linked (uses shared libs), corrupted section header size

就知道了此路由器采用的是32位小端MIPS指令框架,使用了共享庫等信息。當然也可以通過datasheet獲取,如圖四所示。

圖四 RT3352datasheet

再找MIPS24KEc能支持的框架。 接下來舉例分析用戶空間下的二進制文件的反編譯。 還是分析上面的回復出廠設置的,打印出來的部分字符串沒有在文件中找到,如“button has been pressed”,我們搜索這個打印的下一個字符串,如下:

~/Tech/Reversing/Huawei-HG533_TalkTalk/router_filesystem
$ grep -i -r "restore default success" .
Binary file ./bin/cli matches
Binary file ./bin/equipcmd matches
Binary file ./lib/libcfmapi.so matches

三個文件中包含了這個字符串,有兩個在/bin/目錄下,另外一個在/lib/下,用IDA Pro看看/bin/equipcmd,字符串所在的位置如圖五所示。

圖五 equipcmd反編譯

仔細分析后發現,源代碼中的c文件被編譯成這些指令。如“clear configuration file”對應之前分析的通信中的ERASE命令。基于這個結果,我們發現了“restore default success”或者“restore default fail”,如果成功了,就另外打印一些東西,清空緩沖區,然后重啟,這與我們之前研究的恢復出廠設置完全吻合。

在上面的圖片中,可以看到IDA解析了所有的函數名稱,其他的文件并不一定能這樣。這是因為符號表的緣故。

三、查找默認WIFI密碼生成算法

在前面的分析中,我們已經知道了路由器默認的證書信息,如圖六所示。

圖六 路由器默認證書信息

并且我們知道:

1、每一路由器設備都預置了一個不同的WIFI證書。 2、證書是在生產的時候硬編碼在設備中或者由設備生成,而且,我們知道SSID和密碼存放在flash的保護區中,進而有如下兩種情況:

l 如果硬編碼,那么路由器只需要從一個已知的存儲區域讀取即可 l 如果是由設備生成然后保存到flash中的話,那么一定會有一個算法存在設備中,如果輸入的是公開的,比如MAC地址,那么我們應該可以找到、反編譯并重新實現這個算法,從而計算出默認的WIFI密碼。

查找硬編碼字符串,除了username和password外,在這個設備中,TALKTALK-可能更合適。這個字符串是MAC地址后六位的前綴。如果是上述的后者,那么這個一定是硬編碼在某個文件中。查找結果如下:

$ grep -r 'TALKTALK-' .
Binary file ./bin/cms matches
Binary file ./bin/nmbd matches
Binary file ./bin/smbd matches

其中nmbd和smbd是samba的兩個文件,用來支持U盤設備的,所以我們分析另外一個cms文件。如圖七所示。

圖七 cms文件逆向分析

這與我們猜測的SSID生成算法很像。實現的代碼位于ATP_WLAN_Init函數中,而這個函數有如下的操作:

1、 找到設備的MAC地址: mac = BSP_NET_GetBaseMacAddress()

2、 創建SSID字符串: snprintf(SSID, "TALKTALK-%02x%02x%02x", mac[3], mac[4], mac[5])

3、 保存字符串到某個位置: ATP_DBSetPara(SavedRegister3, 0xE8801E09, SSID)

但是不幸的是,在這個分支運行之后,執行了ATP_DBSave函數,接著執行其他的命令了,如圖八所示。

圖八 cms文件逆向分析

但是對這個函數以及后續的分析并沒有找到我們想要的。 經過分析其他的潛在相關的代碼段,我們沒有發現密碼生成相關算法,這將證實廠商使用相對安全地方法,將每一臺設備的默認密碼存放在flash保護區中。

在未來,我將接著分析其他的設備或者接著更詳細的分析這個設備,因為真的有太多的設備都是使用著算法去生成密碼的。 接下來看看還能干點其他的什么事情。

四、查找命令行注入漏洞

通常最危險的漏洞就是命令行注入,方法很簡單,就是找一個輸入的字符串,這個字符串是被用來作為shell命令的參數,我們試圖添加自己的命令,繞過設備中的過濾器,在嵌入式設備中,這種漏洞經常會導致設備被完全的控制。

在嵌入式設備中,由于受到存儲的限制,這種漏洞經常出現,比如你正在開發供用戶配置設備的web接口,你希望添加網絡測試功能的ping命令,你就需要給用戶定義ping的目標的選項,然后返回結果。如圖九所示。

圖九 ping功能界面

當你受到用戶提供的地址等信息時,你的處理可能是找到一個提供了ICMP協議的庫文件,然后直接后臺調用;或者是使用標準的系統調用,調用路由器支持的ping命令實現。當然后者比較容易實現,當然把用戶的輸入作為一個參數直接交給系統調用,是比較危險的,在這個路由器中的處理如圖十所示。

圖十 /bin/web的反編譯

一個系統的system()調用是最簡單的執行命令方法,有時候開發者會包裝system()函數來過濾所有的輸入,但是這種包裝的難度比較大,總有一些會漏掉。

在二進制中查找可能調用system()是很有可能找到命令行注入的,調查一個很有可能沒有過濾輸入的,圖十一是/bin/web中所有的調用了system()的。

圖十一 web中調用了system()結果

函數的名字能夠幫助我們了解這次調用是否會接收用戶的輸入,我們也看到了與PIN、PUK、SIMs等相關的調用,這是不是說這個應用于手機產品也有關系。

我嘗試去分析atp_gethostbyname,但是目前沒有找到可以注入的地方,如圖十二所示,當不是一個域名的時候就返回錯誤。

圖十二 非域名時返回錯誤

如果對其他的函數也進行詳細的分析,可能會存在著命令行注入漏洞,另外一個很有可能存在注入漏洞的是“LAN-Side DSL CPE Configuration”協議或者是TR-064協議,盡管這個協議只能用于內部網絡的,被用來通過互聯網來配置路由器,如果存在注入漏洞,可能就可以靠發送幾個數據包從而獲取如wifi密碼等信息。

/bin/tr064的逆向如圖十三所示。

圖十三 tr064文件反編譯

從上圖中可以看到在第二節中的SSL認證證書文件,利用這個證書,我們可以偽裝成路由器與服務器等進行通信,進而挖掘其中存在的漏洞等。

五、查找其他類型的漏洞

當然,我們也可以去查找如緩沖區溢出等漏洞,通過控制用戶端的輸入,查找緩沖區溢出漏洞,從而完全的控制路由器。 緩沖區漏洞挖掘的思路很簡單,如圖十四所示。

圖十四 登錄時的緩沖區溢出測試示意圖

但是這類漏洞的利用方法相對會比較麻煩,針對不同的場景需要有不同的應對方法,甚至需要使用如ROP等復雜的技術。當然,嵌入式設備的安全相對PC機要落后很多,如ASLR等基本上不會采用。

你可以通過發現潛在的輸入,查找管理這些輸入的函數名,進而分析并構造特殊的意想不到的輸入,這樣很有可能找到某個漏洞。

我們也可以關心如strcpy,strcat,sprintf等函數,這些函數很有可能存在緩沖區溢出漏洞,當然也包括strncpy,strncat等,只是利用方法會更復雜。如圖十五所示。

圖十五 strcpy等函數搜索結果

盡管上面的strcpy等函數是否是處理用戶的輸入的,但是類似這種的代碼是很危險的,一旦你發現潛在的不安全字符串操作,很有可能就找到了一個可以利用的漏洞。

嘗試發送意外的長輸入使之崩潰,然后分析崩潰的原因,這是挖掘此類漏洞的通用作法,你也不應該設置所有的輸入都是常規的輸入,因為可能會被過濾,可以基于工具實現緩沖區漏洞的挖掘。

Web漏洞中的csrf漏洞同樣經常出現在嵌入式設備中,利用他們可以試下文件的讀寫或者繞過認證進而控制系統,結合命令行注入和csrf漏洞,路由器很有可能會被遠程的攻擊。

當然RetDec是可以將MIPS指令反編譯成偽C代碼。如圖十六所示。

圖十六 RetDec反編譯成偽C代碼

六、后記

后續的研究是關于動態調試二進制文件的


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/167/