记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

对基于VxWorks OS的路由器进行逆向研究

2020-06-12 12:03

基本介绍

对于CPU体系结构,操作系统和文件系统来说,嵌入式设备是一个广阔的世界。你可以找到可以想到的各种架构组合,我将在本文介绍有关TP-Link TL-WR543G的研究,我在家中使用的旧路由器是MIPS CPU,是VxWorks的操作系统。

 https://static.tp-link.com/resources/document/datasheet/TL-WR543G_ds.zip
 https://www.windriver.com/products/vxworks/

在此文章中,我将向你展示此基于VXWorks的设备的逆向过程,我将描述我的漏洞发现,以及在处理固件和二进制分析时出现的问题,记录一下分析过程。

VxWorks概述

如前所述,WR543G路由器运行的是VxWorks,VxWorks是由Wind River Systems开发的专有RTOS。它支持许多体系结构,例如Intel,Power-PC,ARM,MIPS等。它有自己的开发套件,称为Wind River Workbench,其中包括编辑器,编译器工具链,调试器和仿真器。

VxWorks在市场上被很多产品使用:航空航天和国防,汽车,机器人等工业,消费电子产品,医疗领域和网络。

由于VXWorks是专有操作系统,因此具有许多特定于供应商的属性,其中包括安全模型。例如,用户程序的堆栈溢出检测,固件结构和文件系统也是特定于供应商的。

如果像我一样习惯于逆向包括类Unix操作系统的其他类型的设备,你会发现Grail需要更多的工作才能获得VxWorks系统。

如果你想了解有关VxWorks的更多信息,可以参考本文结尾处与VxWorks相关的工作部分。

 https://blog.quarkslab.com/reverse-engineering-a-vxworks-os-based-router.html#vxworks-related-work

这不是我第一次研究此路由器,前段时间,我尝试还原固件,但是在该路径上没有取得太大进展。因此,我决定拆开分析看看里面有什么。硬件分析方法也使我陷入了僵局,因为当时我不想拆焊任何东西,所以我暂时搁置一会儿。我想了解固件的编译方式以及可以从中提取什么以进行更深入的分析,没有太多有关VxWorks内部信息的信息,只有devttys0的一些帖子。但是,这些足以使我在逆向过程中取得一些进展。因此,在简短介绍了硬件分析之后,我将重点介绍固件分析。

硬件分析

基本描述

· CPU: Atheros AR2317-AC1A (all integrated, WiFi, MIPS 4000)

· Flash: Z-16PGJI-016S338-S9178PC7 (2MB?)

· SDRAM: EM639165TS-6G, 16 MB

· Ethernet: Marvell 88E6060-RCJ1

· UART: Yes

关于flash,先前版本(WR542G)的大小为2 MB,我找不到太多的序列号信息,因此我想在这种情况下,flash的大小是相似的。

以下是主板上的一些图片。

正面图

image.png

背面图

image.png

CPU,RAM,flash

image.png

串行端口

查看主板时,你会发现有一个类似于UART(通用异步接收器-发送器)的引脚排列。我按照devttys0博客中提到的方法进行了逆向。

 http://www.devttys0.com/2012/11/reverse-engineering-serial-ports/

你可以在下图中看到它们:

image.png

这些是UART参数:COM3(在我的设备上是这个,请检查你的参数),波特率:38400

image.png

设置UART接口后,便可以访问启动日志和启动菜单:

 AR2315 rev 0x00000090 startup...
 Attached TCP/IP interface to ae unit 0
 Attaching interface lo0...done
 
 USRCONF : g_size = 18112
 Name = MODULE_USR_CONF_T , size = 12
 Name = UC_IEEE802_1X_CFG_DATA_T , size = 512
 Name = UC_ADVANCED_CFG_T , size = 16
 Name = UC_ARP_CFG_T , size = 32
 Name = UC_BPA_CFG_DATA_T , size = 912
 Name = UC_DDNS_T , size = 1480
 Name = UC_DHCPC_CFG_DATA_T , size = 416
 Name = UC_DHCPS_CFG_AND_STATIC_T , size = 708
 Name = UC_FIRE_WALL_STATE_T , size = 1992
 Name = UC_FORWARD_VIRTUAL_SERVE_CLASS_T , size = 1572
 Name = UC_IFQOS_ROUTER_CONF_FLASH_T , size = 120
 Name = UC_LAN_CFG_DATA_T , size = 8
 Name = UC_L2TP_CFG_DATA_T , size = 1472
 Name = UC_MAC_CONFIG_T , size = 80
 Name = UC_PPPOE_CFG_DATA_T , size = 1568
 Name = UC_NTP_PREFER_SRV_CFG_DATA_T , size = 28
 Name = UC_STATIC_IP_CFG_DATA_T , size = 144
 Name = UC_SATTIC_ROUTE_CFG_DATA_T , size = 328
 Name = UC_MANAGE_USERS_T , size = 64
 Name = UC_UTILITIES_T , size = 16
 Name = UC_WANCONNTYPE_T , size = 16
 Name = UC_WLAN_CFG_T , size = 5020
 Name = UC_PPTP_CFG_DATA_T , size = 1472
 Name = UC_NETWORK_PSEUDO_T , size = 4
 Name = UC_IFQOS_ROUTER_CONF_FLASH_T , size = 120
 Port QoS..................
 qos_IFInit..................
 qos_IFLoadFromFlash..................
 wireless access point starting...
 wlan0 Ready
 
 
 entering tddp...
 
 
 
                                                         Software Platform for ARM
   Copyright(C) 2001-2004 by TP-LINK TECHNOLOGIES CO., LTD.
   Creation date: Sep  4 2008, 17:18:51
 
   Press CTRL-B to enter bootmenu...
 
   Boot Menu:
          1:  Download application program
          2:  Modify Bootrom password
          3:  Exit the menu
          4:  Reboot
          5:  User commond line

一件有趣的事是引导日志引用的是AR2315而不是AR2317。AR2315的是MIPS 4KE 32位与183 MHz处理器。

另一件事是,启动菜单不起作用,如果你输入报告中的命令,则什么都不会发生。但是,当尝试其他键时,我们得到以下结果:

· n:netstat

 Boot Menu:
          1:  Download application program
          2:  Modify Bootrom password
          3:  Exit the menu
          4:  Reboot
          5:  User commond line
                 Enter your choice(1-4):n
 413
 Active Internet connections (including servers)
 PCB      Proto Recv-Q Send-Q  Local Address      Foreign Address    (state)
 -------- ----- ------ ------  ------------------ ------------------ -------
 80fb7f08 TCP        0      0  0.0.0.0.80            0.0.0.0.0             LISTEN
 80fb8538 UDP        0      0  0.0.0.0.2050          0.0.0.0.0
 80fb84b4 UDP        0      0  0.0.0.0.53            0.0.0.0.0
 80fb8430 UDP        0      0  0.0.0.0.67            0.0.0.0.0
 80fb83ac UDP        0      0  0.0.0.0.68            0.0.0.0.0

似乎HTTP服务器正在运行,这是nmap的报告:

 Nmap scan report for 192.168.1.1
 
 Host is up (0.0044s latency).
 
 Not shown: 98 filtered ports
 
 PORT     STATE  SERVICE
 
 80/tcp   open   http
 
 1900/tcp closed upnp
 
 MAC Address: 00:27:19:C1:76:52 (Tp-link Technologies)

· i: ifconfig

 Boot Menu:
          1:  Download application program
          2:  Modify Bootrom password
          3:  Exit the menu
          4:  Reboot
          5:  User commond line
                 Enter your choice(1-4):i
 
 ae (unit number 0):
          Flags: (0x8b63) UP BROADCAST MULTICAST PROMISCUOUS ARP RUNNING
          Type: ETHERNET_CSMACD
          Internet address: 192.168.1.1
          Broadcast address: 192.168.1.255
          Netmask 0xffffff00 Subnetmask 0xffffff00
          Ethernet address is 00:27:19:c1:76:52
          Metric is 0
          Maximum Transfer Unit size is 1500
          0 octets received
          126 octets sent
          0 packets received
          3 packets sent
          0 non-unicast packets received
          0 non-unicast packets sent
          0 unicast packets received
          3 unicast packets sent
          0 input discards
          0 input unknown protocols
          0 input errors
          0 output errors
          0 collisions; 0 dropped
 lo (unit number 0):
          Flags: (0x8069) UP LOOPBACK MULTICAST ARP RUNNING
          Type: SOFTWARE_LOOPBACK
          Internet address: 127.0.0.1
          Netmask 0xff000000 Subnetmask 0xff000000
          Metric is 0
          Maximum Transfer Unit size is 32768
          1 packets received; 1 packets sent
          0 multicast packets received
          0 multicast packets sent
          0 input errors; 0 output errors
          0 collisions; 0 dropped
 ae (unit number 1):
          Flags: (0x8b63) UP BROADCAST MULTICAST PROMISCUOUS ARP RUNNING
          Type: ETHERNET_CSMACD
          Internet address: 10.1.177.242
          Broadcast address: 10.1.177.243
          Netmask 0xff000000 Subnetmask 0xfffffffc
          Ethernet address is 00:1b:fc:0e:b1:f2
          Metric is 0
          Maximum Transfer Unit size is 1500
          13696 octets received
          27868 octets sent
          31 packets received
          63 packets sent
          0 non-unicast packets received
          31 non-unicast packets sent
          31 unicast packets received
          32 unicast packets sent
          0 input discards
          0 input unknown protocols
          0 input errors
          0 output errors
          0 collisions; 0 dropped
 ppp (unit number 1):
          Flags: (0xb0) DOWN POINT-TO-POINT
          Type: PPP
          Metric is 0
          Maximum Transfer Unit size is 1400
          0 octets received
          0 octets sent
          0 packets received
          0 packets sent
          0 non-unicast packets received
          0 non-unicast packets sent
          0 unicast packets received
          0 unicast packets sent
          0 input discards
          0 input unknown protocols
          0 input errors
          0 output errors

· m: meminfo

 Boot Menu:
          1:  Download application program
          2:  Modify Bootrom password
          3:  Exit the menu
          4:  Reboot
          5:  User commond line
                 Enter your choice(1-4):m
 501
 
 FREE LIST:
    num    addr       size
   ---- ---------- ----------
          1 0x80b693d0         64
          2 0x80ffb1f0      13056
          3 0x80ff6770         96
          4 0x80b66b60        976
          5 0x8038df30    8062064
          6 0x80f9fb80        240
 
 
 SUMMARY:
  status    bytes     blocks   avg block  max block
  ------ ---------- --------- ---------- ----------
 current
    free    8076496         6    1346082    8062064
   alloc    4973520      1459       3408          -
 cumulative
   alloc    4992304      1523       3277          -

· k: process list

 Boot Menu:
          1:  Download application program
          2:  Modify Bootrom password
          3:  Exit the menu
          4:  Reboot
          5:  User commond line
                 Enter your choice(1-4):k
 
 
   NAME        ENTRY       TID    PRI   STATUS      PC       SP     ERRNO  DELAY
 ---------- ------------ -------- --- ---------- -------- -------- ------- -----
  --tExcTask   801c19c4     80ff5380   0 PEND       801e3c50 80ff5260       0     0
 -tLogTask   801c6c54     80ff27f0   0 PEND       801e3c50 80ff26d8     --- ---------- --------- --------- ----------
 current
    free   8076496         6    346082    8062064  alloc    4973520      1459       3408          -
 cumulative
   alloc    4992304      1523     377          -
   0     0
 bootromTask8005ad30     80b65be0   8 READY      801dc998 80b64e40  3d0002     0
 tWlanCal   800ef730     80be2ba0  10 PEND       801e3c50 80be2ab0       0     0
 tApCserv   800de55c     80b6c8f0  10 PEND       801e3c50 80b6c800       0     0
 Detectd    80022638     80b631d0  40 DELAY      801db708 80b63148       0    48
 timerManage8006d7f0     80d44780  48 PEND+T     80158414 80d44708  3d0004     2
 endRecvTask8005bce4     80b85020  49 PEND+T     801e3c50 80b84f10  3d0004     1
 tNetTask   8019aab4     80fa4c90  50 PEND       80158414 80fa4c00       0     0
 tApHouseKee800de9d0     80b74db0  50 DELAY      801db708 80b74d00       0  1533
 dot1xTask  800f3a3c     80b6fd20  50 PEND+T     80158414 80b6fa90  3d0002     6
 dhcpcState 800b4438     80de18d0  56 PEND       80158414 80de1830       0     0
 dhcpcRead  800b4e10     80de02d0  56 PEND       80158414 80de00b8  3d0002     0
 swDhcpcd   80062620     80dde870  56 PEND       801e3c50 80dde618       0     0
 802_1X     80093c40     80b680e0 150 PEND+T     80158414 80b68060  3d0004    26
 swL2tpd    80069944     80df8d80 198 PEND+T     801e3c50 80df8b08  3d0004    51
 swPptpd    8006b4c4     80df2130 198 PEND+T     801e3c50 80df1eb8  3d0004    50
 swPppoed   8006863c     80dfd670 199 PEND+T     801e3c50 80dfd3b0  3d0004    48
 pppoed_0   8006fbd8     80dff8e0 200 PEND+T     801e3c50 80dff7c8  3d0004    17
 pptpProc_0 8007aeac     80df43a0 200 PEND+T     801e3c50 80df4070  3d0004     1
 l2tpd_0    80075bd4     80dfaff0 201 PEND+T     801e3c50 80dfaed8  3d0004    15
 pptpd_0    800785f0     80df6610 201 PEND+T     801e3c50 80df64f0  3d0004    13
 usrRebootd 80066648     80d452b0 202 PEND+T     801e3c50 80d451d0  3d0004    42
 mud0_80    8002dd40     80f0ebf0 203 PEND+T     80158414 80f0e9b0  3d0002   581
 tFWCONF    8008fbd8     80ddc960 203 DELAY      801db708 80ddc8d8       0   279
 dnsProxyd  800c0728     80d475e0 204 PEND+T     80158414 80d473e0  3d0002    38
 sntpd      800bf518     80d48e80 205 PEND+T     801e3c50 80d48d48  3d0004    37
 sysExLogd  800201b0     80f388a0 240 PEND       80158414 80f38488  3d0002     0
 dynTask    800c35fc     80d424d0 250 DELAY      801db708 80d42428       0    35
 BPAd_0     800cb6e0     80decc80 253 DELAY      801db708 80decb48       0    33
 dhcpsd     800a7688     80d4b3a0 254 PEND+T     80158414 80d4b178  3d0002    32
 BPAm_0     800ce5c0     80dea210 255 DELAY      801db708 80dea170       0    31

但是,我没有找到通过此菜单获取shell的方法。

固件分析

资料下载:

 [固件(全部可用)](https://www.tp-link.com/us/support/download/tl-wr543g/#Firmware)

 [下载最新的可用版本](https://static.tp-link.com/resources/software/20081013145812.zip)

 我路由器上运行的固件:3.7.1 Build 080904 Rel.62330n(最新版本)

 硬件版本:WR543G v2 08118989

Binwalk分析

我对Binwalk的第一次解包返回以下结果:

 fastix@bulin:~/wr543g$ binwalk wr543gv2-en-up.bin
 
 DECIMAL       HEXADECIMAL     DESCRIPTION
 --------------------------------------------------------------------------------
 20132         0x4EA4          Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 20228         0x4F04          VxWorks operating system version "5.5.1" , compiled: "Sep  4 2008, 17:18:57"
 20324         0x4F64          Copyright string: "Copyright 1984-2002 Wind River Systems, Inc."
 21685         0x54B5          Zlib compressed data, default compression

从Binwalk的输出中可以看到,有一个编译头显示了与VxWorks相关的字符串,具体地说,似乎我们使用的是VxWorks 5.5.1之前的版本。

最后还有一个Zlib压缩流,从偏移量0x54B5开始。没有引导加载程序,文件系统,内核文件。

为了提取Zlib压缩流,我只使用了命令binwalk -e file.bin。

通过查看未压缩流上的字符串,有一些有趣的细节:

 ae(0,0)TP-MIPS:vxWorks h=192.168.1.18 e=192.168.1.5:0xffffff00 u=wr541 pw=123 f=0x0 tn=wr541 o=ae s=factory
 resetting to factory config.

重置路由器后,默认的用户名和密码组合为wr541 / 123。

如果我们再次对未压缩的流使用Binwalk,则结果如下:

 fastix@bulin:~/wr543g/_wr543gv2-en-up.bin.extracted$ binwalk 54B5
 
 DECIMAL       HEXADECIMAL     DESCRIPTION
 --------------------------------------------------------------------------------
 880412        0xD6F1C         Certificate in DER format (x509 v3), header length: 4, sequence length: 1
 880432        0xD6F30         Certificate in DER format (x509 v3), header length: 4, sequence length: 4
 1916528       0x1D3E70        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 1917168       0x1D40F0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 1917808       0x1D4370        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 1918648       0x1D46B8        Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 393
 1918760       0x1D4728        Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 408
 1918852       0x1D4784        Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 423
 1918944       0x1D47E0        Unix path: /Tornado2.2.1-mips/target/config/ar2315/utility.c, line 468
 1919018       0x1D482A        Unix path: /depot/sw/branches/mBSSID_dev/src/ap/os/vxworks/target/config/ar531xPlus/ae531xEnd.c#1 $
 1919594       0x1D4A6A        Unix path: /Tornado2.2.1-mips/target/config/ar2315/ae531xEnd.c, line 319
 1919744       0x1D4B00        Unix path: /Tornado2.2.1-mips/target/config/ar2315/ae531xEnd.c, line 703
 1920008       0x1D4C08        Unix path: /Tornado2.2.1-mips/target/config/ar2315/ae531xEnd.c, line 2188
 1922144       0x1D5460        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 1923290       0x1D58DA        Unix path: /depot/sw/branches/mBSSID_dev/src/ap/os/vxworks/target/config/ar531xPlus/sysLib.c#1 $
 1937472       0x1D9040        CRC32 polynomial table, big endian
 1938879       0x1D95BF        Copyright string: "Copyright 1995-2002 Jean-loup Gailly "
 1939471       0x1D980F        Copyright string: "Copyright 1995-2002 Mark Adler "
 1945225       0x1DAE89        HTML document footer
 1945892       0x1DB124        HTML document header
 1947067       0x1DB5BB        HTML document footer
 1947076       0x1DB5C4        HTML document header
 1947285       0x1DB695        HTML document footer
 1947352       0x1DB6D8        HTML document header
 1947392       0x1DB700        HTML document header
 1949774       0x1DC04E        HTML document footer
 1954280       0x1DD1E8        Unix path: /rc_filesys/doc/dynaform/common.js
 1954508       0x1DD2CC        Unix path: /rc_filesys/doc/frames/top.htm
 1959104       0x1DE4C0        HTML document header
 1960860       0x1DEB9C        HTML document footer
 1960868       0x1DEBA4        GIF image data, version "87a", 16 x 41
 1968256       0x1E0880        GIF image data, version "89a", 220 x 146
 1973772       0x1E1E0C        GIF image data, version "89a", 10 x 10
 1973832       0x1E1E48        GIF image data, version "89a", 10 x 10
 1973896       0x1E1E88        GIF image data, version "89a", 160 x 72
 1978532       0x1E30A4        GIF image data, version "89a", 10 x 10
 1978592       0x1E30E0        JPEG image data, JFIF standard 1.01
 1982668       0x1E40CC        JPEG image data, JFIF standard 1.01
 1992460       0x1E670C        JPEG image data, JFIF standard 1.02
 1992490       0x1E672A        TIFF image data, little-endian offset of first image directory: 8
 1993684       0x1E6BD4        JPEG image data, JFIF standard 1.01
 1994112       0x1E6D80        HTML document header
 1994236       0x1E6DFC        HTML document footer
 1997632       0x1E7B40        HTML document header
 2006161       0x1E9C91        HTML document footer
 2010912       0x1EAF20        HTML document header
 2013167       0x1EB7EF        HTML document footer
 2018806       0x1ECDF6        Copyright string: "Copyright(C) 2001-2004 by %s"
 2023168       0x1EDF00        Unix path: /core/bsp/archives/ar2315/ar531xPlusreg.h-arc   1.5   01 Jun 2006 11:40:30   dai  $
 2032413       0x1F031D        Copyright string: "Copyright 2000 Wind River Systems, Inc."
 2032645       0x1F0405        Copyright string: "Copyright 2001 Wind River Systems, Inc."
 2032737       0x1F0461        Copyright string: "Copyright 2001 Wind River Systems, Inc."
 2043168       0x1F2D20        XML document, version: "1.0"
 2043572       0x1F2EB4        XML document, version: "1.0"
 2047104       0x1F3C80        HTML document header
 2047136       0x1F3CA0        HTML document footer
 2061824       0x1F7600        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2069248       0x1F9300        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2069760       0x1F9500        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2070160       0x1F9690        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2072000       0x1F9DC0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2072688       0x1FA070        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2074288       0x1FA6B0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2074784       0x1FA8A0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2075088       0x1FA9D0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2075584       0x1FABC0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2076944       0x1FB110        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2078192       0x1FB5F0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2080528       0x1FBF10        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2082896       0x1FC850        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2085056       0x1FD0C0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2086560       0x1FD6A0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2087408       0x1FD9F0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2087936       0x1FDC00        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2089984       0x1FE400        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2090224       0x1FE4F0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2090464       0x1FE5E0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2090816       0x1FE740        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2091328       0x1FE940        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2091558       0x1FEA26        Unix path: /depot/sw/releases/4.1.2/src/hal/halUtil.c#1 $
 2092010       0x1FEBEA        Unix path: /depot/sw/releases/4.1.2/src/hal/halBeacon.c#1 $
 2095206       0x1FF866        Unix path: /depot/sw/releases/4.1.2/src/hal/ar5212/ar5212Attach.c#9 $
 2099696       0x2009F0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2100512       0x200D20        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2101040       0x200F30        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2101600       0x201160        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2103120       0x201750        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2103376       0x201850        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2103888       0x201A50        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2105808       0x2021D0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2106592       0x2024E0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2107296       0x2027A0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2107920       0x202A10        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2118544       0x205390        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2121168       0x205DD0        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2121488       0x205F10        Unix path: /core/bsp/archives/ar2315/ar531xPlus.h-arc   1.4   Dec 27 2005 15:00:04   dai  $
 2159077       0x20F1E5        Unix path: /../ip_qos/src/config/qosTask.c, line 102
 2159268       0x20F2A4        Unix path: /../ip_qos/src/config/qosTask.c, line 252
 2159348       0x20F2F4        Unix path: /../ip_qos/src/config/qosTask.c, line 275
 2159446       0x20F356        Unix path: /../ip_qos/src/config/qosTask.c, line 303
 2159540       0x20F3B4        Unix path: /../ip_qos/src/config/qosTask.c, line 315
 2159633       0x20F411        Unix path: /../ip_qos/src/config/qosTask.c, line 323
 2159736       0x20F478        Unix path: /../ip_qos/src/config/qosTask.c, line 370
 2159816       0x20F4C8        Unix path: /../ip_qos/src/config/qosTask.c, line 417
 2159903       0x20F51F        Unix path: /../ip_qos/src/config/qosTask.c, line 443
 2160026       0x20F59A        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 206
 2160114       0x20F5F2        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 217
 2160198       0x20F646        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 254
 2160295       0x20F6A7        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 364
 2160368       0x20F6F0        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 460
 2160471       0x20F757        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 488
 2160564       0x20F7B4        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 491
 2160672       0x20F820        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 501
 2160774       0x20F886        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 502
 2160848       0x20F8D0        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 583
 2160953       0x20F939        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 776
 2161057       0x20F9A1        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 813
 2161159       0x20FA07        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 830
 2161261       0x20FA6D        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 850
 2161365       0x20FAD5        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 886
 2161465       0x20FB39        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1088
 2161553       0x20FB91        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1253
 2161650       0x20FBF2        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1256
 2161731       0x20FC43        Unix path: /../ip_qos/src/core/qos_coreSch.c, line 1274
 2161873       0x20FCD1        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 97
 2161957       0x20FD25        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 141
 2162043       0x20FD7B        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 147
 2162146       0x20FDE2        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 164
 2162233       0x20FE39        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 278
 2162317       0x20FE8D        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 285
 2162404       0x20FEE4        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 297
 2162492       0x20FF3C        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 298
 2162606       0x20FFAE        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 394
 2162693       0x210005        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 483
 2162777       0x210059        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 490
 2162864       0x2100B0        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 506
 2162952       0x210108        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 507
 2163042       0x210162        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 516
 2163135       0x2101BF        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 519
 2163226       0x21021A        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 520
 2163318       0x210276        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 523
 2163405       0x2102CD        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 534
 2163489       0x210321        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 536
 2163719       0x210407        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 640
 2163815       0x210467        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 721
 2163896       0x2104B8        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 747
 2163984       0x210510        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 782
 2164066       0x210562        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 835
 2164266       0x21062A        Unix path: /../ip_qos/src/if_config/qos_IFConfig.c, line 880
 2164484       0x210704        Unix path: /../ip_qos/src/if_config/testcase.c, line 180
 2166310       0x210E26        Unix path: /core/bsp/archives/ar2315/ae531xEnd.h-arc   1.4   10 Dec 2005 10:03:34   lqm  $
 2166996       0x2110D4        Unix path: /../ip_qos/src/core/qos_coreAckFirstFifo.c, line 194
 2167160       0x211178        Unix path: /../ip_qos/src/core/qos_coreAckFirstFifo.c, line 229
 2167274       0x2111EA        Unix path: /../ip_qos/src/common/memPool.c, line 32
 2167356       0x21123C        Unix path: /../ip_qos/src/common/memPool.c, line 40
 2167440       0x211290        Unix path: /../ip_qos/src/common/memPool.c, line 63
 2167605       0x211335        Unix path: /../ip_qos/src/common/memPool.c, line 67
 2167701       0x211395        Unix path: /../ip_qos/src/common/memPool.c, line 68
 2167784       0x2113E8        Unix path: /../ip_qos/src/common/memPool.c, line 74
 2167868       0x21143C        Unix path: /../ip_qos/src/common/memPool.c, line 80
 2167954       0x211492        Unix path: /../ip_qos/src/common/memPool.c, line 86
 2168038       0x2114E6        Unix path: /../ip_qos/src/common/memPool.c, line 92
 2168135       0x211547        Unix path: /../ip_qos/src/common/memPool.c, line 120
 2168234       0x2115AA        Unix path: /../ip_qos/src/common/memPool.c, line 139
 2168331       0x21160B        Unix path: /../ip_qos/src/config/qos_Config.c, line 59
 2168438       0x211676        Unix path: /../ip_qos/src/config/qos_Config.c, line 68
 2168542       0x2116DE        Unix path: /../ip_qos/src/config/qos_Config.c, line 89
 2168630       0x211736        Unix path: /../ip_qos/src/config/qos_Config.c, line 136
 2168716       0x21178C        Unix path: /../ip_qos/src/config/qos_Config.c, line 289
 2168808       0x2117E8        Unix path: /../ip_qos/src/config/qos_Config.c, line 366
 2168896       0x211840        Unix path: /../ip_qos/src/config/qos_Config.c, line 394
 2168984       0x211898        Unix path: /../ip_qos/src/config/qos_Config.c, line 418
 2169173       0x211955        Unix path: /../ip_qos/src/config/qos_htbConfig.c, line 262
 2169296       0x2119D0        Unix path: /../ip_qos/src/config/qos_htbConfig.c, line 328
 2169705       0x211B69        Unix path: /../ip_qos/src/config/qos_htbDump.c, line 184
 2169805       0x211BCD        Unix path: /../ip_qos/src/config/qos_htbDump.c, line 187
 2169957       0x211C65        Unix path: /../ip_qos/src/config/qos_htbDump.c, line 208
 2170171       0x211D3B        Unix path: /../ip_qos/src/config/qos_htbDump.c, line 221
 2170260       0x211D94        Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 62
 2170344       0x211DE8        Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 87
 2170428       0x211E3C        Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 118
 2170512       0x211E90        Unix path: /../ip_qos/src/core/qos_coreFifo.c, line 169
 2170644       0x211F14        Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 117
 2170732       0x211F6C        Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 146
 2170859       0x211FEB        Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 192
 2170972       0x21205C        Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 199
 2171071       0x2120BF        Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 205
 2171173       0x212125        Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 206
 2171271       0x212187        Unix path: /../ip_qos/src/core/qos_coreGeneric.c, line 213
 2171371       0x2121EB        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 217
 2171459       0x212243        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 237
 2171533       0x21228D        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 1414
 2171648       0x212300        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 1669
 2171737       0x212359        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 1683
 2171958       0x212436        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 2527
 2172160       0x212500        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 2728
 2172263       0x212567        Unix path: /../ip_qos/src/core/qos_coreHtb.c, line 2732
 2172374       0x2125D6        Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 33
 2172467       0x212633        Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 34
 2172555       0x21268B        Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 48
 2172652       0x2126EC        Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 49
 2172739       0x212743        Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 66
 2172852       0x2127B4        Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 67
 2172939       0x21280B        Unix path: /../ip_qos/src/if_config/qos_IFClassifier.c, line 138
 2173063       0x212887        Unix path: /../ip_qos/src/common/qos_map.c, line 24
 2173147       0x2128DB        Unix path: /../ip_qos/src/common/qos_map.c, line 27
 2173231       0x21292F        Unix path: /../ip_qos/src/common/qos_map.c, line 43
 2173313       0x212981        Unix path: /../ip_qos/src/common/qos_map.c, line 53
 2173398       0x2129D6        Unix path: /../ip_qos/src/common/qos_map.c, line 80
 2173480       0x212A28        Unix path: /../ip_qos/src/common/qos_map.c, line 82
 2173572       0x212A84        Unix path: /../ip_qos/src/common/qos_map.c, line 98
 2174160       0x212CD0        VxWorks operating system version "5.5.1" , compiled: "Sep  4 2008, 17:18:51"
 2191631       0x21710F        HTML document footer
 [..]
 [cut for brevity. What followed here were a lot of HTML document footers]
 [..]
 2556403       0x2701F3        Copyright string: "Copyright 1999, Mark Martinec. Frontier Artistic License applies."
 2558288       0x270950        XML document, version: "1.0"
 2561036       0x27140C        XML document, version: "1.0"
 2561868       0x27174C        XML document, version: "1.0"
 2563832       0x271EF8        XML document, version: "1.0"
 2575992       0x274E78        Base64 standard index table
 2576304       0x274FB0        XML document, version: "1.0"
 2580992       0x276200        Base64 standard index table
 2661593       0x289CD9        Copyright string: "Copyright 1984-2002 Wind River Systems, Inc."
 2666394       0x28AF9A        VxWorks WIND kernel version "2.6"

有很多HTML / GIF / XMLs / etc,基本都是Web文件。如果我们多做一些grep,我们也会找到对HTML文件的引用,这些HTML文件是调用Web GUI可用的每个函数所需的:

 /userRpm/FirmwareUpdateTemp.htm
 /userRpm/ConfUpdateTemp.htm
 /userRpm/MenuRpm.htm
 /userRpm/MainRpm.htm
 /userRpm/StatusRpm.htm
 /userRpm/StatusHelpRpm.htm
 /userRpm/WzdStartRpm.htm
 /userRpm/WzdOpModeRpm.htm
 /userRpm/WzdWanTypeRpm.htm
 /userRpm/WzdStaticIpRpm.htm
 /userRpm/WzdDynaIpRpm.htm
 /userRpm/WzdPPPoERpm.htm
 /userRpm/WzdEndRpm.htm
 /userRpm/WzdStaticIpHelpRpm.htm
 /userRpm/WzdStartHelpRpm.htm
 /userRpm/WzdOpModeHelpRpm.htm
 /userRpm/WzdWanTypeHelpRpm.htm
 /userRpm/WzdPPPoEHelpRpm.htm
 /userRpm/WzdFinishHelpRpm.htm
 /userRpm/WzdWlanRpm.htm
 /userRpm/WzdWlanHelpRpm.htm
 /userRpm/NatDebugRpm26525557.htm
 /userRpm/NetworkCfgRpm.htm
 /userRpm/WanStaticIpCfgRpm.htm
 /userRpm/WanDynamicIpCfgRpm.htm
 /userRpm/WanCfgRpm.htm
 /userRpm/PPPoECfgRpm.htm
 /userRpm/PPPoECfgAdvRpm.htm
 /userRpm/MacCloneCfgRpm.htm
 /userRpm/WanBpaCfgRpm.htm
 /userRpm/WanBpaCfgHelpRpm.htm
 /userRpm/L2TPCfgRpm.htm
 /userRpm/L2tpCfgHelpRpm.htm
 /userRpm/PPTPCfgRpm.htm
 /userRpm/PptpCfgHelpRpm.htm
 /userRpm/NetworkCfgHelpRpm.htm
 /userRpm/WanStaticIpCfgHelpRpm.htm
 /userRpm/WanDynamicIpCfgHelpRpm.htm
 /userRpm/PPPoECfgHelpRpm.htm
 /userRpm/MacCloneCfgHelpRpm.htm
 /userRpm/WanStaticIpCfgRpm_8021X.htm
 /userRpm/WanDynamicIpCfgRpm_8021X.htm
 ...

另外,通过查看字符串,我们可以得出与登录有关的有趣信息:

image.png

这个Hello123World字符串,显然就是PPPoE服务登录的密码。

到目前为止,我们发现的信息都比较有用,但是二进制文件在哪里?没有发现代码,也没有其他压缩流中包含它们。此时,我在想,如果此Zlib未压缩流仅包含Web内容,则如何在路由器中更新二进制文件?有时,物联网供应商有时会为其设备发布两种类型的固件,一种包含Web内容,另一种包含二进制文件的固件文件。情况并非如此,但是例如在IP摄像机中会发生这种情况。

为了确保没有丢失其他数据,我检查了该设备的旧固件文件,但结果是相同的结构,只有一个包含Web内容的Zlib压缩流。此时,我在想,也许是因为在处理专有操作系统时,固件文件不包括某些部分,可能是固件更新文件中缺少引导加载程序。但是,必须存在其他内容(例如文件系统),因此也应该存在一些二进制代码。这些二进制文件是否以某种方式被压缩,加密或混淆?

我再次使用Binwalk进行了快速检查,以查看是否可以在未压缩的流中找到任何代码。Binwalk有 -Y 参数:

尝试使用顶点分解器识别文件中包含的可执行代码的CPU体系结构

结果如下:

 fastix@bulin:~/wr543g/_wr543gv2-en-up.bin.extracted$ binwalk -Y 54B5
 
 DECIMAL       HEXADECIMAL     DESCRIPTION
 --------------------------------------------------------------------------------
 0             0x0             MIPS executable code, 32/64-bit, big endian, at least 1250 valid instructions

从偏移量0开始存在一些MIPS代码(大端)。

到目前为止,我们已经将一些Web内容与一些MIPS代码混合在一起。这并不奇怪,嵌入式设备通常实现充当不同服务器(HTTP,FTP)并具有嵌入式数据的单个二进制文件。

然后,我尝试将未压缩的流加载到IDA中,选择了MIPS big endian [mipsb]处理器类型,IDA立即显示一个新窗口,要求我提供一些数据来加载文件:

image.png

由于没有任何内容,我接受了默认值,并显示了另一个警告:

image.png

我们的入口点丢失了,IDA不知道从哪里开始加载文件,让我们尝试反汇编第一个字节:

image.png

很好,IDA能够识别一个函数,并且一些代码显示在我们的反汇编窗口中。但是,似乎仅用:P对文件进行逆向将是一项艰巨的工作。显然,我们必须更深入地研究并找到加载文件的入口点。

有趣的是要注意一件事:地址0x802A3960被移到$ gp寄存器中。该寄存器是一个全局指针,指向包含常量和全局变量的堆中64K内存块的中间,这个地址让我对可以查找的内存范围有了一个了解。

因此,我再次返回到固件分析,试图找到可以帮助我进一步分析的东西,并且发现了两个更有趣的字符串:

image.png

image.png

两个字符串均为“ OWOW .. ”,但长度不同。第一次出现是16个字节长,而第二次出现是32个字节长。我在文件格式分析方面的经验告诉我,这些字符串可能是一种神奇的字节(文件中某个点的字节,主要是文件的开头,用于标识文件格式,例如:PE,GIF, PNG等)。我在Google上搜索了一下,并在devttys0的博客中找到了很好的参考,这对我的分析很有帮助。在相同的博客文章,还有另一个参考,从IOActive的有关这些签名字节了解更多的细节。

 https://ioactive.com/solving-a-little-mystery/

VxWorks MemFS文件系统

根据前面提到的帖子,OWOW ..字符串在MemFS Wind River管理文件系统中用作签名。根据IOactive的博客文章,该字符串可能在固件中找到两次。我将引用以下段落:

 the first one due to  the .h  where it is defined (close to other strings such as the webserver banner )and the second one already as part of  the MemFS.

首先,devttys0 提供了以下 header 结构:

 http://www.devttys0.com/2011/06/mystery-file-system/
 
 struct owfs_header
 {
    char magic[32];           // 'OWOWOWOWOWOW...'
    uint32_t version;         // version #1
    uint32_t file_count;
    uint32_t unknown;         // ??
 }

OWFS在devttys0上命名时,并知道这个文件系统被 MemFS 调用。

此定义与我的定义不匹配:

image.png

如你所见,file entries之前只有两个DWORDS,我回到另一篇文章,发现第三个字段是可选的。然后,在我的情况下,struct如下所示:

 struct owfs_header
 {
    char magic[32];           // 'OWOWOWOWOWOW...'
    uint32_t version;         // version #1
    uint32_t file_count;      // 16 files
    array filenames_plus_eof[file_count];
 }

IOActive的博客文章中提到的标志字段对我的固件文件没有意义。固件签名后的文件列表包含0x10条目,每个条目的最大长度为0x4C字节,其中文件名保留0x40字节,文件大小保留4个字节,文件偏移量保留4个字节(从文件系统标头的开头),未知字段保留4个字节(空)在所有情况下)。有趣的是,列表中的所有文件都是纯文本,这意味着该标志字段(在我的情况下为1)不代表压缩/未压缩选项。看起来更像是版本字段,或者以相反的方式使用值,这意味着1 =普通,2 =压缩。

在我的情况下,文件入口struct 如下所示:

 struct FILE_ENTRY_HEADER
 {
         char filename[0x40];
         uint32_t file_size;
         uint32_t file_offset;
         uint32_t reserved; // always 0
 }

它与devttys0帖子中的定义几乎相同,只是最后一个字段始终等于null,struct的大小似乎取决于设备/固件。

有了所有这些信息,我就能够编写一个Python脚本来从MemFS文件系统中提取文件:

 https://blog.quarkslab.com/resources/2020-05-07_reverse_engineering_a_vxworks_os_based_router/code/extract_files.py
 
 C:\Users\itsevart\Documents\reversing-tp-link-wr543g\code>python extract_files.py ..\bin\54B5
 [+] Extracting files from ..\bin\54B5
 [+] Searching signature..
 [+] Signature found at offset: 1dd1c0
 [+] SIGNATURE: OWOWOWOWOWOWOWOWOWOWOWOWOWOWOWOW
 [+] Flag: 0x00000001
 [+] File count: 16
 [+] Reading file entries..
 >> Entry no 0
 [+] filename: /rc_filesys/doc/dynaform/common.js
 [+] file size: 915 bytes
 [+] file offset: 0x000004e8
 >> Entry no 1
 [+] filename: /rc_filesys/doc/dynaform/css_help.css
 [+] file size: 627 bytes
 [+] file offset: 0x0000087c
 >> Entry no 2
 [+] filename: /rc_filesys/doc/dynaform/css_main.css
 [+] file size: 2063 bytes
 [+] file offset: 0x00000af0
 >> Entry no 3
 [+] filename: /rc_filesys/doc/frames/top.htm
 [+] file size: 1763 bytes
 [+] file offset: 0x00001300
 >> Entry no 4
 [+] filename: /rc_filesys/doc/images/blue.gif
 [+] file size: 62 bytes
 [+] file offset: 0x000019e4
 >> Entry no 5
 [+] filename: /rc_filesys/doc/dynaform/commonfuncsEn1.js
 [+] file size: 3675 bytes
 [+] file offset: 0x00001a24
 >> Entry no 6
 [+] filename: /rc_filesys/doc/dynaform/commonfuncsEn3.js
 [+] file size: 3648 bytes
 [+] file offset: 0x00002880
 >> Entry no 7
 [+] filename: /rc_filesys/doc/images/helpPic.gif
 [+] file size: 5515 bytes
 [+] file offset: 0x000036c0
 >> Entry no 8
 [+] filename: /rc_filesys/doc/images/minus.gif
 [+] file size: 59 bytes
 [+] file offset: 0x00004c4c
 >> Entry no 9
 [+] filename: /rc_filesys/doc/images/plus.gif
 [+] file size: 63 bytes
 [+] file offset: 0x00004c88
 >> Entry no 10
 [+] filename: /rc_filesys/doc/images/productphoto.gif
 [+] file size: 4634 bytes
 [+] file offset: 0x00004cc8
 >> Entry no 11
 [+] filename: /rc_filesys/doc/images/pw.gif
 [+] file size: 60 bytes
 [+] file offset: 0x00005ee4
 >> Entry no 12
 [+] filename: /rc_filesys/doc/images/top1_1.jpg
 [+] file size: 4076 bytes
 [+] file offset: 0x00005f20
 >> Entry no 13
 [+] filename: /rc_filesys/doc/images/top1_2.jpg
 [+] file size: 9790 bytes
 [+] file offset: 0x00006f0c
 >> Entry no 14
 [+] filename: /rc_filesys/doc/images/top2.jpg
 [+] file size: 1221 bytes
 [+] file offset: 0x0000954c
 >> Entry no 15
 [+] filename: /rc_filesys/doc/images/top_bg.jpg
 [+] file size: 289 bytes
 [+] file offset: 0x00009a14

即使我能够提取几个文件(总共16个),我仍然认为文件很少。实际上,我展示了更多对.htm文件的引用。我开始进行更多搜索,并注意到固件数据中散布着许多文件,这些文件到目前为止没有遵循任何结构,也没有包含任何特定的标头。其中一些文件包含页脚,但没有页眉。我开始查看第一个签名出现的地方,并注意到有一种表格:

image.png

不幸的是,我无法在该表与分散的文件内容之间找到联系。

我发现Firmware Mod KitIOActive的帖子devttys0的帖子中提到的MemFS文件系统使用了相同的标头结构,但是,这并不完全是我在处理的固件的情况。

用 IDA 加载二进制文件

提取文件后,我需要找出一种继续分析的方法,因为获取的文件不太有用,而且我确定里面还有更多文件。它们可能不是完整版本的文件,而是由某些各自的服务(HTTP,FTP等;)处理的文件,这是一种独立的服务器,用于处理不同类型的协议并发送文件。

我需要一种方法来将提取的数据加载到IDA中并获取所有函数,字符串,符号等。为了做更广泛的分析,我需要完成的主要目标是找到用于加载二进制文件的基址。

同样,我发现了两篇有趣可用的博客文章。

 http://www.devttys0.com/2011/07/reverse-engineering-vxworks-firmware-wrt54gv8/
 https://cq674350529.github.io/2018/09/19/TP-Link-wr886v6-%E5%9B%BA%E4%BB%B6%E8%A7%A3%E6%9E%90/

在devttys0博客中的帖子中,作者通过分析提取的MIPS二进制文件以及从IDA固件中提取的符号来获得基址。该二进制文件负责加载和解压缩位于固件某些部分的LZMA流,代码中明确引用了加载解压缩流的基址。还提到了该地址用Internet上的某些代码可以获取:

因此,似乎我们之前提取的LZMA数据确实包含可执行代码,并且已将其解压缩并加载到地址为0x80001000的内存中。Google在搜索“ vxworks lzmadecode”时发现了一些可以证实这一结论的源代码。

引用的链接对我不起作用。我再次进行了快速搜索,发现使用该地址的LZMA解码器只有一个引用。

 http://www.hackchina.com/en/cont/27807

在cq674350529的帖子中,加载二进制文件的基地址是从Binwalk提供的输出中获得的,在固件文件中找到一个U-Boot标头,其中包含对入口点地址的引用,该入口点地址是IDA中用作基址的地址。

这两种方法对我的情况都不太适用,没有找到 U-Boot头,也没有其他二进制文件可分析,基址不需要在固件数据中,因为它可能在引导加载程序中进行了硬编码。解压缩数据所需的所有代码都在设备上,在两个帖子中都有一个地址,即基地址:0x80001000。让我们尝试一下:

image.png

结果如下:

image.png

反汇编窗口中单击C创建代码后,IDA开始使用自动分析,并发现了许多函数。现在,可以看到其中的一些字符串 在代码中引用了块作为文件:

image.png

我现在能够对二进制文件进行逆向,但是,即使有一些字符串外部参照,也没有任何符号。在这种情况下 cq674350529的文章中,符号分散在固件文件中,并且作者需要编写脚本来编译符号表,因为IDA不能通过自动分析来完成。但是,我没有任何已知的VxWorks符号。

无论如何,通过使用字符串外部参照和数字常量,可以对工程进行逆向和重命名。例如,我发现以下字符串xref 错误:MD4Update MD已经完成。该字符串属于 MD4消息摘要算法的实现。通过搜索初始化常量,可以找到源代码中引用的一些函数:

 #define I0  0x67452301       /* Initial values for MD buffer */
 #define I1  0xefcdab89
 #define I2  0x98badcfe
 #define I3  0x10325476
 #define C2  013240474631     /* round 2 constant = sqrt(2) in octal */
 #define C3  015666365641     /* round 3 constant = sqrt(3) in octal */

这是MIPS二进制文件中的相应代码:

 lui     $a1, 0xEFCD
 lui     $a2, 0x98BA
 lui     $v0, 0x1032
 ori     $v1, 0x2301
 li      $a1, 0xEFCDAB89 --> this constant
 li      $a2, 0x98BADCFE --> this one too
 li      $v0, 0x10325476
 sw      $v0, 0xC($a0)
 sw      $v1, 0($a0)
 sw      $a1, 4($a0)
 sw      $a2, 8($a0)
 sw      $zero, 0x10($a0)
 jr      $ra
 sw      $zero, 0x14($a0)

这是MD4Init()函数,尽管这是逆向没有符号的二进制文件时的一种很好的通用方法,但是要花大量的时间才能找到不错的逆向函数列表。此外,还有一些常见函数,例如printf,memset,memcpy等,可以很容易地识别出来,但有时取决于编译器的优化和在编译过程中使用的标志。因此,我确信有一种更简单的方法可以自动执行识别常用函数的工作。

获取符号

为了自动执行识别常见函数的任务,我使用了由devttys0开发的IDA插件Rizzo,该插件包含使用唯一的字符串引用和其他度量作为可识别的动作(例如内存访问,对常量值的引用和函数调用)制成的模糊签名。但是,该插件有点过时,最后一次更新是在2年前,为了支持IDA 7并且仅支持Python2。我报告了一个问题,@ fuzzywalls(感谢btw)向我发送了他的fork,但是,该fork不适用于我的IDA 7.4(191112)。

 https://github.com/devttys0/ida/tree/master/plugins/rizzo

经过一些工作,我终于能够解决所有问题并将其与我的IDA编译和Python 2配合使用。结果如下:

 Found 3 formal matches in 0.00 seconds.
 Found 107 fuzzy matches in 0.00 seconds.
 Found 188 string matches in 0.00 seconds.
 Found 40 immediate matches in 0.00 seconds.
 Renamed 162 functions in 0.54 seconds.
 Signatures applied in 24.04 seconds
 Caching 'Functions window'... ok
 Caching 'Names window'... ok

你可以在这里找到我提供的Rizzo版本:

 https://blog.quarkslab.com/resources/2020-05-07_reverse_engineering_a_vxworks_os_based_router/code/rizzo.zip

image.png

研究总结

我在Rizzo中获得了一些符号,进行了一段时间的漏洞挖掘,但未成功:(

我开始研究Rizzo能够识别的函数,其中一些函数与DES和MD4有关,对我而言并不太有趣,这些函数属于某些公共实现,例如:MD4消息摘要算法的实现。但是,我猜有一些字符串引用函数与配置文件相关(配置文件可以从路由器的GUI中转储,它以某种方式被加密/混淆):

 ROM:801FA99C aApcfgencryptio:.ascii "apCfgEncryptionSet(%d, TRUE) failed\r\n" ROM:801FA9C2                 .byte    0
 ROM:801FA9C3                 .byte    0
 ROM:801FA9C4 aIwirelessprivs:.ascii "iWirelessPrivSelect = %d, secSubType[1] = %d\r\n" ROM:801FA9F3                 .byte    0
 ROM:801FA9F4 aApcfgauthtypes:.ascii "apCfgAuthTypeSet() failed\r\n" ROM:801FAA10 aApcfgcipherset:.ascii "apCfgCipherSet() failed\r\n" ROM:801FAA2A                 .byte    0
 ROM:801FAA2B                 .byte    0
 ROM:801FAA2C aApcfgkeysrcset:.ascii "apCfgKeySrcSet() failed\r\n" ROM:801FAA46                 .byte    0
 ROM:801FAA47                 .byte    0
 ROM:801FAA48 aApcfggroupkeyu:.ascii "apCfgGroupKeyUpdateIntervalSet() failed\r\n" ROM:801FAA72                 .byte    0
 ROM:801FAA73                 .byte    0
 ROM:801FAA74 aErrorUnableToG:.ascii "ERROR: Unable to generate key with given passphrase and ssid\n"
 ROM:801FAA74                 .ascii  ROM:801FAAB2                 .byte    0
 ROM:801FAAB3                 .byte    0
 ROM:801FAAB4 aApcfgpassphras:.ascii "apCfgPassphraseSet() failed\r\n" ROM:801FAAD2                 .byte    0
 ROM:801FAAD3                 .byte    0
 ROM:801FAAD4 aApcfgpassphras_0:.ascii "apCfgPassphraseKeySet() failed\r\n"

不幸的是,这些字符串没有外部参照。

像下面这样的其他一些代码,将我带到了此处的源代码(显然,它与以太网以及Atheros和VxWorks之间的一种描述符转换有关):

 http://read.pudn.com/downloads90/sourcecode/os/343695/vxworks_stp_src/vxbufs.c__.htm
 http://read.pudn.com/downloads90/sourcecode/os/343695/vxworks_stp_src/vxbufs.c__.htm
 
 ROM:801FA5B8 aVxdesctomblkEr:.ascii“ \ n”
 ROM:801FA5B8 .ascii“ vxDescToMblk:加入mBlk \ n时出错”  ROM:801FA5DB .byte 0
 ROM:801FA5DC aVxmblktodescMP:.ascii“ vxMblkToDesc:未在第一个mblk上设置M_PKTHDR \ n”

同样,这些字符串没有外部参考,其余函数看起来没什么分析价值(如本文件所示),其中大多数是标准函数或辅助函数,没有危险函数,例如自定义处理程序或类似函数。

我尝试的另一件事是使用Burp Suite,以拦截来自HTTP服务器(设备公开的唯一服务)的某些请求,并尝试以某种方式触发崩溃,例如,修改请求的参数。以下示例是从NTP服务器配置捕获的:

 GET /userRpm/DateTimeCfgRpm.htm?timezone=540&month=1&day=1&year=2006&hour=11&minute=59&second=52&ntpA=0.0.0.0&ntpB=0.0.0.0&Submit=Save HTTP/1.1
 
 Host: 192.168.1.1
 
 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0
 
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 
 Accept-Language: en-GB,en;q=0.5
 
 Accept-Encoding: gzip, deflate
 
 Referer: http://192.168.1.1/userRpm/DateTimeCfgRpm.htm
 
 Authorization: Basic bnJpdmE6SncyWGtEYWpWbG1jaA==
 
 Connection: close
 
 Upgrade-Insecure-Requests: 1

为了获得一些输出,我在另一侧连接了一个串行设备接口,以捕获可能的输出,但是Windows 10给我USB接口带来了一些麻烦,我遇到了一些与最大电压消耗有关的错误,不得不多次重新启动PC才能继续。

最后,通过进行一些测试并查看二进制文件中的代码,似乎一切都交给了二进制文件(在单个二进制文件中),并且大多数数据都被编码了,服务器以硬编码的数据“块”进行响应,并且任何不符合要求的其他请求都将被丢弃。例如,在更改NTP服务器时,不同的请求(具有不同的参数)将返回相同的回包。

也许设备内部的调试器会很有帮助,完成此任务的一种可能是修改固件并上载自定义GDB服务器。但是,将需要使用VxWorks编译工具为MIPS编译GDB服务器,它仅针对x86 / x64 / ARM和VxWorks 7有效。

当然,对未知的体系结构进行逆向或处理不常见的OS会带来复杂性,但是有时,即使没有可用的信息,也可能会取得一些进展并完成工作。在这种特殊情况下,有可能要感谢一些过去发现类似问题并记录了该过程的人。

由于这一点,我能够对路由器中使用的未知文件系统进行逆向,并熟悉操作系统。找到一个漏洞本来很好,但是我现在并还没有太多发现。开始能够访问shell程序或将工具上载到路由器以对其进行调试,对于评估其安全性和寻找其漏洞确实是一大步,而且还需要做更多的工作!

无论如何,我希望分享的经验对其他人有用。

VxWorks 相关工具

如果你想了解有关VxWorks的更多详细信息,下面的资料可能会用得到:

· VxWorks Wikipedia entry

· Digging Inside VxWorks (OS + Firmware) - The Holistic Security

· 44CON London - Attacking VxWorks: from Stone Age to Interstellar

· Shiny Old VxWorks Vulnerabilities

· Fun with VxWorks

· Dive into VxWorks Based IoT Device Debug the Undebugable Device

· https://www.cnblogs.com/hac425/p/9706815.html

Tools:

· Tools for working with TP-LINK VxWorks-based router firmware

本文翻译自:https://blog.quarkslab.com/reverse-engineering-a-vxworks-os-based-router.html如若转载,请注明原文地址:

知识来源: https://www.4hou.com/posts/BQnW

阅读:303520 | 评论:0 | 标签:逆向

想收藏或者和大家分享这篇好文章→复制链接地址

“对基于VxWorks OS的路由器进行逆向研究”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

↓赞助商 🙇🧎

标签云 ☁

本页关键词 💎