虽然您没有在问题中提供必要的详细信息,但我决定尝试使用 Netgear 网站上的R6250-V1.0.4.26_10.1.23.zip。我不知道这与您当前正在查看的任何目标有多接近,但是环境表面上看起来相当相似(尤其是 的内容/etc
)。
首先我使用firmware-mod-kit提取.chk
下载的文件中的文件.zip
:
$ extract-firmware.sh R6250-V1.0.4.26_10.1.23.chk
Firmware Mod Kit (extract) 0.99, (c)2011-2013 Craig Heffner, Jeremy Collake
Scanning firmware...
Scan Time: 2018-06-13 17:23:43
Target File: /home/user/netgear/R6250-V1.0.4.26_10.1.23.chk
MD5 Checksum: fbb0ddc095cbca7abebe90a19a1b39b7
Signatures: 344
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
58 0x3A TRX firmware header, little endian, image size: 19345408 bytes, CRC32: 0xE9FDE7D3, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0x23F01C, rootfs offset: 0x0
86 0x56 LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 5467936 bytes
2355286 0x23F056 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 16983563 bytes, 1244 inodes, blocksize: 131072 bytes, created: 2018-04-02 13:08:38
Extracting 2355286 bytes of header image at offset 0
Extracting squashfs file system at offset 2355286
Extracting squashfs files...
Firmware extraction successful!
Firmware parts can be found in '/home/user/netgear/fmk/*'
然后我开始探索fmk/rootfs
使用标准 Linux 工具的内容。例如.cgi
,整个 rootfs 中只存在一个文件。
$ find -name '*.cgi'
./www/cgi-bin/genie.cgi
随着grep -R \.cgi www
我能找到一大堆不同的“文件”引用命名.cgi
内部使用路由器的Web界面的形式。
然后我尝试进一步过滤列表(内部fmk/rootfs/www
):
grep -RPho '[^"]+\.cgi'|sort -u
结果列表中有一些异常值,但结果仍然有用。
有了这些知识,我又回到了 rootfs 以寻找 Web 服务器。find -name httpd
事实证明,我本可以使用,但实际上我正在查看/bin
,/usr/bin
并/usr/sbin
按照该顺序找到了一个httpd
在最后一个中命名的二进制文件。
strings httpd
从内部使用fmk/rootfs/usr/sbin
给了我进一步的线索,并明确证明这不是 Nginx 或 Apache。随着strings httpd|grep \.cgi
我还能够验证报价:
apply.cgi
不是真正的脚本,而是在 HTTP 服务器中调用的函数
似乎成立。
使用readelf -d httpd
我找出了依赖关系(摘录):
$ readelf -d httpd
Dynamic section at offset 0xae00c contains 31 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libnat.so]
0x00000001 (NEEDED) Shared library: [libnvram.so]
0x00000001 (NEEDED) Shared library: [libacos_shared.so]
0x00000001 (NEEDED) Shared library: [libcrypt.so.0]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libssl.so.1.0.0]
0x00000001 (NEEDED) Shared library: [libcrypto.so.1.0.0]
0x00000001 (NEEDED) Shared library: [libc.so.0]
如果需要,知道要查看哪些库。
最后但并非最不重要的是,我将 ELF 文件加载httpd
到 IDA Pro 7.1 中,使用+转向字符串子视图并开始查找名称。在你提到不存在(通过验证的和)。所以我需要选择另一个 CGI 作为例子。ShiftF12.cgi
apply.cgi
strings
httpd
grep -R apply\.cgi fmk/rootfs/www
我选择了userlogin.cgi
,这是在IDA View-A 中.cgi
使用Alt+从上到下搜索文本时出现的第一个名字。T
列出对x包含userlogin.cgi
以下内容的字符串的交叉引用 ( ) :
.rodata:000823DC aUserloginCgi DCB "userlogin.cgi",0
出现了几个对sub_F110
( .text:0000F110
.. .text:0001289C
) 的引用,当遵循这些交叉引用时,结果证明它是一个中央“大型功能”,用于解析 HTTP 请求并处理对任意数量的硬编码.cgi
和.htm
“文件名”的请求。(注意:确保查找对包含的字符串的引用cgi-bin
。)
因此,基于该引述,您的怀疑是正确的,除了genie.cgi
在文件系统上找到的唯一例外,所有其他.cgi
“文件”都由大量 1.3 MiBhttpd
二进制文件直接处理。
二进制文件包含大量字符串,显然其中甚至包含一些断言字符串。