某打印機固件更新校驗突破

語言: CN / TW / HK

漏洞復現

復現一下一些比賽的漏洞,學習一下,也方便之後打比賽。

某打印機可以通過篡改更新包實現惡意固件上傳。

先拿到官方給的更新工具

看到是個exe,直接執行了會報錯,直接丟進binwalk,看到解出了一些東西,直接對MICE_ALL.fw進行分析

丟IDA裏全是亂碼,發現有gzip的壓縮頭,意識到固件可能分塊了,繼續丟binwalk,能看到壓縮包,-e解出來發現還有四個包。

直接把simple.bin丟進IDA開始分析,搜索firmware、fw、update、upgrade等字符串去定位,設備沒有shell,只能靜態分析。

大概如下

定義了一個header的結構體,從固件包裏獲取0x18字節的頭信息存進header裏,從代碼裏知道信息包括偏移,文件大小,長度,checksum,於是結合文件頭來分析

先計算文件長度

發現頭部有8CDEED倒序出現,確定了文件長度的存放位置

發現文件長度下面還有個8CDE69,與文件長度十分相似,做個差0x8CDEED – 0x8CDE69 = 0x84

於是猜測此為偏移量(header長度),文件總長度,文件數據長度,文件頭長度

現在開始計算checksum,由於checksum的方法比較多,甚至有可能自己設計,所以得根據代碼去分析,定位到代碼

邏輯比較簡單,單純的將DATA每位相加,最後獲取一個總和。

可以用工具粗略判斷一下

也可以自己寫腳本驗證

繼續分析代碼,發現頭最開始的四個字節代表的是這個塊的標識,決定這是什麼固件,走什麼樣的解析

有明文意義的可以當做設備和固件型號,也有把廠商或者是工具的標籤寫在頭裏的。

現在包頭還有兩個四位的信息意義未知

跟着邏輯找沒有找到關於這兩個地方的代碼,可能需要一點猜測。

看到gzip包有字段和他比較相似,

看了下gzip的文件結構,發現這是時間戳,那麼這個地方就大概率是時間戳了。

最後一個地方,發現沒有對header進行校檢的操作,猜測有可能是對header進行校檢,用工具試了試

到這裏基本是分析完了,要注意的是他採取的是多個header校檢的方式,最外面的header校檢通過了以後,才開始校檢data的header,這個過程十分耗時,即使採用了最簡單的校檢和

格式如下

還遇到點小問題,直接用系統的gzip沒法還原壓縮包,得設置個壓縮等級,最後用python的Gzip函數,compresslevel參數0-9一個一個試過去,發現6壓縮出來的包與目標一致

每次改包+上傳至少得三四十分鐘,十分磨人,放兩張對比圖

原來的報錯頁面

改過的報錯頁面

到此分析完畢。