前言
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引脚(橙线)
波特率识别
首先识别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 使用的方法搜索一下有详细的使用说明。
保存串口log 为文件,关闭也是一样的。最终可以看到生成的文件,文本编辑器打开生成的文件。
tips: 非正常关闭minicom,会在/var/lock下创建几个文件LCK*,这几个文件阻止了minicom的运行,将它们删除后即可恢复。
查看设备启动的log ,log 很多,这里截选了部分的log信息。
接入UART调试口shell
UART 接入,设置好波特率,重启设备,待设备系统启动完成,启动日志输出完之后,连接shell ,但是需要登录口令。
遇到这种方法,本打算尝试调整uboot在引导linux kernel时使用的启动参数(bootargs) 直接访问跟文件系统。但是我很幸运的使用弱口令进去之后,但是发现这是一个低权限的shell,并且支持的可执行的命令非常有限.
正当我一筹莫展的时候,想起了曾经看到的一款思科的设备的shell 也是类似这种低权限的shell,但是输入 “sh”、”\bin\sh” 、”bash” 等命令可以获取完整版的shell。很幸运,在我输入”sh” 之后,成功的获取了设备完整的shell,并且支持的可执行的命令也变多了。
busybox
开启设备telnet
到这里我已经能通过UART串口获取设备的shell了,但是进入设备shell 过于复杂,并且我也不满足于UART的shell, 于是接着我尝试开启设备的ssh 、 telnet 的shell。我在测试的过程中,执行/bin/文件中的telnetd 毫无反应,并且执行busyBox 中的telnetd 也同样显示错误,我开始猜测开发者可能将telnetd做了更改,导致无法正常使用,但是我在 /usr/sbin/文件目录中找到了 utelnetd 可执行文件,并且执行后很明显的开启了23端口进行监听连接。然而一切都不如我所愿,进行登录的时候又显示需要登录口令,我尝试使用UART的弱口令和一些常见的口令也无法进入shell。
并且我使用google 搜索 NetGear 有没有历史的telnet 口令,在一个论坛中看到了一些信息,但是也依旧没有任何效果。https://openwrt.org/toh/netgear/telnet.console
于是我打算通过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
更改为如下图所示
然后重新启动utelnetd 服务,使用telnet 连接在输入用户名admin 之后就可以直接获取到shell 。
固件提取
由于这款设备的是NetGear 的产品,设备固件都是可以直接下载来的,对这部分不感兴趣的直接跳过。
接下来开始提取设备内部的文件系统,根据前面的查看设备启动时的系统信息,并且配合设备内部的mtd信息分别,确定设备的文件系统是mtd11
使用dd 命令进行提取,在提取之前要确定空间使用的情况,以免文件太大,文件夹中放不下,如果文件太大,可以考虑将bin 文件进行压缩一下。
dd if=/dev/mtd11 of=/tmp/rootfs_ubifs.bin
由于设备内有 tftp ,尝试使用tftp 来进行提取dd 转储的bin 文件,但是遗憾的是,tftp 上传文件到本地tftpd server 的文件是设备内部的配置信息。其他的命令也无法正常将文件提取到设备外部。所幸文件系统内部有可以使用的wget 命令,直接上传上传一个对应架构的完整版busybox 到其中,使用完整版的tftp 将文件传出来即可。
tftp -p -t -f rootfs_ubifs.bin 172.15.0.2
再接下来我们提取设备的非易失性存储器NVRAM(断电之后,所存储的数据不丢失的随机访问存储器)。先将nvram的信息保存,然后使用buybox 的ftp 上传到本地中。
# nvram show > nvram.bin
# strings nvram.bin > nvram.html
成功提取,这里的 WiFi密码和web 管理界面的口令都没有加密,但是路由器忘记密码更改密码的答案给加密了。
固件解包
上面讲述了如何提取设备的固件,但是NetGear 设备固件是开放了,直接去NetGear 官网下载即可。
下载完成之后,这是一个用 .chk 拓展名为结尾的NetGear 固件镜像,那么使用binwalk 查看一下固件包
使用binwalk -Me 解开固件包,解开固件包之后,可以看到有两个东西, 3A.ubi 文件和 ubifs-root 文件夹, 本以为固件中的文件系统提取到了ubifs-root 中,可以 ubifs-root 文件内没有任何东西。把关注点放在3A.ubi 文件上。
解开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
解开之后 ubifs-root 文件内会生成四个ubifs 的文件
根据前面对设备启动时的系统信息分析,rootfs_ubifs.ubifs 就是固件的文件系统。
使用binwalk 进行分析, 识别出来是squashfs 文件系统, 看样子是可以使用binwalk 解开固件
成功解开
总结
本片文章主要从设备侧和固件侧,分别讲解了如何通过UART获取设备的shell, 并且通过开启设备telnet , 在有密码的情况下,如何进行处理。以及对 .chk 和ubi 的固件如何进行分析与解包,接下来在漏洞挖掘和分析固件的方面,应该着重于经常产生漏洞的httpd 组件开始,以及比对更新的固件,使用bindiff 进行更新后的固件的比对,找出漏洞点。