原文作者: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://www.bjnorthway.com/155/