NetGear 夜鹰 RAX40V2 设备与固件分析

前言

NetGear 厂商的路由器设备中,拆解开经常会带有UART 调试串口,并且以往的NetGear 设备UART调试口往往只需要正确的检测出UART引脚的类型,设置波特率为115200,然后直接用串口调试软件配合FT232就可以直接获取设备内部的shell。但是Nightawk 夜鹰 RAX40V2 路由器在接入UART调试串口时,却有所不同。本篇文章,将带来对NetGear RAX40v2 在路由器开发板上的UART 获取shell的过程中遇到的一些问题,如何进行解决,循序渐进的开启设备的telnet,让我们拭目以待。

设备分析

产品名称:Nighthawk AX4 4-Stream WiFi Router

固件版本:V1.0.2.82_2.0.50

发布日期:2020年

首先我们从设备侧入手,拆解的过程以及设备硬件的配置,这不属于本片文章的重点,这里就不做过多的讲解。


设备串口分析

引脚分析,这款设备的引脚已经给了针脚,也免去了另外焊接针脚的工作,根据万用表和逻辑分析仪的识别(其实没用到逻辑分析仪)

从上到下依次是 VCC 引脚、GND引脚 (红线)、TXD引脚(黄线)、RXD引脚(橙线)

26545687-f1a129de8d485292.png

波特率识别

首先识别FTD 232 USB “ls -ll /dev/tty

接下来使用devttys0 的小工具baudrate.py 来识别波特率,只需要简单的使用上下键,就可以识别不同的波特率。如下图所示,设备识别为115200。 这也是NetGear 常用的波特率,其他的厂商的波特率也很多使用这个波特率。

tip: 这里顺带提一下,baudrate.py 识别的波特率是设置好的常见波特率,但是里面只设置了几个可以识别的波特率,如果需要增加识别广度,需要在脚本内部的BAUDRATES 参数中增加想要识别的波特率值。

获取启动log

现在我们已经知道了波特率,接下来获取设备在启动的时候的log 信息,分析这些log 对设备分析有的时候会非常有用。但是常常 UART 的log 信息会非常多并且启动比较快。因此需要想办法将这些log 保存下来,以便后续分析。

我们使用minicom 打开,选择 “Serial port setup” —> 设置 ”A—-Serial Device“ 和 ”E “的波特率,minicom 使用的方法搜索一下有详细的使用说明。


26545687-9fd40d5f498b1a67.png

保存串口log 为文件,关闭也是一样的。最终可以看到生成的文件,文本编辑器打开生成的文件。

26545687-7e70068035afb63a.png

tips: 非正常关闭minicom,会在/var/lock下创建几个文件LCK*,这几个文件阻止了minicom的运行,将它们删除后即可恢复。

查看设备启动的log ,log 很多,这里截选了部分的log信息。


26545687-0d2469659423f401.png


26545687-c7dd24bdcd5d82b7.png

接入UART调试口shell

UART 接入,设置好波特率,重启设备,待设备系统启动完成,启动日志输出完之后,连接shell ,但是需要登录口令。


26545687-666c497df0e0da66.png

遇到这种方法,本打算尝试调整uboot在引导linux kernel时使用的启动参数(bootargs) 直接访问跟文件系统。但是我很幸运的使用弱口令进去之后,但是发现这是一个低权限的shell,并且支持的可执行的命令非常有限.

26545687-82e6d01061653026.png

26545687-d3d6d4a3a39a78e7.png

正当我一筹莫展的时候,想起了曾经看到的一款思科的设备的shell 也是类似这种低权限的shell,但是输入 “sh”、”\bin\sh” 、”bash” 等命令可以获取完整版的shell。很幸运,在我输入”sh” 之后,成功的获取了设备完整的shell,并且支持的可执行的命令也变多了。

26545687-d0dfe64ed083d31d.png

26545687-c70b3c0023bfb853.png

busybox

26545687-885d7d5e2e98f110.png

开启设备telnet

到这里我已经能通过UART串口获取设备的shell了,但是进入设备shell 过于复杂,并且我也不满足于UART的shell, 于是接着我尝试开启设备的ssh 、 telnet 的shell。我在测试的过程中,执行/bin/文件中的telnetd 毫无反应,并且执行busyBox 中的telnetd 也同样显示错误,我开始猜测开发者可能将telnetd做了更改,导致无法正常使用,但是我在 /usr/sbin/文件目录中找到了 utelnetd 可执行文件,并且执行后很明显的开启了23端口进行监听连接。然而一切都不如我所愿,进行登录的时候又显示需要登录口令,我尝试使用UART的弱口令和一些常见的口令也无法进入shell。


26545687-e1f7e8362aa3290b.png

并且我使用google 搜索 NetGear 有没有历史的telnet 口令,在一个论坛中看到了一些信息,但是也依旧没有任何效果。https://openwrt.org/toh/netgear/telnet.console

26545687-c23ac01a3f531371.png

于是我打算通过UART提供的调试接口直接修改passwd 文件,因为是root 的权限,因此直接更改admin 用户的密码为空。

# cat /etc/passwd

nobody:11hFVKPORB$llSaVGwuSWo.CTxU5.Qk30:0:0:nobody:/:/bin/sh

admin:x:0:0:admin:/:/bin/sh

# chmod 777 /etc/passwd

# vi /etc/passwd

# /usr/sbin/utelnetd

telnetd: starting

port: 23; interface: any; login program: /bin/login

更改为如下图所示


26545687-55b5b11deddf8964.png

然后重新启动utelnetd 服务,使用telnet 连接在输入用户名admin 之后就可以直接获取到shell 。

26545687-8db437b1283d41c9.png

 固件提取

由于这款设备的是NetGear 的产品,设备固件都是可以直接下载来的,对这部分不感兴趣的直接跳过。

接下来开始提取设备内部的文件系统,根据前面的查看设备启动时的系统信息,并且配合设备内部的mtd信息分别,确定设备的文件系统是mtd11

26545687-0b1a2306a1f0c29c.png

使用dd 命令进行提取,在提取之前要确定空间使用的情况,以免文件太大,文件夹中放不下,如果文件太大,可以考虑将bin 文件进行压缩一下。

dd if=/dev/mtd11 of=/tmp/rootfs_ubifs.bin

26545687-28843bfb9ca126c5.png

由于设备内有 tftp ,尝试使用tftp 来进行提取dd 转储的bin 文件,但是遗憾的是,tftp 上传文件到本地tftpd server 的文件是设备内部的配置信息。其他的命令也无法正常将文件提取到设备外部。所幸文件系统内部有可以使用的wget 命令,直接上传上传一个对应架构的完整版busybox 到其中,使用完整版的tftp 将文件传出来即可。

tftp -p -t -f rootfs_ubifs.bin 172.15.0.2

26545687-50dbd05a38849778.png

再接下来我们提取设备的非易失性存储器NVRAM(断电之后,所存储的数据不丢失的随机访问存储器)。先将nvram的信息保存,然后使用buybox 的ftp 上传到本地中。

# nvram show > nvram.bin

# strings nvram.bin > nvram.html

成功提取,这里的 WiFi密码和web 管理界面的口令都没有加密,但是路由器忘记密码更改密码的答案给加密了。

26545687-dcea9941d47d37d8.png

固件解包

上面讲述了如何提取设备的固件,但是NetGear 设备固件是开放了,直接去NetGear 官网下载即可。

下载完成之后,这是一个用 .chk 拓展名为结尾的NetGear 固件镜像,那么使用binwalk 查看一下固件包


26545687-c8f8b380d5218023.png

使用binwalk -Me 解开固件包,解开固件包之后,可以看到有两个东西, 3A.ubi 文件和 ubifs-root 文件夹, 本以为固件中的文件系统提取到了ubifs-root 中,可以 ubifs-root 文件内没有任何东西。把关注点放在3A.ubi 文件上。

26545687-19bb4238afcf402c.png

解开ubi 文件有两种方法,一个是通过挂载的方式, 一个是使用 ubi_reader 套件来解开,挂载的话过于麻烦,这里使用 ubi_reader 套件来解开. 我们需要https://github.com/jrspruitt/ubi_reader,可以通过PIP进行安装:

sudo pip install ubi_reader,

使用 ubireader_extract_images 来进行解开ubi 的文件。

ubireader_extract_images 3A.ubi

26545687-5c9787cf071047bf.png

解开之后 ubifs-root 文件内会生成四个ubifs 的文件

26545687-a8122e812fe8b04f.png

根据前面对设备启动时的系统信息分析,rootfs_ubifs.ubifs 就是固件的文件系统。

使用binwalk 进行分析, 识别出来是squashfs 文件系统, 看样子是可以使用binwalk 解开固件

26545687-6f4c64555e47574e.png

成功解开

26545687-4149a50c519247df.png

26545687-7609f7b43874148f.png

总结

本片文章主要从设备侧和固件侧,分别讲解了如何通过UART获取设备的shell, 并且通过开启设备telnet , 在有密码的情况下,如何进行处理。以及对 .chk 和ubi 的固件如何进行分析与解包,接下来在漏洞挖掘和分析固件的方面,应该着重于经常产生漏洞的httpd 组件开始,以及比对更新的固件,使用bindiff 进行更新后的固件的比对,找出漏洞点。




本文章由作者:佐须之男 整理编辑,原文地址: NetGear 夜鹰 RAX40V2 设备与固件分析
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐