TP-Link-WDR-7660 安全研究之固件分析

admin 2022年4月14日02:11:44TP-Link-WDR-7660 安全研究之固件分析已关闭评论943 views字数 5963阅读19分52秒阅读模式


作者简介 /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 0000F1: 0000 0000V0: 0000 0000 [0001]00: 0000 0000BP: 0000 0041 [0000]G0: 0190 0000T0: 0000 0201 [000F]Jump to BLU-Boot SPL 2014.04-rc1-g953e9d6-dirty (Jun 12 2019 - 17:46:33)Hello, MT7626 E2RGU MODE:     4dRGU LENGTH:   ffe0RGU STA: 0RGU: g_rgu_satus:0PL P ONWDT does not trigger rebootRGU 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: 0x2f654image entry point: 0x41E00000U-Boot 2014.04-rc1-g953e9d6-dirty (Jun 12 2019 - 17:46:33)static declaration g_total_rank_size = 0x 2000000DRAM:  32 MiBNOR:  *** Warning - bad CRC, using default environmentIn:    serialOut:   serialErr:   serial*** Warning - bad CRC, using default environmentNet:   mtk_ethUip activatedAutobooting in 1 secondscopying flash to 0x40200000verifying 2th partition...okverifying 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 2000000DRAM:  32 MiBNOR:  *** Warning - bad CRC, using default environmentIn:    serialOut:   serialErr:   serial*** Warning - bad CRC, using default environmentNet:   mtk_ethUip activatedAutobooting in 1 seconds## Booting image at 30038200 ...Architected cp15 timer(s) running at 20.00MHz (phys). Attaching interface lo0... done ==> mtk_netpool_initInit netpool for mtk network nownow load 6 ether net dev Waitting for RX_DMA_BUSY status Start... done---rtl_init_switch--- donertk_vlan_init has donevlan1: 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 = -1RTL8367S: Enhance anti-jamming capability.GMAC1_MAC_ADRH -- : 0x00000019GMAC1_MAC_ADRL -- : 0x66ca8b07CDMA_CSG_CFG = 81000000GDMA1_FWD_CFG = 20710000GDMA2_FWD_CFG = 20710000Tx_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 指令了,后续就可以利用内存修改等功能构造一个串口调试器进一步的对设备进行分析了。

图片

银河实验室

图片

银河实验室(GalaxyLab)是平安集团信息安全部下一个相对独立的安全实验室,主要从事安全技术研究和安全测试工作。团队内现在覆盖逆向、物联网、Web、Android、iOS、云平台区块链安全等多个安全方向。
官网:http://galaxylab.pingan.com.cn/

往期回顾


技术

利用图片隐写执行shellcode

技术

【干货】cobaltstrike通信协议研究

技术

TP-Link XDR-5430-V2 研究分享 - 第一章

技术

Nexus Repository Manager历史表达式注入漏洞分析


图片
图片
图片

长按识别二维码关注我们

微信号:PSRC_Team



图片

球分享

图片

球点赞

图片

球在看

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月14日02:11:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   TP-Link-WDR-7660 安全研究之固件分析https://cn-sec.com/archives/907363.html