debug router

This commit is contained in:
Cool-Y 2019-07-25 22:34:14 +08:00
parent 2f7cabcd43
commit 4c83566dbd

View File

@ -10,15 +10,17 @@ categories:
--- ---
# 0x00 背景与简介 # 0x00 背景与简介
--------------
在分析嵌入式设备的固件时只采用静态分析方式通常是不够的你需要实际执行你的分析目标来观察它的行为。在嵌入式Linux设备的世界里很容易把一个调试器放在目标硬件上进行调试。如果你能在自己的系统上运行二进制文件而不是拖着硬件做分析, 将会方便很多这就需要用QEMU进行仿真。 在分析嵌入式设备的固件时只采用静态分析方式通常是不够的你需要实际执行你的分析目标来观察它的行为。在嵌入式Linux设备的世界里很容易把一个调试器放在目标硬件上进行调试。如果你能在自己的系统上运行二进制文件而不是拖着硬件做分析, 将会方便很多这就需要用QEMU进行仿真。
虽然QEMU在模拟核心芯片组包括CPU上都做的很不错但是QEMU往往不能提供你想运行的二进制程序需要的硬件。最常见问题是在运行系统服务如Web服务器或UPnP守护进程时缺乏NVRAM。解决方法是使用nvram-faker库拦截由libnvram.so提供的nvram_get()调用。即使解决了NVRAM问题该程序还可能会假设某些硬件是存在的如果硬件不存在该程序可能无法运行或者即便它运行了行为可能也与在其目标硬件上运行时有所不同。针对这种情况下我认为有三种解决方法 虽然QEMU在模拟核心芯片组包括CPU上都做的很不错但是QEMU往往不能提供你想运行的二进制程序需要的硬件。最常见问题是在运行系统服务如Web服务器或UPnP守护进程时缺乏NVRAM。解决方法是使用nvram-faker库拦截由libnvram.so提供的nvram_get()调用。即使解决了NVRAM问题该程序还可能会假设某些硬件是存在的如果硬件不存在该程序可能无法运行或者即便它运行了行为可能也与在其目标硬件上运行时有所不同。针对这种情况下我认为有三种解决方法
1. 修补二进制文件。这取决于期望什么硬件,以及它不存在时的行为是什么。 1. 修补二进制文件。这取决于期望什么硬件,以及它不存在时的行为是什么。
2. 把复杂的依赖于硬件的系统服务拆分成小的二级制文件。如跳过运行Web服务器仅仅从shell脚本运行cgi二进制文件。因为大多数cgi二进制文件将来自Web服务器的输入作为标准输入和环境变量的组合并通过标准输出将响应发送到Web服务器。 2. 把复杂的依赖于硬件的系统服务拆分成小的二级制文件。如跳过运行Web服务器仅仅从shell脚本运行cgi二进制文件。因为大多数cgi二进制文件将来自Web服务器的输入作为标准输入和环境变量的组合并通过标准输出将响应发送到Web服务器。
3. 拿到设备的shell直接在真机上进行调试这是最接近真实状况的方法。 3. 拿到设备的shell直接在真机上进行调试这是最接近真实状况的方法。
--------------
# REF # REF
------------
**综合:** **综合:**
[国外大神的博客](https://shadow-file.blogspot.com/2015/01/dynamically-analyzing-wifi-routers-upnp.html) [国外大神的博客](https://shadow-file.blogspot.com/2015/01/dynamically-analyzing-wifi-routers-upnp.html)
[通过QEMU和IDAPro远程调试设备固件](https://wooyun.js.org/drops/%E9%80%9A%E8%BF%87QEMU%20%E5%92%8C%20IDA%20Pro%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E8%AE%BE%E5%A4%87%E5%9B%BA%E4%BB%B6.html) [通过QEMU和IDAPro远程调试设备固件](https://wooyun.js.org/drops/%E9%80%9A%E8%BF%87QEMU%20%E5%92%8C%20IDA%20Pro%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95%E8%AE%BE%E5%A4%87%E5%9B%BA%E4%BB%B6.html)
@ -43,9 +45,10 @@ categories:
[《家用路由器0day漏洞挖掘》部分案例](https://ray-cp.github.io/archivers/router_vuln_book_note) [《家用路由器0day漏洞挖掘》部分案例](https://ray-cp.github.io/archivers/router_vuln_book_note)
[TP-LINK WR941N路由器研究](https://paper.seebug.org/448/) [TP-LINK WR941N路由器研究](https://paper.seebug.org/448/)
------------
# 0x01 基础条件 # 0x01 基础条件
----------
- 一系列的工具,包括: - 一系列的工具,包括:
**binwalk** 帮助你解包固件 **binwalk** 帮助你解包固件
**buildroot** mips交叉编译环境帮助你在x86平台下编译mips架构的目标程序 https://xz.aliyun.com/t/2505#toc-6 **buildroot** mips交叉编译环境帮助你在x86平台下编译mips架构的目标程序 https://xz.aliyun.com/t/2505#toc-6
@ -59,9 +62,10 @@ categories:
在qemu系统模式下需要模拟整个计算机系统 在qemu系统模式下需要模拟整个计算机系统
----------
# 0x02 qemu-用户模式 # 0x02 qemu-用户模式
----------
在user mode下使用qemu执行程序有两种情况一是目标程序为**静态链接**那么可以直接使用qemu。另一种是目标程序依赖于**动态链接**库,这时候就需要我们来**指明库的位置**,否则目标程序回到系统`/lib`文件下寻找共享库文件。 在user mode下使用qemu执行程序有两种情况一是目标程序为**静态链接**那么可以直接使用qemu。另一种是目标程序依赖于**动态链接**库,这时候就需要我们来**指明库的位置**,否则目标程序回到系统`/lib`文件下寻找共享库文件。
*《揭秘家用路由器0day》* 这本书里面,他给出的方法是: *《揭秘家用路由器0day》* 这本书里面,他给出的方法是:
```shell ```shell
@ -141,9 +145,10 @@ miniupnpd[7687]: iptc_init() failed : iptables who? (do you need to insmod?)
miniupnpd[7687]: Failed to init redirection engine. EXITING miniupnpd[7687]: Failed to init redirection engine. EXITING
``` ```
-----------
# 0x03 qemu-系统模式 # 0x03 qemu-系统模式
-----------
系统模式命令格式:`$qemu system-mips [option][disk_image]` 系统模式命令格式:`$qemu system-mips [option][disk_image]`
## MIPS系统网络配置 ## MIPS系统网络配置
@ -198,9 +203,10 @@ $ sudo ifup br0
我自闭了ubuntu18根本没法联网于是我用了ubuntu14.0 我自闭了ubuntu18根本没法联网于是我用了ubuntu14.0
------------
# 0x04 在mips虚拟机中调试 # 0x04 在mips虚拟机中调试
------------
现在通过上面的配置我得到了这样一台虚拟机并通过ssh连接上去。 现在通过上面的配置我得到了这样一台虚拟机并通过ssh连接上去。
```shell ```shell
root@debian-mipsel:/home/user/mi_wifi_r3_112# ifconfig root@debian-mipsel:/home/user/mi_wifi_r3_112# ifconfig
@ -292,10 +298,11 @@ root@debian-mipsel:/home/user/mi_wifi_r3_112# daemon(): No such file or director
但是我们不是可以拿到路由器的shell吗干嘛还要用qemu模拟再调试直接上真机 但是我们不是可以拿到路由器的shell吗干嘛还要用qemu模拟再调试直接上真机
---------------
# 0x05 设备上调试程序 # 0x05 设备上调试程序
---------------
> 1、有shell权限 > 1、有shell权限
> 2、有静态编译的gdbserver或者gdb > 2、有静态编译的gdbserver或者gdb
> >