HG533路由器分析教程之二:搜寻固件
在上一节(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 tmp sbin proc mnt lib init etc dev 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
本文由 看雪 Android 安全小组 光棍节 编译,来源 Juan Carlos Jiménez@The World
❤ 往期热门内容推荐
......
更多优秀文章,长按下方二维码,“关注看雪学院公众号”查看!
看雪论坛:http://bbs.pediy.com/
微信公众号 ID:ikanxue
微博:看雪安全
投稿、合作:www.kanxue.com