翻译:shan66
预估稿费:250RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
传送门
前言
本文是物联网漏洞利用和渗透测试系列中的第二篇文章。在这篇文章中,我们将考察物联网设备体系结构中的一个关键组件——固件。
您使用的任何物联网设备,都会与固件进行交互,固件可以被视为在物联网或嵌入式设备上运行的实际代码。在本文中,我们将首先介绍从固件中提取文件系统的各种方法,然后会进一步深入分析相应的二进制漏洞。物联网设备最常见的架构是ARM和MIPS,这也是本系列稍后将要介绍的内容。
在深入探讨固件之前,我们首先来了解一下该组件相关的知识,例如文件系统类型、压缩技术、加密技术和引导加载程序(bootloader)。
固件的组成
文件系统类型:
在固件分析的过程中,我们将遇到各种各样的文件系统,如Squashfs、Cramfs、YAFFS2等。文件系统的选择主要取决于创建该嵌入式设备的开发人员,以及他们想要提供的其他功能,这些功能可能
某个文件系统中可用,而在另一个文件系统中则不支持该功能。例如,Squashfs是一个压缩型的Linux只读文件系统,它是嵌入式设备中最常见的文件系统之一。
在http://elinux.org/file_systems页面中,提供了一个完整的文件系统的清单。
如果固件映像是基于文件系统类型的话,那么我们就可以尝试挂载它并分析其中的内容了。
如果要想确定文件系统所在的位置的话,我们可以使用Binwalk。我们稍后将在本文中详细讨论Binwalk的各种法,但现在,我们只是用它来找出文件系统所在的确切地址。
为了在我们的系统上安装jffs2映像,我们要做的第一件事就是在RAM中提供一个MTD分区,具体大小由total_size指定。
modprobe mtdram total_size=25247744
接下来,我们将创建一个块设备,通过它我们就可以访问相应分区了,然后加载对jffs2文件系统的支持,因为它不是默认启用的。
modprobe mtdblock
modprobe jffs2
接下来的要做的是从上面的位置复制文件系统,并使用dd命令将其输出到一个新文件中。
一旦完成上面的工作,我们就可以把将文件系统从所建的文件(filesys)中复制到mtdblock0了。
之后,我们可以使用mount挂载文件系统,以便我们可以访问它。我们可以通过mount的帮助信息来了解如何挂载我们的映像。
由于我们知道该文件系统的类型是jffs2,所以我们可以直接通过手册页中相应的提示来使用mount命令。 因此,我们只需在当前位置创建一个名为jffs2的新文件夹,然后将mtdblock挂载到该目录即可。
从上图可以看到,这样我们就可以访问整个文件系统了。这只是一个例子,旨在说明如何访问固件的文件系统。稍后,我们将看到其他更简单的技术,同样可以达到该目的。
压缩和加密:
上面介绍了固件的文件系统,接下来开始讲解与固件相关的其他方面的知识:即压缩和加密。嵌入式设备中的文件系统通常都会进行压缩处理,以节省空间。 IoT设备文件系统中最常见的压缩技术是LZMA、GZIP、Zlib、Zip和ARJ等等。
下面,让我们通过实践来掌握这些知识。我们知道,许多LZMA压缩型Squashfs文件系统供应商都会使用幻数shsq。 因此,我们可以在固件上运行hexdump,然后使用grep命令来获取固件的起始地址。
正如上面所看到的那样,我们在0x000e0080处发现了shsq魔法数字。现在,我们已经知道了文件系统的起始地址,所以可以使用dd来转储其内容了。
我们知道,它的文件类型是squashfs,所以我们可以运行unsquashfs,以便进入文件系统。其中,-l表示列出文件系统的内容。
如果运行unsquashfs -h,它将显示该工具unsquashfs已经支持lzma压缩。
所以,我们可以直接从filesystem.bin中提取该文件系统。
这会创建一个名为squashfs-root的文件夹,其中含有已提取的整个文件系统。这样,我们就可以通过分析单个二进制文件或查看配置文件来识别漏洞了。
引导加载程序:
引导加载程序是用来帮助加载引导整个系统的组件,任何设备都含有该组件。它会帮助完成整个系统的相关设置,然后加载用于加载整个文件系统的内核。
最常见的引导加载程序包括Das uBoot、Redboot、CFE等等。我们将在本系列的后续文章中继续介绍引导加载程序,但现在,我们点到为止。
有关启动加载器的更多信息,请访问:http://www.informit.com/articles/article.aspx?p=1647051。
一旦我们了解了固件,就能够:
为了能够进行固件分析,首先要了解如何获取固件。通常情况下,有两种方法可以获得特定设备的固件:
从制造商的网站获取固件:许多物联网设备制造商的网站都支持固件下载功能,以便用户可以下载并手动更新设备。
通过硬件利用技术从设备转储固件:为此,可以通过使用串行通信(例如UART或JTAG)或使用SPI Flash来实现固件转储。我们将在后面的文章中详细讨论这种技术。
一旦取得了固件,就可以进一步施展我们的分析技术了。我们将使用Damn Vulnerable Router Firmware作为练习之用,下载地址 https://github.com/praetorian-inc/DVRF
在得到了DVRF.bin(固件)之后,我们可以进行十六进制转储,看看能否识别出它所属的设备,以及是否能够找到一些额外的信息。
从十六进制转储可以看出,虽然大多数信息都没有意义,但是有两个字符串非常引人注目—— u2nd和hdr0。只要通过google搜索一下,我们就会知道,这是一个Linksys的相关产品。
甚至在这种情况下,我们这里得到的固件信息,对于漏洞利用开发来说,仍然远远不够。因此,在完成了十六进制转储之后,接下来,我们还需在其上运行binwalk。
Binwalk是由Craig Heffner(@ devttys0)创建的固件逆向工程工具,用于帮助渗透测试人员和安全研究人员分析理解固件。该工具能够支持各种文件系统的压缩和加密技术,并且已经成为固件逆向工程工具方面的一个标杆。binwalk的安装非常简单,只要按照该项目的Github页面上的指示进行操作即可,该页面的具体地址为https://github.com/devttys0/binwalk/blob/master/INSTALL.md。
在系统上安装好binwalk之后,下一步就是使用binwalk来分析固件并了解其中存在的不同部分了。 当我们在DVRF.bin上运行binwalk时,将看到如下所示的内容。
从上面我们可以看到,头部从0x20处开始,一直延续到到0x3c处,然后是文件名为piggy的gzip压缩数据,最后是从0x192728处开始的squashfs文件系统。
所以,我们开始使用binwalk来提取piggy和squashfs文件系统。当然,你也可以使用dd来提取这两个文件,但是使用binwalk的话,事情会变得更加轻松。
在DVRF.bin上运行binwalk进行提取操作之后,我们就得到了文件系统的内容和存储在固件内的附加数据。
binwalk -e DVRF_0.3.bin
通过观察提取到的文件系统不难发现,这是一个基于Linux的操作系统。在对固件进行逆向工程的时候,Linux是最为常见的操作系统,当然还会遇到其他诸如VxWorks和eCOS之类的操作系统。
一旦我们提取了固件,下一步就是查看固件中存在的各种二进制文件并通过分析它们来识别安全漏洞。为了先摘取低垂的苹果,一个简单的方法是检查常见的二进制文件的版本,如busybox,并查看是否可以找到与这个版本相关的漏洞。
现在,让我们来考察Dlink设备的固件。 为此,我们只需从相应网站下载固件,并使用binwalk从固件中提取文件系统。
binwalk -e Dlink.bin
让我们尝试在此固件中搜索机密的凭证。Telnet似乎是一个很好的起点,因为它可以提供访问运行此固件的设备的访问权限。
如果我们对telnet执行grep,我们可以看到,有一个位于/etc/scripts/misc/telnetd.sh的文件。
如果打开这个文件,我们会看到如下所示的内容。
我们可以从文件中看到,它确实包含以Alphanetworks为用户名登录到telnet会话的代码,并且密码是由$ image_sign指定的文件的内容。如果我们仔细观察就会发现,就在脚本的第二行,$ image_sign变量就是保存文件/ etc / config / image_sign的内容的。
所以,如果我们只要对/ etc / config / image_sign文件执行cat操作,我们就能得到telnet的登录密码。下面是一样的。
因此,我们能够通过Dlink路由器的固件逆向分析其文件系统,进而从中获取telnet登录凭据。
自动化工具
实际上,还有许多自动化的工具可用于固件的静态和动态分析。其中一个流行的自动化工具是由Craig Smith开发的Firmwalker,它通过考察相关的字符串来对固件执行静态分析。
为了运行Firmwalker,需要克隆github repo并让firmwalker.sh指向提取到的固件文件系统。
git clone https://github.com/craigz28/firmwalker.git
cd firmwalker
一旦完成上述操作,只需在binwalk上提取的文件系统上运行firmwalker.sh即可。就本文来说,我们将在Damn Vulnerable Router Firmware的文件系统上运行firmwalker.sh。
总体来说,firmwalker是一个非常棒的固件分析入手工具,能够帮您找到感兴趣的文件,以便进行更深入的分析。
当然,还有其他的自动化工具,它们同样可以用于固件的静态和动态分析。只是由于它们的安装更为复杂,需要更深入的说明,所以我们将它们安排在后面的文章中进行专门的介绍。
使用反汇编工具分析二进制文件
在我们提取了固件之后,最重要的漏洞利用技术之一,就是通过反汇编工具来分析我们感兴趣的二进制文件。一旦你提取了Damn Vulnerable Router Firmware,你会发现在squashfs-root / pwnables / Intro /下面有一个非常让人感兴趣的二进制软件。
你可以通过一些工具,如objdump、IDA甚至在线反汇编工具对这些感兴趣的文件进行反汇编处理。例如,如果我们利用onlinedisassembler.com对位于pwnables / Intro / stack_bof1的二进制文件进行反汇编,我们就能看到该二进制文件中的各种函数以及每个函数的反汇编代码。
下面的截图显示了onlinedisassembler.com对于stack_bof1的反汇编结果。
此外,就像任何其他高级反汇编器一样,onlinedisassembler也具有显示整个反汇编的图形布局的功能,具体如下所示。
本文中,我们介绍了物联网设备固件分析的入门知识。在下一篇文章中,我们将介绍如何仿真固件,以及如何实时调试固件内的二进制文件。
参考文献
Binwalk installation guide
BH USA 2013: Firmware Reverse Engineering by Jonas Zaddach and Andrei Costin
Reversing Auerswald firmware: https://cweiske.de/tagebuch/auerswald-firmware.htm
Embedded system bootloader:https://en.wikibooks.org/wiki/Embedded_Systems/Bootloaders_and_Bootsectors
传送门
发表评论
您还未登录,请先登录。
登录