经验总结
MIPS环境填坑指南
2020-03-02 17:10

0x00前言

今年来IoT安全火热,2019年公众号发了一篇《QEMU搭建树莓派环境》,算是给研究ARM平台下的漏洞分析、漏洞挖掘以及熟悉ARM指令等打下了基础。

合天网安实验室也开设了相关实验课程:《ARM汇编教程》、《ARM漏洞利用技术》

ARM在移动平台,或者说物联网领域独领风骚,不过在路由器领域基本还是以MIPS为主,本文的目的就是搭建在软件层面分析路由器安全(MIPS架构下)的环境。

本文所述工具、搭建方法在2020年2月24日可以完全复现,在ubuntu16.04下展开,如果对mips架构、路由器固件安全有兴趣的师傅们可以尝试自己动手搭建这套环境,方便后续的深入分析。

至于本文为什么要取这个标题,是因为网上很多环境搭建的资料太久了,或者有很多坑那些作者没有告诉你,自己填上了,留下读者一脸懵逼。本文在搭建过程中会说明存在哪些坑以及填坑的方法,作者以人格担保,看完这篇文章,要是复现不出环境,小编的命就交给你们了。

0x01安装binwalk

直接使用apt-get install binwalk就可以了

不过这样子安装的binwalk面对如squashfs的识别提取可能无效,会报错(以kali内置的binwalk来解析某路由器固件为例)

1.jpg

这时候我们需要安装sasquatch

输入这三条命令就可以了

sudo apt-get install zlib1g-dev liblzma-dev liblzo2-dev

sudo git clone https://github.com/devttys0/sasquatch

cd sasquatch && sudo make && sudo make install

由于我ubuntu的已经安装过了,所以这三条命令就不截图说明了,直接看看对于同样的文件,安准了sqsuatch后,binwalk是否能够识别解压

2.png

可以看到此时是可以识别并提取的,固件的文件系统就在原路径下方生成的以extracterd结尾的文件夹。

0x02安装buildroot

注意这里安装的时候会提示缺少各种库文件,所以在正式安装buildroot前,我们先把相关的库文件装上

sudo apt-get install curses-devel

sudo apt-get install libncurs*

sudo apt-get update

然后下载

git clone https://github.com/buildroot/buildroot.git

进行编译的配置

cd buildroot

make clean

make menuconfig

输入上面这条命令后会出现buildroot的编译配置界面 

这里有三个地方需要我们设置

4.png

target option中设置,第一个是设置大端还是小端,由于本文是准备两个都安装(原因后面会说明),所以这里随意选择一个,第二个设置成generic mips32即可。然后是toolchain

5.jpg

这里的linux headers根据自己的内核进行选择,查看内核使用uname –r即可

6.png

设置完成后,输入make就可以开始自动编译了

这里大概要等30分钟到1个小时,根据我的观察,主要的时间是浪费在联网下载部分组件上(我已经安装过了,无法截图,等自己动手安装的时候就知道什么意思了)

针对这种情况,可以考虑在make期间直接ctrl+c终止掉,然后再继续make。

注:一般而言make情况下是不应该终止的,或者终止后需要make clean再make,不过这里的情况比较特殊,make任务是卡在下载组件上,而在此之前,一些编译的任务已经结束了,所以用我这种做法是安全的。

以小端为例,安装完成后在相关路径下会出现一些跨平台交叉编译的工具:

7.png

注意到这些名字都是mipsel开头,表示的是小端

这时候尝试编译的话,由于工具都在该路径下,我们在其他路径下编译很不方便,所以需要设置环境变量

打开/etc/profile在最后如图格式添加即可

8.png

添加完后source ~/etc/profile立即生效

也可以重启后生效

查看环境变量

9.png

接下来写一个c源程序测试下

0.png

编译后使用file查看

11.png

12.png

确实是小端

那么大端怎么编译呢?

在stackoverflow上大佬提出的解决方案是加上-EB参数

不过尝试后会报错

13.png

根据H4lo师傅的解决方案是编译、链接两步走

14.png

不过依然会报错,原因未知,所以我的解决方案是再建一个文件夹,另外编译一个大端的,方法同上,我这里已经编译好,同时环境变量也设置好了,接下里尝试使用大端的编译

15.png

可以看到是大端的。

那么我们就顺利完成了MIPS交叉编译环境的安装和测试。

0x03安装QEMU

在之前发布的文章中已经介绍了QEMU的安装方法,这里就简单给出命令,不放安装的图片了。

sudo apt-get install qemu

sudo apt-get install qemu-user-static

sudo apt-get install qemu-system

安装网络配置工具

apt-get install bridge-utils uml-utilities

修改ubuntu网卡配置文件如图所示

16.png

修改qemu网卡启动文件,如图所示

17.png

在ubuntu上关闭ens33,启动br0

sudo ifdown eth0  

sudo ifup br0

到这一步之前都是通用的,接下里的步骤根据你要搭的环境而有所不同

下载对应的内核文件和磁盘镜像,我这里以

debian_squeeze_mips_standard.qcow2

vmlinux-2.6.32-5-4kc-malta

为例

使用这条命令启动

sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic,macaddr=00:16:3e:00:00:01 -net tap

18.png

可以看到qemu正在启动

19.jpg

输入root/root

20.png

输入ifconfig注意到ip为192.168.1.107,网卡对应的为eth1

注意,如果你在操作的时候没有这一步,可以到配置文件中设置

21.png

将红色的地方改为eth1即可

回到shell后输入ifup eth1即可

这时候网就通了,我们接下来可以在ubuntu上ssh过去操作

22.png

至此,qemu的环境也搭好了

需要注意,qemu有两种运行模式,分别是use mode,和system mode,

前面的方式属于system mode.此时qemu模拟的是整个计算机系统,包括cpu及其他周边设备。

根据目的的不同,有时候可以使用user mode。这时qemu能启动那些为不同cpu编译的linux程序

以前面编译出的小端hello为例

先将小端格式的qemu-mipsel复制到当前目录下

23.png

然后传参运行

24.png

这里还有个细节需要注意

如果程序依赖动态链接库的话,如上执行是会报错的,我们重新编译hello看看是什么情况

25.png

注意这里编译时我没加上-static

此时运行会报错

这是正确的做法是:使用chroot定义根目录,以便运行前加载相应的lib库文件

如下所示

26.png

这里因为用到了qemu-mipsel-static,所以需要另外安装

apt-get install qemu binfmt-support qemu-user-static

Unicorn Engine基础教程一:

http://www.hetianlab.com/expc.do?ec=ECIDac22-afdb-4162-a8c8-134e08735f8a(以模拟x86 32位和mips架构为例,学习unicorn engine简单的使用)

0x04安装wine

很简单,apt-get wine即可

0x05安装IDAPro

新建一个文件夹,把ida下的文件全部拷贝过来

27.png

尝试运行会报错

28.jpg

以下命令安装即可

curl -O https://www.python.org/ftp/python/2.7.15/python-2.7.15.msi

wine msiexec /i python-2.7.15.msi

我们再去这里下载mips分析可能用到的插件

git clone https://github.com/devttys0/ida

把下载的ida/plugins目录下所有后缀为:,py“d的文件复制到IDA pro插件目录:

sudo cp –r  `find /home/yale/a/ida/plugins –iname *.py`  /home/yale/ida/ida/plugins/

将scrpit复制到idapro根目录下

sudo mkdir /home/yale/ida/ida/plugins/scripts

sudo cp –r ida/scripts /opt/ida61/scripts/

再次执行,可以看到ida可以正常启动,这里以之前编译出来的小端mips程序hello为例

29.png

而且下载插件都可以正常用了,以mipsrop为例

30.jpg

31.jpg

不过每次跑到ida根目录下执行wine idaq比较麻烦,这里我们可以考虑写个shell脚本

如下所示

32.png

接下来要启动ida的话我们只用使用

sh ida.sh即可

0x06配置gdb

一条命令就可以了

sudo apt install gdb-multiarch

看看效果是怎样的,以调试stack_bof_01为例

开两个终端:一个终端用于gdb调试,-multiartch是为了支持其他架构用的,比如我们这里的mips架构,另一终端执行被调试程序

33.png

设置架构为mips

34.png

设置ip和端口

35.png

按c继续执行,可以看到程序异常终止了,同时在另一个终端这儿也打印出了try again

36.jpg

0x07安装firmadyne(替代方案:attifyos)

Firmadyne是一款自动化分析嵌入式Linux系统安全的开源软件,由卡内基梅隆大学的Daming D. Chen开发完成的。它支持批量检测,整个系统包括固件的爬取、root文件系统的提取、QEMU模拟执行以及漏洞的挖掘。

搭建起来比较繁琐,外文原文在这:https://blog.attify.com/getting-started-with-firmware-emulation/

或者可以直接看知道创宇seebug收录的这篇译文https://paper.seebug.org/639/

我搭建起来后最后会碰到一个问题:

37.png

提示没有网卡的信息,这个问题我在官方的github项目地址上看到有人已经在问了,下面也有很多人讨论

38.png

不过一直没有解决方案,开发者也没有出来回应。

所以我这里给出了替代方案:使用attifyos

官方介绍说,配置IoT渗透测试所需的各种工具,当然其中已经配置好firmadyne了

项目地址在这里:https://github.com/adi0x90/attifyos

它基于ubuntu14.02开发,下载过来后是一个ova镜像,直接导入vmware就可以用,这里的安装没有什么难度,这里直接给出在attifyos上模拟运行dlink300的情况

输入fat.py启动

39.png

下图红色的地方都是需要填写的

40.jpg

环境准备好后可以看到ip信息

41.jpg

在浏览器中输入相应的ip

42.png

就成功模拟出这个环境了

0xxx后记

读者需注意,并不是所有的mips分析人物都需要用到上述的全部工具,本文只是尽量把难搭的、常用的工具介绍出来并以具体的例子给出使用方法。另外还有两款工具分别是JEB,Ghidra下载来就能直接用了,文中也不再赘述。建议读者结合自身实际情况进行参考。

初识Ghidra  http://www.hetianlab.com/expc.do?ec=ECIDdded-c215-40bd-b479-7f7cbb25e5a1 

点击链接做实验(Ghidra能运行在Windows,Mac OS和Linux上,支持多种处理器指令集,功能包括反汇编、汇编、反编译、图像界面和脚本,以及数百个功能,还可以根据API开发自己的Ghidra插件或脚本。)

上一篇:python格式化字符串研究
下一篇:从一道CTF题目谈PHP中的命令执行
版权所有 合天智汇信息技术有限公司 2013-2021 湘ICP备14001562号-6
Copyright © 2013-2020 Heetian Corporation, All rights reserved
4006-123-731