物聯網IoT安全教程(五)-- 修復固件運行環境

之前我們學習瞭如何模擬運行IoT固件,但是,現實中並不是所有固件都能模擬運行成功,比如固件運行可能依賴於硬件,qemu無法完全模擬,所以,本節我們就來學習如何修復固件的運行環境,從而成功模擬固件運行。

我們本次使用的固件是D-Link的DIR-605L FW_113固件,下載地址:ftp://ftp2.dlink.com/PRODUCTS/DIR-605L/REVA/
1

拿到固件後,我們慣用的使用fat工具進行模擬,會發現它報錯了,Interfaces那裏也爲空,說明模擬運行失敗了。
2

上github上查詢該錯誤,作者無奈地回覆說其實不是所有固件都能用firmadyne模擬的,尤其是那些需要與硬件設備交互的固件。
3

好,那就換種思路,模擬固件運行的實質其實就是把固件的Web程序跑起來,而模擬失敗則說明Web程序運行出錯了,我們接下來就要針對看看Web程序報錯的原因以及如何修復運行環境。首先用binwalk提取固件的文件系統,提取出來的路徑爲squashfs-root-0。
4

我們可以使用find ./ -name boa命令來定位該固件的Web程序。Boa程序是一個輕量級的web服務器程序,常見於嵌入式系統中。dlink就是在boa開源代碼的基礎上新增了很多功能接口以實現路由器上的不同功能。boa程序的路徑爲/bin/boa,同時我們發現在/etc/boa路徑下還有個boa的密碼配置文件,我們可以直接獲取到boa加密後的密碼。
5

我們直接使用命令模擬運行程序,會發現報錯了,提示初始化MIB錯誤。
sudo chroot . ./qemu-mips-static bin/boa
6

使用IDA對boa程序進行逆向分析(需要先添加mip插件:https://github.com/devttys0/ida),定位到字符串“Initialize AP MIB failed”,接下來就在這裏下斷點,調試看下什麼情況下會報這個錯。
7

首先使用qemu調試命令運行boa程序。
8

然後在用ida打開boa程序,選擇Debugger爲Remote GDB(我這裏是遠程調試129虛擬機裏的boa程序),點擊Debugger -> Process Options進行配置IP和端口。
9

然後點擊Debugger -> Attach to process附加調試,直接運行到斷點處,這裏的jalr命令即爲調用apmib_init函數。
10

google下這個這個函數是幹嘛的,原來是從flash中讀取mib值到RAM中,模擬環境沒有flash硬件,所以應該會讀取失敗。
11

經過調試,我們知道由於沒有flash硬件,apmib_init讀取數據失敗返回0,賦值給%v0,然後bnez命令對$v0進行檢測,若爲0,則回顯初始化失敗,報錯退出。
12

我直接在IDA中對字節碼進行修改,將bnez(0x14)命令改成beqz(0x10),就可以進入正常的邏輯順利運行下去了。
13

patch完程序後,再次運行boa,發現它不再報“Initialize AP MIB failed”錯誤了,但又來了2個“Create chklist file error!”錯誤以及一個內存崩潰錯誤。
14

前2個“Create chklist file error!”來自於create_chklist_file和create_devInfo_file函數,後面那個內存崩潰是apmib_get函數導致的。
15

定位到“Create chklist file error!”字符串,經分析確認這個錯誤是open函數的返回值導致,但由於不影響執行我們就細看了。
16

重點放到apmib_get函數,從上面我們可以知道該函數的功能是從RAM讀取MIB值,所以有可能又是硬件依賴導致的錯誤。該函數正常情況下會返回4種值。
17

由於代碼複雜,我們就不細緻分析了,直接參考作者的代碼編寫劫持代碼,目的是僞造apmib_init和apmib_get函數,讓其返回正確的值,由於爲了方便IDA調試,作者把fork也一併劫持了(IDA遇到fork異常)。
18

編寫好apmib.c後,使用mips-linux-gnu-gcc命令將該代碼編譯成so,在這之前得先下載mips的gcc。
sudo apt install gcc-mips-linux-gnu

然後使用命令進行編譯。
mips-linux-gnu-gcc -Wall fPIC -shared apmib.c -o apmib-ld.so
19

使用LD_PRELOAD參數指定劫持so,這樣當boa執行到apmib_init和apmib_get時,就會調用到apmib-ld.so裏面的函數,從而順利運行,運行成功的效果如下。
20

我們可以看到Web服務以跑起來了,80端口。
21

然而當我們打開頁面時,頁面自動跳轉到了Wizard_Easy_LangSelect.asp,程序又雙叒崩潰了。。
22

看下該ASP文件的代碼,通過文件名可以猜測功能是選擇頁面語言,而它嘗試從硬件設備讀取語言,顯然又會出錯了。
23

那我們就想辦法不讓它進入這個頁面,查看入口網頁,發現邏輯是先判斷系統語言,成功則直接進入Webcome界面。
24

所以…我們直接魔改,兩種情況都進入Wizard_Easy_Welcome.asp界面。
25

改完後再次訪問,終於成功了,不容易,至此Web服務已經成功跑起來了,就可以開始挖洞了。
26

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章