原文作者:Juan Carlos Jiménez
翻译者:光棍节
原文地址:http://jcjc-dev.com/2016/04/29/reversing-huawei-router-2-scouting-firmware/
在上一节分析pcb板的硬件结构时,发现了一个UART接口,通过这个接口,实现了一个Linux shell的管理接口,本节中利用上节提出方法访问设备,进而对设备进行调试和控制。
上一节提出的方法是易于访问的,不需要昂贵的工具,并且会有有趣的结果,如果你想做一些硬件方面的分析,但是又不愿意去拆设备的话,这将导致你无法深入的挖掘硬件漏洞,而只是停留在网络漏洞以及ISP配置协议等高层次接口的安全分析。
本节中通过利用上一节提出的方法访问并收集一些随机的数据块,这些数据块会帮助我们理解整个系统。
图一是UART引脚图,图二是串口通信数据。
------------------------------- -----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内核。
本路由器中的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命令并没有返回太多的有用信息。如图七所示。
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。如图八所示。
在嵌入式设备中找到TLS通信的私钥是很正常的,通过攻击一个设备获取私钥,进而可以对其他相同型号的设备展开攻击。
这个私钥一方面用于与华为或ISP服务器通信,但是,更多的是用来获取公开证书,进而与远程服务器通信。在这里,我们找到了两个证书,都来自于“同一个人”的签名。
/etc/servercert.pem: 最有可能是服务器密钥 /etc/root.pem: 很有可能用于与华为或者ISP服务器通信(不确定。。。)
更多的敏感数据是在/etc/ppp256/config和/etc/ppp258/config文件中,如图九所示。
这些身份认证信息对于HTTP 接口也是有效的,这也是我在此处提出来的原因。当然对于其他的很多路由器设备不一定有效。
分析如此多的不同文件,如果没有好的工具将会是非常耗费时间的,所以,我们将会尽可能的复制这些数据到u盘中,进而在电脑上进行分析。
当收集了文件之后,我们可以使用find . –name *.pem查找是否还有其他的TLS证书。
运行grep -i –r password
,查找所有文件中的password字段,得到如图十所示。
这里有很多的证书信息,主要是为STUN,TR-069和本地服务提供。此处展示出来是因为这些信息都是通过http传输的,但通常是隐藏的。这些证书要不以明文要不以base64编码后保存,当然编码是不能保护数据的。如图十一所示的是当前wifi密码的base64值。
$ echo "QUJCNFVCTU4=" | base64 -D ABB4UBMN
在分析上述密码的过程中,得到了2个比较重要的文件。
/var/curcfg.xml: 当前配置文件,包括base64后的wifi密码等
/etc/defaultcfg.xml: 默认配置文件,用于恢复出厂设置,但不包括路由器的wifi密码,主要是因为第一次使用的时候需要配置密码信息。
由于ATP的CLI包含了非常少的命令,其中重要的命令之一是debug。debug display 将会显示igmpproxy、cwmp、sysuptime或者atpversion的使用,大部分都没有什么用,不知道cwmp是不是与路由器的远程配置有关,如图十二所示。
再次,这些CWMP(TR-069)证书是用于远程路由器配置的凭据,这次甚至没有编码,明文的保存在里面。 其他的ATP命令功能很有限,如清屏、帮助,保存到flash中或退出等。
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,如图十三所示。
需要注意的是,通过启动uboot命令行接口将会导致路由器停止加载Linux内核到内存中,所以对内存的访问将是非常有限的子集。其中有效的地址空间如图十四所示。
这种方法查找内存非常受限,仅能够查看有限区域的数据,但是可以用这种方法来分析内存的存储结构,如在0x000d0000位置的内存内容明显变化,如图十五所示。
最后附上实验的视频教程: http://static.video.qq.com/TPout.swf?vid=w01991tmnia&auto=0