原文作者:Juan Carlos Jiménez

翻译者:光棍节

原文地址:http://jcjc-dev.com/2016/04/29/reversing-huawei-router-2-scouting-firmware/

前文回顾:HG533路由器分析教程之找到硬件调试接口

上一节分析pcb板的硬件结构时,发现了一个UART接口,通过这个接口,实现了一个Linux shell的管理接口,本节中利用上节提出方法访问设备,进而对设备进行调试和控制。

上一节提出的方法是易于访问的,不需要昂贵的工具,并且会有有趣的结果,如果你想做一些硬件方面的分析,但是又不愿意去拆设备的话,这将导致你无法深入的挖掘硬件漏洞,而只是停留在网络漏洞以及ISP配置协议等高层次接口的安全分析。

本节中通过利用上一节提出的方法访问并收集一些随机的数据块,这些数据块会帮助我们理解整个系统。

一、 回顾上一节

图一是UART引脚图,图二是串口通信数据。

图一 UART引脚图
图二 串口通信数据
串口交互运行shell,这个shell是由路由器中的busybox提供的,如下:

-------------------------------
-----Welcome to ATP Cli------
-------------------------------
Login: admin
Password:#Password is ‘admin'
ATP>shell
BusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
# ls
var   usr   tmpsbin  proc  mntlib   init  etcdev   bin

上面有三个层面的固件:

1、U-boot,即设备的bootloader,实现对最低级的硬件管理,如watchdog等,也负责对后续主要功能固件的启动。 2、Linux,路由器通过运行Linux来实现对硬件的整体控制,协调并行处理,后续的busybox是运行在此Linux之上。 3、Busybox,一个集合了多个Linux命令的工具包。 低级别的接口往往是不直观的,不能访问所有的数据,而且可能会造成设备变砖,从busybox开始往下分析是不错的思路。 通常情况下,开发人员会在启动过程中添加一些调试信息,接下来,我们就从调试信息中找找是否存在有用的信息。

二、 开机调试信息

在启动的一系列信息中,我们可以得到flash段的压缩算法等,如图三所示,采用的是LZMA压缩,用的是Mips Linux内核。

图三 内核压缩算法信息
当我们想着提取闪存数据时,在本路由器中,Intel的外部闪存结构就非常重要了,如图四、图五、图六所示。
图四 内存映射图
图五 Flash芯片名称与完整的内存映射表
图六 文件系统压缩格式

三、 ATP 以及BusyBox

本路由器中的Ralink IC通过运行一个Linux内核实现对内存的管理、并行处理以及对整个系统的控制,Ralink芯片的产品说明上显示使用的是Linux2.6.21内核,而ATP CLI是运行在Linux之上或者是作为Linux内核的一部分,它仅提供了第一层的系统认证,其他功能很有限,如下所示:

ATP>help
Welcome to ATP command line tool.
If any question, please input "?" at the end of command.
ATP>?
cls
debug
help
save
?
exit
ATP>

上面的帮助并没有提到shell或者sh的命令,通常是直接运行shell或者sh就可以得到。仅提供了少于10个命令,而更多功能的实现是依靠busybox来完成的。 Busybox是一个集合了多个通用unix命令的工具包,非常方便,从ls到cd以及top等,有了busybox,让我们使用Ralink IC像使用Linux一样。

如下所示是本路由器中的busybox支持的命令:

ATP>shell
BusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
# ls
var   usr   tmp   sbin  proc  mnt   lib   init  etc   dev   bin
#
# ls /bin
zebra        swapdev      printserver  ln           ebtables     cat
wpsd         startbsp     pppc         klog         dns          busybox
wlancmd      sntp         ping         kill         dms          brctl
web          smbpasswd    ntfs-3g      iwpriv       dhcps        atserver
usbserver    smbd         nmbd         iwconfig     dhcpc        atmcmd
usbmount     sleep        netstat      iptables     ddnsc        atcmd
upnp         siproxd      mount        ipp          date         at
upg          sh           mldproxy     ipcheck      cwmp         ash
umount       scanner      mknod        ip           cp           adslcmd
tr111        rm           mkdir        igmpproxy    console      acl
tr064        ripd         mii_mgr      hw_nat       cms          ac
telnetd      reg          mic          ethcmd       cli
tc           radvdump     ls           equipcmd     chown
switch       ps           log          echo         chmod
#

仅仅分析上面的是不够的,敏感的数据不会存放在busybox 中的。

四、 探索文件系统

现在我们已经登录在系统中,而且知道哪些命令是可以使用的,本节中仅仅是为了得到对整个系统的概述,没有详细的分析每一小片的数据。

其中top命令是可以帮助我们得出进程消耗资源的情况,由于当前路由器是出于空闲状态,top命令并没有返回太多的有用信息。如图七所示。

图七 top命令返回结果
从上面的进程列表中看到有一个usbmount进程,由此可见,路由器支持usb接口,当插入一个flash u盘,显示出如下的信息:

usb 1-1: new high speed USB device using rt3xxx-ehci and address 2
[...]
++++++sambacms.c 2374 renice=renice -n +10 -p 1423

U盘被识别,并且被挂载到/mnt/usb1_1/,同时一个samba服务器就启动了,这些文件的目录在/etc/samba下:

# ls -l /etc/samba/
-rw-r--r--    1 0        0             103 smbpasswd
-rw-r--r--    1 0        0               0 smbusers
-rw-r--r--    1 0        0             480 smb.conf
-rw-------    1 0        0            8192 secrets.tdb
# cat /etc/samba/smbpasswd

nobody:0:XXXXXXXXXXXXXXXXXXX:564E923F5AF30J373F7C8_______4D2A:[U ]:LCT-1ED36884:

当然,还有其他的命令:

Netstat –a :设备的通信端口信息
Iptables –list:设置网络,进而可以telnet访问,此处我们仍然保持裸机状态。
Wlancmd help:丰富的wifi无线控制功能
/etc/profile
/etc/inetd
/etc/services
/var/:系统运行过程中使用的文件
/etc/:系统配置文件

其中/var/和/etc/目录下会包含大量的有用信息,很多都是很明显的,如/etc/serverkey.pem。如图八所示。

图八 /etc/serverkey.pem文件内容

在嵌入式设备中找到TLS通信的私钥是很正常的,通过攻击一个设备获取私钥,进而可以对其他相同型号的设备展开攻击。

这个私钥一方面用于与华为或ISP服务器通信,但是,更多的是用来获取公开证书,进而与远程服务器通信。在这里,我们找到了两个证书,都来自于“同一个人”的签名。

/etc/servercert.pem: 最有可能是服务器密钥 /etc/root.pem: 很有可能用于与华为或者ISP服务器通信(不确定。。。)

更多的敏感数据是在/etc/ppp256/config和/etc/ppp258/config文件中,如图九所示。

这些身份认证信息对于HTTP 接口也是有效的,这也是我在此处提出来的原因。当然对于其他的很多路由器设备不一定有效。

分析如此多的不同文件,如果没有好的工具将会是非常耗费时间的,所以,我们将会尽可能的复制这些数据到u盘中,进而在电脑上进行分析。

图九 config文件内容

五、 信息收集

当收集了文件之后,我们可以使用find . –name *.pem查找是否还有其他的TLS证书。

运行grep -i –r password,查找所有文件中的password字段,得到如图十所示。

图十 password在所有文件中的信息

这里有很多的证书信息,主要是为STUN,TR-069和本地服务提供。此处展示出来是因为这些信息都是通过http传输的,但通常是隐藏的。这些证书要不以明文要不以base64编码后保存,当然编码是不能保护数据的。如图十一所示的是当前wifi密码的base64值。

$ echo "QUJCNFVCTU4=" | base64 -D
ABB4UBMN

图十一 当前wifi密码

在分析上述密码的过程中,得到了2个比较重要的文件。

/var/curcfg.xml: 当前配置文件,包括base64后的wifi密码等

/etc/defaultcfg.xml: 默认配置文件,用于恢复出厂设置,但不包括路由器的wifi密码,主要是因为第一次使用的时候需要配置密码信息。

六、 探索ATP的CLI

由于ATP的CLI包含了非常少的命令,其中重要的命令之一是debug。debug display 将会显示igmpproxy、cwmp、sysuptime或者atpversion的使用,大部分都没有什么用,不知道cwmp是不是与路由器的远程配置有关,如图十二所示。

图十二 cwmp的命令信息

再次,这些CWMP(TR-069)证书是用于远程路由器配置的凭据,这次甚至没有编码,明文的保存在里面。 其他的ATP命令功能很有限,如清屏、帮助,保存到flash中或退出等。

七、 探索Uboot的CLI

Bootloader的命令行接口提供了访问部分内存区域,但是,它没有提供直接访问flash芯片功能,如下所示:

Please choose operation:
   3: Boot system code via Flash (default).
   4: Entr boot command line interface.
You choosed 4
Stopped Uboot WatchDog Timer.
4: System Enter Boot Command Line Interface.
U-Boot 1.1.3 (Aug 29 2013 - 11:16:19)
RT3352 # help
?       - alias for 'help'
bootm   - boot application image from memory
cp      - memory copy
erase   - erase SPI FLASH memory
go      - start application at address 'addr'
help    - print online help
md      - memory display
mdio   - Ralink PHY register R/W command !!
mm      - memory modify (auto-incrementing)
mw      - memory write (fill)
nm      - memory modify (constant address)
printenv- print environment variables
reset   - Perform RESET of the CPU
rf      - read/write rf register
saveenv - save environment variables to persistent storage
setenv  - set environment variables
uip - uip command
version - print monitor version
RT3352 #

不要轻易的去使用erase、mm、mw或者nm命令,除非真的需要使用这些命令,错误的使用将会重启设备,然后设备变砖。此时,内存显示md和printenv引起了我的注意。

RT3352 # printenv
bootcmd=tftp
bootdelay=2
baudrate=57600
ethaddr="00:AA:BB:CC:DD:10"
ipaddr=192.168.1.1
serverip=192.168.1.2
ramargs=setenv bootargs root=/dev/ram rw
addip=setenv bootargs $(bootargs) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname):$(netdev):off
addmisc=setenv bootargs $(bootargs) console=ttyS0,$(baudrate) ethaddr=$(ethaddr) panic=1
flash_self=run ramargs addip addmisc;bootm $(kernel_addr) $(ramdisk_addr)
kernel_addr=BFC40000
u-boot=u-boot.bin
load=tftp 8A100000 $(u-boot)
u_b=protect off 1:0-1;era 1:0-1;cp.b 8A100000 BC400000 $(filesize)
loadfs=tftp 8A100000 root.cramfs
u_fs=era bc540000 bc83ffff;cp.b 8A100000 BC540000 $(filesize)
test_tftp=tftp 8A100000 root.cramfs;run test_tftp
stdin=serial
stdout=serial
stderr=serial
ethact=Eth0 (10/100-M)

Environment size: 765/4092 bytes

我们可以看到类似设置UART串口波特率,以及一些有意思的内存位置。这些内存地址不是flash IC地址空间的,flash的地址空间是0x00000000—0x00FFFFFF。

让我们利用md看看其中的部分内存,如kernel_addr=0xBFC40000,如图十三所示。

图十三 BFC40000内存数据
其中的badd信息表示此处为无效地址,当用md访问无效的内存地址时,将会返回硬编码的badd提示内存地址无效。这些地址是好的地址,但是在u-boot阶段是不可访问的。

需要注意的是,通过启动uboot命令行接口将会导致路由器停止加载Linux内核到内存中,所以对内存的访问将是非常有限的子集。其中有效的地址空间如图十四所示。

图十四 有限的可访问内存空间数据举例

这种方法查找内存非常受限,仅能够查看有限区域的数据,但是可以用这种方法来分析内存的存储结构,如在0x000d0000位置的内存内容明显变化,如图十五所示。

图十五 0x000d0000位置的内存明显变化

最后附上实验的视频教程: http://static.video.qq.com/TPout.swf?vid=w01991tmnia&auto=0


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:http://paper.seebug.org/155/