作者简介 /Profile/
朱文哲,平安科技银河实验室高级安全研究员,Blackhat Asia 2019 演讲者,专注于工业物联网设备及软件的漏洞挖掘。曾发现多款知名品牌工业物联网设备及软件的安全漏洞。
- 0x01 前言
- 0x02 焊接UART串口
- 0x03 固件提取及初始化分析
- 0x04 cmdTask分析
0x01 前言
本文主要介绍搭载了VxWorks系统的TP-Link WDR-7660路由器固件相关的一些分析技巧。
0x02 焊接UART串口
和往常一样在拿到设备后首先第一件要干的事情,就是拆开设备寻找UART或其他调试接口。在拆卸设备后,可以在主板正面看到很清晰的4个UART PIN。
连接UART口后,我们就可以通过看到设备的启动日志了。
#
F0: 102B 0000
F1: 0000 0000
V0: 0000 0000 [0001]
00: 0000 0000
BP: 0000 0041 [0000]
G0: 0190 0000
T0: 0000 0201 [000F]
Jump to BL
U-Boot SPL 2014.04-rc1-g953e9d6-dirty (Jun 12 2019 - 17:46:33)
Hello, MT7626 E2
RGU MODE: 4d
RGU LENGTH: ffe0
RGU STA: 0
RGU: g_rgu_satus:0
PL P ON
WDT does not trigger reboot
RGU mtk_wdt_init:MTK_WDT_DEBUG_CTL(590200f3)
PCDDR2 type with 1066MHz.
R0 FINAL: GW best DQS0 P0 delay(2T, 0.5T, PI) = (0, 3, 12) [tap = 57] R0 FINAL: GW best DQS1 P0 delay(2T, 0.5T, PI) = (0, 3, 12) [tap = 56] R0 FINAL: RX Bit0 (-28~ 29) 58 0, Bit 8 (-28~ 29) 58 0,
R0 FINAL: RX Bit1 (-25~ 30) 56 2, Bit 9 (-25~ 31) 57 3,
R0 FINAL: RX Bit2 (-26~ 28) 55 1, Bit10 (-25~ 31) 57 3,
R0 FINAL: RX Bit3 (-25~ 30) 56 2, Bit11 (-25~ 31) 57 3,
R0 FINAL: RX Bit4 (-25~ 34) 60 4, Bit12 (-24~ 30) 55 3,
R0 FINAL: RX Bit5 (-22~ 31) 54 4, Bit13 (-24~ 31) 56 3,
R0 FINAL: RX Bit6 (-25~ 31) 57 3, Bit14 (-26~ 30) 57 2,
R0 FINAL: RX Bit7 (-27~ 32) 60 2, Bit15 (-27~ 31) 59 2,
R0 FINAL: DATLAT = 13 [11 ~ 16]
R0FINAL:TXBit0( 4~28)2516, Bit8( 5~28)2416, R0FINAL:TXBit1( 5~29)2517, Bit9( 6~29)2417, R0FINAL:TXBit2( 5~29)2517, Bit10( 6~28)2317, R0FINAL:TXBit3( 5~30)2617, Bit11( 6~29)2417, R0FINAL:TXBit4( 6~30)2518, Bit12( 6~27)2216, R0FINAL:TXBit5( 6~30)2518, Bit13( 6~29)2417, R0FINAL:TXBit6( 6~29)2417, Bit14( 6~29)2417, R0FINAL:TXBit7( 6~30)2518, Bit15( 6~30)2518, [MEM_TEST] OK.
SPL: Decompressing U-Boot image!
Actual U-Boot image size: 0x2f654
image entry point: 0x41E00000
U-Boot 2014.04-rc1-g953e9d6-dirty (Jun 12 2019 - 17:46:33)
static declaration g_total_rank_size = 0x 2000000
DRAM: 32 MiB
NOR: *** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
*** Warning - bad CRC, using default environment
Net: mtk_eth
Uip activated
Autobooting in 1 seconds
copying flash to 0x40200000
verifying 2th partition...
ok
verifying 3th partition...
ok
## Jump to Normal boot at 0x30028000 ...
U-Boot 2014.04-rc1-g953e9d6-dirty (Jun 12 2019 - 17:48:52)
static declaration g_total_rank_size = 0x 2000000
DRAM: 32 MiB
NOR: *** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
*** Warning - bad CRC, using default environment
Net: mtk_eth
Uip activated
Autobooting in 1 seconds
## Booting image at 30038200 ...
Architected cp15 timer(s) running at 20.00MHz (phys).
Attaching interface lo0... done
==> mtk_netpool_init
Init netpool for mtk network now
now load 6 ether net dev
Waitting for RX_DMA_BUSY status Start... done
---rtl_init_switch--- done
rtk_vlan_init has done
vlan1: mbr[0x10001] untag[0x1] pvid[1]
vlan2: mbr[0x10002] untag[0x2] pvid[2]
vlan3: mbr[0x10004] untag[0x4] pvid[3]
vlan4: mbr[0x10008] untag[0x8] pvid[4]
vlan5: mbr[0x10010] untag[0x10] pvid[5]
rtl8367c(per port vlan) set wan port = -1
RTL8367S: Enhance anti-jamming capability.
GMAC1_MAC_ADRH -- : 0x00000019
GMAC1_MAC_ADRL -- : 0x66ca8b07
CDMA_CSG_CFG = 81000000
GDMA1_FWD_CFG = 20710000
GDMA2_FWD_CFG = 20710000
Tx_Ring addr: 0x41302380!!!
Rx_Ring addr: 0x413043c0!!!
Version2.0
Software Platform for TPOS/1.0.0
Copyright(C) 2001-2011 by TP-LINK TECHNOLOGIES CO., LTD.
Creation date: 11/03/21,20:44:49
# miniFsDrv(2559): Install minifs driver successed.
...
...
...
在拿到命令行后,却发现这次TP-Link对 cmdTask 命令进行了大量阉割,以前的task管理及内存修改功能 全部消失了,只有最基础的一些命令。那么下面就需要通过分析设备固件来判断那些功能究竟是完全被阉割了,还是通过某种方式进行了保护。
0x03 固件提取及初始化分析
这次我打算采用劫持路由器在线升级的流量来直接获取二进制升级包的方式进行固件提取,正好手上的 这台设备也很久没有升级了。如下图所示在软件升级页面触发路由器的在线升级功能,本次分析的固件版本为3.0.4。
通过分析设备流量后在数据包中找到了如下的设备固件下载地址
http://download.tplinkcloud.com.cn/firmware/wdr7660gmv1-cn-up_2021-11-03_20.53.20_163670 7684143.bin
使用binwalk进行分析后可以发现如下信息,根据以往分析TP-Link设备的经验 处的压缩包就是VxWorks的image。
使用binwalk-e命令完全提取后可以使用grep -r bzero ./_wdr7660gmv1-cn-up_2021-11-03_20.53.20_1636707684143.bin.extracted命令找到167EF0文件,该文件就是外置的符号表文件。
在得到VxWorks image及外置符号表文件后,我们就客户使用IDA Pro或Ghidra结合我们开发的VxHunter插件对设备固件进行分析。
首先在IDA Pro中以选择ARM Little-endian禁用自动分析功能。
然后以默认0地址加载。
在VxWorks菜单页面选择 Load VxWorks symbol file 并选择我们提取的符号表文件。
之后 VxHunter 会自动解析符号表并进行 rebase 及识别函数等一系列操作,分析过程中可能会遇到一些符号已存在或冲突的情况,可以确认后继续进行自动化分析。
在完成自动化分析后,为了便于后续分析,我们还需要手工创建 bss 段信息。
通常VxWorks系统会在 usrInit 函数中对 bss 段进行清空初始化操作,通过分析 usrInit函数,我们可以得知bss段的起始地址是0x405da8f0,长度为 0xde5c0。
创建完bss段后,固件提取及分析的准备工作也就完成了。
0x04 cmd Task分析
根据以往分析TP-Link设备的经验,cmdAdd 函数是用于注册 cmdTask 命令行指令的函数,因此我们可以直接分析下对应函数 cmdAdd 的引用来判断。
如下图所示,可以看到实际 cmdTask 中注册了很多命令,那么这些命令一定是被隐藏起来了。
通过分析cmdAdd函数的引用,最终在cmdProtectInit函数中找到了一个admin指令。
在命令行中输入admin后可以看到有 login 和 logout 的参数。
通过分析 admin 命令的处理函数 cmdAdminParser 后可以得知,判断密码是否正确的函数为cmdProtectPwdCmp。
cmdProtectPwdCmp 函数则主要就是比较 0x4068e144 处的保存的密码是否与输入一致。
再查看 0x4068e144 处的引用,可以发现改地址被 updateCmdProtectPwd 函数引用。
updateCmdProtectPwd 函数用于更新 0x4068e144 的保护密码。
updateCmdProtectPwd 的引用只有两个,一个是 cmdProtectInit 一个是 pwdChangeNotify 函数。
cmdProtectInit 的代码如下。
此处省略一些分析过程,进一步分析处理后的代码如下所示,从代码中我们可以看到 cmdTask 的保护密码算法实际为截取设备的DevID前10个字节(Flash中profile段的前10个字节)加上web密码的哈希(如果未设置密码则web密码哈希为WaQ7xbhc9TefbwK),不足64字节的部分再以 x00 填充后进行md5计算,就 是cmdTask的保护密码了。
int cmdProtectInit()
{
int v0; // r2
const char *v1; // r1
int v2; // r0
int v4; // [sp+Ch] [bp-278h]
char cmd_admin_md5_string; // [sp+10h] [bp-274h]
char cmd_admin_pwd; // [sp+30h] [bp-254h]
__int16 v7; // [sp+3Ah] [bp-24Ah]
char v8; // [sp+60h] [bp-224h]
char ProFileData; // [sp+A8h] [bp-1DCh]
char fullDevID; // [sp+C8h] [bp-1BCh]
v4 = 0;
memset(&v8, 0, 72);
memset(&cmd_admin_md5_string, 0, 32);
memset(&cmd_admin_pwd, 0, 46);
memset(&ProFileData, 0, 454);
readProFile((int)&ProFileData, &v4);
memcpy((int)&halfDevID, (int)&fullDevID, 10);
memcpy((int)&cmd_admin_pwd, (int)&halfDevID, 10);
modelRead("/uhttpd/webPwd/webPwd", &v8, 72);
if ( strlen(&v8) )
{
v0 = 36;
v1 = &v8; }
else
{
v2 = strlen("WaQ7xbhc9TefbwK");
v1 = "WaQ7xbhc9TefbwK";
v0 = v2;
}
memcpy((int)&v7, (int)v1, v0);
MD_string((int)&cmd_admin_pwd, 46, (int)&cmd_admin_md5_string, 5, 0);
memset(&cmd_admin_pwd, 0, 33);
md5ToString_part_0((unsigned __int8 *)&cmd_admin_md5_string,
(int)&cmd_admin_pwd);
updateCmdProtectPwd((int)&cmd_admin_pwd, 32);
return cmdAdd("admin", "cmd protect entry point", cmdAdminParser);
}
从下图中可见,成功登陆admin后即可获取完整功能的 cmdTask 指令了,后续就可以利用内存修改等功能构造一个串口调试器进一步的对设备进行分析了。
银河实验室
往期回顾
技术
技术
技术
技术
长按识别二维码关注我们
微信号:PSRC_Team
球分享
球点赞
球在看
原文始发于微信公众号(平安集团安全应急响应中心):TP-Link-WDR-7660 安全研究之固件分析