Author : Dlive

1. 调试环境配置

本次调试分析的漏洞是长亭科技在某届GeekPwn上提交的路由器漏洞

该路由器的系统为嵌入式ARM Linux, 路由器中集成了Xware程序,本文中的漏洞为Xware的漏洞

我们可以找到存在漏洞的固件版本,固件的下载链接可以在官方论坛上找到

使用binwalk解包

# dlive @ pwn in /tmp [14:25:56]
$ binwalk -Me XXXV100R001C01B032SP03_main.bin

Scan Time:     2018-03-13 14:26:08
Target File:   /tmp/XXXV100R001C01B032SP03_main.bin
MD5 Checksum:  f8fc51edfc499d98297da3cb9ed20f13
Signatures:    386

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
67022         0x105CE         Squashfs filesystem, little endian, version 4.0, compression:xz, size: 10486308 bytes, 1100 inodes, blocksize: 1048576 bytes, c$eated: 2016-02-16 02:09:03
10556878      0xA115CE        uImage header, header size: 64 bytes, header CRC: 0x6FE316DA, created: 2016-02-16 02:03:53, image size: 1458856 bytes, Data Add$ess: 0x80408000, Entry Point: 0x80408000, data CRC: 0x97747C02, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: lzma, image name: "Linux-$.6.30"
10556942      0xA1160E        LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 3839712 bytes


Scan Time:     2018-03-13 14:26:10
Target File:   /tmp/_XXXV100R001C01B032SP03_main.bin.extracted/A1160E
MD5 Checksum:  5ccfdaa38810b2974367a3b3ffe06ff5
Signatures:    386

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
106107        0x19E7B         LZMA compressed data, properties: 0xC0, dictionary size: 0 bytes, uncompressed size: 64 bytes
1345893       0x148965        Certificate in DER format (x509 v3), header length: 4, sequence length: 1284
1346017       0x1489E1        Certificate in DER format (x509 v3), header length: 4, sequence length: 1288
2719004       0x297D1C        Linux kernel version 2.6.30
2994752       0x2DB240        CRC32 polynomial table, little endian
3009084       0x2DEA3C        CRC32 polynomial table, little endian
3470319       0x34F3EF        xz compressed data
3537774       0x35FB6E        Unix path: /etc/nginx/conf/domain.dat
3552266       0x36340A        Neighborly text, "neighbor %.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x lost on port %d(%s)(%s)"


Scan Time:     2018-03-13 14:26:12
Target File:   /tmp/_XXXV100R001C01B032SP03_main.bin.extracted/_A1160E.extracted/19E7B
MD5 Checksum:  3b5d3c7d207e37dceeedd301e35e2e58
Signatures:    386

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------

解包成功之后,在squashfs-root目录下我们可以看到路由器的文件系统如下

# dlive @ pwn in /tmp/_XXXV100R001C01B032SP03_main.bin.extracted/squashfs-root [14:27:34]
$ ls -la
total 64
drwxr-xr-x 16 dlive dlive 4096  2月 16  2016 .
drwxrwxr-x  4 dlive dlive 4096  3月 13 14:26 ..
drwxrwxrwx  2 dlive dlive 4096  2月 16  2016 bin
drwxr-xr-x  2 dlive dlive 4096 12月 23  2015 config
drwxrwxrwx  3 dlive dlive 4096  2月 16  2016 dev
drwxrwxrwx  8 dlive dlive 4096  2月 16  2016 etc
drwxr-xr-x  3 dlive dlive 4096  2月 16  2016 home
drwxr-x---  2 dlive dlive 4096  2月 16  2016 html
lrwxrwxrwx  1 dlive dlive   13  2月 16  2016 init -> ./bin/busybox
drwxrwxrwx  4 dlive dlive 4096  2月 16  2016 lib
lrwxrwxrwx  1 dlive dlive    3  2月 16  2016 lib64 -> lib
lrwxrwxrwx  1 dlive dlive   11  2月 16  2016 linuxrc -> bin/busybox
drwxrwxrwx  2 dlive dlive 4096 12月 23  2015 mnt
drwxrwxrwx  2 dlive dlive 4096 12月 23  2015 proc
drwxrwxrwx  2 dlive dlive 4096  2月 16  2016 sbin
drwxr-xr-x  2 dlive dlive 4096 12月 23  2015 sys
drwxr-xr-x  2 dlive dlive 4096 12月 23  2015 tmp
drwxrwxrwx  6 dlive dlive 4096  2月 16  2016 usr
drwxrwxrwx  3 dlive dlive 4096  2月 16  2016 var

根据长亭科技文章的描述,我们可以通过搜索特征字符串的方式找到存在漏洞的binary:/bin/etm

找到binary之后,使用qemu+chroot执行etm二进制文件,发现无法直接执行

# dlive @ pwn in ~/Desktop/IoT/case-study/1-ARM-huwei_XXX/XXX/squashfs-root [14:30:21] C:125
$ sudo chroot ./ ./qemu-arm-static ./bin/etm
[sudo] password for dlive:
log.ini not exist!
logger_load_cfg log.ini fail:102301
etm_init_env fail:102301

那么接下来我们看一下启动这个二进制文件需要什么样的环境和参数

通过搜索对/bin/etm文件的调用,我们发现/bin/etm是由/etc/etm_monitor.sh启动的,/etc/etm_monitor.sh接收一个参数

/etc/etm_monitor.sh由/etc/xunlei.sh启动,/etc/xunlei.sh启动同样需要一个参数

/etc/xunlei.sh由/bin/cms启动,启动参数为624X

通过对这几个文件分析,我们可以得到etm的启动参数

并且通过对文件系统中配置文件的搜索,我们发现etm的配置文件存在于/etc目录下

所以最终etm的启动参数如下

./bin/etm --system_path=/etc --disk_cfg=/etc/thunder_mounts.cfg --etm_cfg=/etc/etm.ini --log_cfg=/etc/log.ini --pid_file=/etc/xunlei.pid --license=1411260001000003p000624lcubiwszdi3fs2og66q

我是使用树莓派进行调试的,树莓派上使用的是官方系统,在树莓派本机上可以完美调试

将gdbserver的动态链接库直接拷贝到路由器的文件目录下,然后使用chroot+gdb/gdbserver调试

sudo chroot ./ ./gdbserver :1234 ./bin/etm --system_path=/etc --disk_cfg=/etc/thunder_mounts.cfg --etm_cfg=/etc/etm.ini --log_cfg=/etc/log.ini --pid_file=/etc/xunlei.pid --license=1411260001000003p000624lcubiwszdi3fs2og66q

也可以使用qemu启动etm并开启gdb远程调试(可使用IDA或gdb调试),远程端口1234

sudo chroot ./ ./qemu-arm-static -g 1234 ./bin/etm --system_path=/etc --disk_cfg=/etc/thunder_mounts.cfg --etm_cfg=/etc/etm.ini --log_cfg=/etc/log.ini --pid_file=/etc/xunlei.pid --license=1411260001000003p000624lcubiwszdi3fs2og66q

本次调试的时候使用了一个改良过的gdb peda插件 https://github.com/kelwin/peda

远程调试:

gdb bin/etm
(gdb-peda) target remote 127.0.0.1:1234

2. 漏洞分析

对这样一个路由器上的二进制Web Server逆向分析的话注意以下几点可以提高分析效率

  1. 关注无需认证即可接触到的功能,关注用户输入,以便减少分析量
  2. 对于TCP Server,关注bind/listen/recv的使用,关注用户输入
  3. 对于UDP Server,关注bind/recvfrom的使用,关注用户输入
  4. 对于已知协议的Server,比如HTTP Server,关注一些协议关键词,如: GET/POST/Cookie
  5. 动态调试结合静态分析,关注数据流+控制流

2.1 逻辑分析

我们先大概看一下这个二进制的Web Server的整体逻辑

程序保留了部分符号,可以辅助分析,从main函数可以看出,一开始程序做了一系列的初始化和配置工作,然后才进入etm_start

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖