昨天提到把關鍵的架構辨識後看是去模擬或是實機,但模擬起來後漏洞是否可以完成重現過程也有些許波折。
今天繼續來講一些坑跟修復的小tips
主流的全系統模擬(Firmadyne、FirmAE)在整台跑起來,由於追求涵蓋面廣,不一定針對每一種特定韌體的具體服務有完整依賴的建立
而單一的服務模擬(Qiling、chroot + qemu-user)只跑目標 binary,啟動較快,但針對不同服務間的串聯偶爾會失敗。
一些tips的解法分成
很多韌體讀不到 NVRAM 時會退回載入預設設定檔。比如在第一個case中利用 EMUX 模擬 Tenda AC15 時,找不到 /dev/nvram 就會改讀 /webroot/nvram_default.cfg可以去trace後替換成其他的 比如nvram_fake等工具
在 Tenda 案例中,只有預設讀取 webroot_ro資料夾,執行期才對應到 webroot。模擬時可以直接複製一份。同理對 /var、/tmp 掛 tmpfs。
httpd 常從 br0 取 IP,模擬的時候可以改成 host 端建一個同名 bridge 給位址即可。
e.g., emux container 沒有 CAP_NET_ADMIN 時,Tenda AC18 的做法是把 br0、eth1、vlan* 全部改指向 lo。
針對chroot的部分,接不到dbg可以把static busybox、gdbserver、qemu-*-static 丟進 rootFS 再 chroot。
以 D-Link 的 hedwig.cgi 為例,該檔案是指向 cgibin 的symlink,而 cgibin 會根據呼叫時使用的檔名來決定對應的 handler。
patching 的部分,執行時把相應的檔名塞入環境變數傳遞輸入,例如設定 REQUEST_METHOD=POST,再將 payload 放入 HTTP_COOKIE,即可模擬相應的請求處理流程。
有一些cgibin 架構都可以這樣進行
httpd 常等網路就緒或等設定 daemon,不滿足就退出。這時候可以把檢查函式回傳值改掉,或 NOP 條件跳轉
出錯八成是nvram在搞qvq
nvram_faker 裡面的做法。
攔 libnvram.so 的 nvram_get/nvram_set,印出每一次查詢,可以把目標需要的 key補齊。Firmadyne/FirmAE 內建版本也是差不多的做法。
Day26了 耶呼 眼神死