【实验要求】
针对施耐德NOE 771固件进行逆向分析,并获取到隐藏在汇编代码中的后门账号。
【实验目的】
理解固件逆向对于安全工作的意义;熟悉主要的固件逆向工具和方法;掌握IDA Pro进行静态分析的使用方式;掌握Binwalk对文件和固件的一般分析方法;
【实验原理】
1.固件
在计算机领域中固件(firmware)是一种为设备提供控制、监控、数据操作等功能的微型系统。嵌入式设备就是一些典型的含有固件的设备,BIOS也是固件的一种,同样的我们经常使用的硬盘设备也有其自己的固件。
2.VXworks
本次实验的施耐德NOE771固件所使用的底层操作系统为Vxworks 5系列,CPU结构为PowerPC。
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空及航天等高精尖技术领域中。甚至连1997年4月在火星表面登陆的火星探测器、2008年5月登陆的凤凰号,和2012年8月登陆的好奇号也都使用到了VxWorks系统。
3.固件识别和解压
固件的识别和解压,可以借用一些成熟的工具软件,如:Binwalk、BAT(Binary AnalysisToolkit)等。Binwalk和BAT均为比较流行的固件映像提取和分析工具。Binwalk以MIT License发布,BAT以GPL License发布。它们支持的固件映像解压格式对比表如下:
对于常见的嵌入式设备固件可以使用Binwalk或BAT来解压并提取固件文件。对于无法自动解压的固件,可以尝试以下方法分析:使用文件分析工具获得固件映像文件的基本数据类型。
使用字符串打印工具提取文件中所包含的明码字段,寻找是否有引导装载程序以及操作系统内核的信息。
使用十六进制转储工具(如hexdump)分析为了对齐固件文件空间分段而放入的连续填充字节,文件系统标识有可能紧跟其后。
文件系统有可能使用非标准的特征符,如果发现可疑特征符字段,可以替换为标准特征符,再尝试由固件解压工具进行识别。
4.固件静态分析
固件静态分析指的是在不对嵌入式系统进行实际运行的情况下,通过对固件文件进行逆向解析,分析固件中各代码的调用关系及代码内容从而发现嵌入式系统可能存在的漏洞及后门或针对已发现的漏洞进行定位的一种技术手段。固件静态分析过程中将会涉及到固件提取、加载地址分析等各种分析技术。
固件解压之后的分析主要集中在对常见漏洞入口进行针对性的静态分析,包括:密码、默认开启的服务、端口、配置文件等。分析方法如下:
1)尝试提取文件中包含的明码字段是否存在硬编码密码等。
2)发掘固件的关联性,包括分析固件作者、库使用、目录结构、配置文件关键字、定制默认密码等信息。
3)对二进制可执行文件进行反汇编分析,可以借用一些成熟的工具软件,如:IDA Pro、Capstone等。对特定的嵌入式系统(如VxWorks)的登录模块进行反汇编分析,获取其登录密码的哈希算法等信息。
4)如果发现包含密码哈希的文件,可考虑使用John the Ripper或Hash Suite等工具进行暴力破解。前者有版本支持GPU加速(支持CUDA和OpenCL)。使用暴力破解工具可以利用前述步骤中提取的关键字,显著加快运行效率。
5.IDA Pro
IDA Pro是应用最广泛的静态反汇编工具,它支持对大量的CPU架构进行逆向分析,包括X86、MIPS、PowerPC及Arm等。
6.Capstone
Capstone是一个反汇编框架,它支持多种平台,能够运行在Windows、Mac OS X、Linux、FreeBSD、OpenBSD和Solaris中。Capstone可反汇编ARM、ARM64(ARMv8)、MIPS、PPC和X86架构下的应用。
【实验环境】
主机操作系统:Windows、Linux、macOS选其一
主机虚拟机:VMware、VirtualBox、KVM选其一
Windows XP:IDA Pro
Kali Linux:Metasploit、Python、Capstone等
【实验步骤】
1.实验准备
准备好部署有IDA Pro的Windows虚拟机,以及可以使用binwalk、python、十六进制编辑器的环境,例如Kali虚拟机,确保虚机可以方便的进行文件拷贝,也可以使用文件服务器的方式进行共享。准备Vxworks相关文献资料,必要的时候可以直接进行查阅。
2.获取固件升级包
在通常情况下,我们通过官网获取到的固件升级包,是一个包含了嵌入式固件的一个升级包。我们需要从该升级包中将真正的固件提取出来进行分析。
从施耐德官方网站下载固件升级包,从该升级包中提取固件文件。NOE 771的固件文件名为NOE77101.bin。
3.识别和解压升级包
提取固件通常的方法是使用Binwalk等二进制分析工具对固件升级包进行自动化分析,待确认升级包类型后在进行解压或其他操作。
NOE771的固件文件名为NOE77101.bin,首先我们需要使用Binwalk来确认该文件的类型。通过使用Binwalk进行自动分析可以发现,该固件升级包包含了一个zlib压缩的文件。
Binwalk支持提取zlib压缩的文件,我们可以通过如下命令进行解压
Binwalk-e NOE77101.bin
解压后的文件385将存储在_NOE77101.bin.extracted目录中,并以文件在固件升级包中的起始位置来命名。
下图为解压固件升级包结果。
4.固件提取
通过继续使用Binwalk对解压后的385文件进行分析可见,Binwalk已成功的分析出了固件中的一些路径名等信息,由此可见该文件的确是NOE771所加载的固件文件。
下图查看固件主要文件路径和程序结构以及版本信息。
5.分析固件内存加载地址
由于嵌入式系统的固件需要加载到内存中的特定位置进行运行,这个特定的位置就叫做固件加载地址(base address)。
嵌入式系统的固件内的一些绝对地址调用(例如字符串)均是基于固件加载地址所计算出的内存地址,而不是固件文件中的偏移量地址。例如某函数调用了内存位置为0x30000的字符指针,且我们的固件加载地址为0x10000,那么该字符串在固件文件中的实际位置就是“内存位置”-“固件加载地址”,也就是0x20000。
因此为了使IDA能够正确的对代码进行解析,我们需要分析出固件的加载地址,否则所有涉及到绝对地址调用的代码解析都将是错误的。
某些固件会采用一些封装,比较典型的封装方法是使用ELF封装。通过封装后的ELF文件头部有特定的数据位记录了该固件的加载地址,因此针对该情况我们可以直接读取ELF文件头,从而直接获取到固件的加载地址。
ELF的全称是Executable and Linkable Format,常被称为ELF格式。通过使用greadelf之类的工具可以轻松的获取ELF文件的信息。
由于NOE771的固件并没有采用任何封装,因此针对NOE771的固件我们将通过分析固件头部的代码来大致猜测固件的加载地址。
使用IDA Pro分析嵌入式系统固件的话,首先我们需要确认目标的CPU类型从而选择正确的反汇编引擎。我们可以通过使用Binwalk–A命令来分析。