搜索
您的当前位置:首页正文

路由器文件系统与提取

来源:六九路网
路由器⽂件系统与提取

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解压缩。

  sudo apt-get install build-essential zlib1g-dev libz1zma-dev python-magic  ./configure && make

  然后在firmware-mod-kit⽬录下运⾏unsquashfs_all.sh kernel.squash

因篇幅问题不能全部显示,请点此查看更多更全内容

Top