协助查找 CGI 文件

逆向工程 固件
2021-06-18 23:47:43

我想知道是否有人可以帮助我。我正在逆向工程 netgear r6250 固件,只是为了练习。我已经成功地使用 binwalk 解压了固件,并且在根目录中存在 www 目录。查看 html 代码,我注意到表单引用了 cgi 文件。但是检查整个文件系统我似乎找不到任何 cgi 文件。我读过这篇博客文章,其中提到在某些 netgear 路由器中,我引用了以下内容:

apply.cgi 并不是真正的脚本,而是在 HTTP 服务器中调用的函数

所以我相信 cgi 文件可能嵌入在我解压的固件版本中位于 /usr/sbin 中的 http 二进制文件中。我不知道这是否真的如此。

有人可以指出我正确的方向,以便知道在哪里可以找到 cgi 文件,或者它们是否确实嵌入在 httpd 二进制文件中?毫无疑问,您的帮助将不胜感激。

编辑

下面显示了使用 find 命令从根目录搜索 cgi 文件和服务器设置文件但没有结果的屏幕截图: 搜索到的 cgi 文件和服务器设置文件的屏幕截图

下图显示了 etc 目录中的文件列表: 在此处输入图片说明

如果您注意到有两个符号链接由于缺少链接文件而悬空。所以这让我相信 cgi 文件(可能还有其他文件)是在启动时在内存中创建的。更糟糕的是,使用firmadyne 模拟固件不起作用,因为我没有使用IP 启动和运行NIC 设备,而且我已经使用firmadyne 模拟了另一个netgear 固件(尽管是旧固件)。在为 Firmadyne 的创建者辩护时,他们提到如果发生这种情况是一个错误并报告它,我还没有这样做。底线是我无法模拟固件来证明(或反驳)文件可能是在运行时创建的。无论如何,我会暂时继续研究。

2个回答

虽然您没有在问题中提供必要的详细信息,但我决定尝试使用 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.cgiapply.cgistringshttpdgrep -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二进制文件直接处理

二进制文件包含大量字符串,显然其中甚至包含一些断言字符串。

如果没有,请检查 Web 服务器的配置文件。假设它是一个普通的 Web 服务器(如 Apache 或 Nginx),您需要的一切都将在httpd.conf/nginx.conf或它们加载的文件之一中。

您可能还想尝试对其进行 grepping - grep -ri filename.cgi filesystem/这会很慢www,但您会发现任何引用该名称的内容。