路由器文件系統與提取


1、路由器文件系統

  我們通常所說的更新路由器是指更新路由器的固件,不同的路由器使用了不同呃硬件平台、操作系統及固件。通常情況下,路由器的固件中包含操作系統的內核及文件系統。

1.1、路由器固件

  路由器固件不是硬件,而是軟件,在路由器中,它通常是被固化在只讀存儲器中的,所以稱為固件。

  在進行漏洞分析時獲取路由器固件的通常有兩種方式:

  一、從路由器廠商提供的更新網站下載;

  二、通過硬件接入,從路由器的Flash中提取固件。

  路由器固件中包含了該路由器中所有的可執行程序及配置文件信息,這些信息對於我們進行路由器漏洞的分析和挖掘都至關重要。獲取固件之后,我們就可以從固件中分離文件系統了。

1.2、文件系統

  文件系統是操作系統的重要組成部分,是操作運行的基礎。不同的路由器使用的文件系統格式不盡相同。根文件系統會被打包成當前路由器所使用的文件系統格式,然后組裝到固件中。

  Squashfs是一個只讀格式的文件系統,具有超高壓縮率,其壓縮率最高可達34%。當系統啟動后,會將文件系統保存在一個壓縮過的文件系統的文件中,這個文件可以使用換回的形式掛載並對其中的文件進行訪問,當進程需要某些文件時,僅將對應部分的壓縮文件解壓縮。

  Squashfs文件系統常用的壓縮格式有GZIP、LZMA、LZO、XZ(LZMA2),在路由器中被普遍采用。路由器的根文件系統通常會按照Squashfs文件系統常用壓縮格式中的一種進行打包,形成一個完整的Squashfs文件系統,然后與路由器操作系統的內核一起形成更新固件。


 

2、手動提取文件系統

  要想分析路由器漏洞,必須獲得路由器中存在漏洞的應用程序。文件系統是操作系統的重要組成部分,是操作運行的基礎。文件系統中包含實現路由器各種功能的基礎應用程序。如家用路由器中實現一個Web服務器,使用戶可以通過Web訪問路由器,對路由器進行管理。文件系統能夠從固件中提取,而從路由器固件中提取文件系統是一個難點,原因之一在於不同的操作系統使用的文件系統不同。另外,路由器的文件系統壓縮算法也有差異,有些路由器甚至會使用非標准的壓縮算法打包文件系統。

2.1、查看文件類型

  file命令通過定義的magic簽名可以識別各種格式,包括常用的Linux/Windows可執行文件、DOC、PDF及各種壓縮格式等。

  如果file firmware.bin   ----->  firmware.bin: data

  上面例子中,file命令並沒有發現符合任何文件類型的匹配,但這並不代表該固件就是沒有接觸過的文件格式,原因在於file命令是從給定文件的首字節開始的,會按照既定格式進行模式匹配。

2.2、手動判斷文件類型

  如果沒有發現符合要求的文件格式,就需要采用下面的方法進一步分析:

  • “strings | grep"檢索文件系統magic簽名頭。(1)
  • “hexdump | grep" 檢索magic簽名偏移。(2)
  • “dd | file" 確定magic簽名偏移處的文件類型。(3)

  文件系統magic簽名頭是指一個文件系統中包含的一串可識別字符,有了這串字符,表明該文件可能包含某個文件系統。當然,如果要確定是否包含某文件系統,還需要利用其他條件配合證明,也就是2和3步驟需要做。

  Windows應用程序以字符串"MZ"開頭,但不是所有具有此特征的文件都是可執行程序,它也可能是一個文本文件,只不過恰巧“MZ"開頭,所以,僅憑單一特征就確定一個文件的類型是有失偏頗的。

2.2.1、檢索文件系統magic簽名

  文件系統頭部特征是根據每一種文件系統開頭的幾字節提煉出來的。常用的文件系統頭部特征如下:

  • cramfs ----    文件系統頭部特征字符為"0x28cd3d45"。
  • squashfs ---- 文件系統頭部特征較多,其中一些是標准的squashfs頭部,有些是國外的研究人員發現的,大致有sqsh、hsqs、qshs、shsq、hsqt、tqsh、sqlz 7種。

  檢查是否存在cramfs文件系統頭部特征和magic簽名“0x28cd3d45"。因為目前不知道文件組織是大端機格式還是小端機格式,所以要進行二次搜索:

  strings firmware.bin | grep `python -c 'print "\x28\xcd\x3d\x45"'`

  strings firmware.bin | grep `python -c 'print "\x45\x3d\xcd\x28"'`

  如果不是cramfs文件類型,那么可以嘗試判斷是不是Squashfs文件系統:

  strings fimware.bin | grep "sqsh" 或 “hsqs"或“qshs"或“shsq"或“hsqt"或“tqsh"或“sqlz"等。

  這里如果在strings firmware.bin | grep "hsqs" -----> 打印出hsqs,我們發現了squashfs文件系統"hsqs"的magic簽名頭,但我們不能完全確定該文件包含的是否為一個squashfs文件系統,還需要進一步確定firmware.bin是不是squashfs文件系統。

2.2.2、確定文件系統

  在輸入hexdump -C firmware.bin | grep -n "hsqs" 后出現:

  00240: 00160090     68 73 71 73 9d 08 00 00    ab c0 ba 51 00 00 04 00   | hsqs.... ......Q..........|

  可以看到,在偏移0x160090(十六進制1441936)出發現了"hsqs"。

  然后用dd命令復制從0x160090處開始的100字節數據。命令如下:

  dd if=firmware.bin bs=1 count=100 skip=1441936 of=squash

  之所以要復制100字節的數據,是因為squashfs文件系統的頭部校驗不會超過100字節。

  最后使用file命令確認復制的文件squash的文件類型。

  運行file squash :

  squash: Squashfs filesystem, little endian, version 4.0, 6164554 bytes, 2205 inodes, blocksize: 262144 bytes,

  


 2.3、手動提取文件系統

  在上面,我們已經知道firmware.bin在偏移0x00160090(十進制1441936)處包含squashfs文件系統,其大小為6164554字節,因此,可以使用dd命令復制該數據塊。

  命令如下:

  dd if=firmware.bin bs=1 count=6164554 skip=1441936 of=kernel.squash

  運行上面命令后,屬於squashfs文件系統的數據已經成功提取出來,接下來的工作就是還原squashfs文件系統中的根文件系統。

  盡管Linux自帶的file命令中包含與squashfs文件系統相關的magic簽名頭部信息,但這對於我們深入了解該文件系統而言是不夠的。

  使用file命令的"-m"參數加載自定義的magic簽名文件,輸出更加詳細的信息。

  命令:file -m filesystems.hsqs hernel.squash

  打印略過,在firmware.bin中提取的kernel.squash使用的是LZMA壓縮方式。

  在linux下可以安裝squashfs-tools工具,命令“apt-get install squashfs-tools",該工具目前僅支持GIZP、LZO、XZ格式,不支持LZMA格式。

  可以安裝firmware-mod-kit解壓縮。

  git clone https://github.com/mirror/firmware-mod-kit.git

  sudo apt-get install build-essential zlib1g-dev libz1zma-dev python-magic

  ./configure && make 

  然后在firmware-mod-kit目錄下運行unsquashfs_all.sh kernel.squash

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM