购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.4 电子取证分析

在CTF比赛中,我们会遇到一类被称为“Forensics”,(也称为电子取证或计算机取证)的题目,这类题目常常被归于MISC范畴。上节所讲的流量分析也是电子取证的一种。目前,电子取证已经成为计算机领域和法学领域的一门交叉学科。

电子取证并没有一个统一的定义,但目前较为广泛的认识是:电子取证是指利用计算机软硬件技术,以符合法律规范的方式,对存在于计算机和相关电子设备中的相关电子证据进行确认、收集、恢复、保全、固化、分析、归档和呈现。尽管电子取证通常与各种计算机犯罪的调查有关,但电子取证也可以用于民事诉讼。

电子取证的基础是诺卡德交换原理(也叫物质交换原理),当两个对象接触时,物质就会在这两个对象之间发生交换或传送。这个原理说明,只要介质之间发生过数据转移,就会留下痕迹,电子取证就是要发现这些痕迹。但是,这个原理也说明,取证人员与被取证设备的交互越多,系统发生更改的概率越高,电子证据被更改或覆盖的概率越大。这就要求在进行取证时不要任意更改目标机器或者目标网络环境,应做好相关备份。

1.4.0 电子取证的常用技术

1.文件识别技术

几乎所有电子取证题目都会提供一个文件,通常需要在没有后缀的情况下猜测这个文件的功能,此时我们要先识别文件类型。每个文件都有自己独特的文件格式,识别文件类型的本质是从文件头或文件尾发现文件格式的特征,根据特征判断文件类型。每种文件格式的文件头都有独特的设计,一般通过文件头即可识别文件类型,文件头的这一字段也叫作magic number(魔数或者幻数)。常见的文件头特征如表1.4.1所示。

表1.4.1 常见的文件头特征

识别文件类型有两种方法:①利用十六进制编辑器手工查看文件头;②利用现成的工具判断文件类型。我们推荐采用010 Editor作为十六进制编辑器,该工具在Windows系统下使用,打开文件即可以十六进制方式查看,操作非常方便,是解答MISC类题目的 必备工具 ,建议初学者一定要安装。

在Linux系统(Ubuntu或者Kali等)下,通过 file命令 也可以快速查看文件类型。具体方法为:打开终端,输入file,将要识别的文件拖入终端,终端会自动补全命令,按回车键即可得到结果。如图1.4.1所示,图中的文件被识别为文本文件。建议大家熟记上述文件特征,在比赛中可以先进行人工识别,再利用file命令查看。

图1.4.1 file命令判断文件类型

2.strings命令

strings是CTF中的 必用命令 ,有些貌似很难的题目,使用strings命令就能很容易地找到flag,因此初学者一定要重点掌握。这个命令可以在对象文件或二进制文件中查找可打印的字符串,字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。

strings命令的使用方法和file命令完全一样,但有更多的选项设置。该命令的语法格式为:

其中:

❑-a--all:扫描整个文件而不是只扫描目标文件初始化和装载段。

❑-f-print-file-name:在显示字符串前先显示文件名。

❑-n-bytes=[number]:找到并且输出所有NUL终止符序列。

❑-:设置显示的最少字符数,默认是4个字符。

❑-t--radix={o,d,x}:输出字符的位置,基于八进制、十进制或者十六进制。

❑-o:类似--radix=o。

❑-T--target=:指定二进制文件格式。

❑-e --encoding={s,S,b,l,B,L}:选择字符编码方式,s=7-bit(即ASCII码,默认方式)、S=8-bit、b=16-bit(大端)、l=16-bit(小端)、B=32-bit(大端)、L=32-bit(小端)。

3.binwalk命令

binwalk命令用于识别嵌入固件镜像的文件和代码。但在CTF比赛中,它的使用更加广泛,可以根据文件头魔数来识别和提取对象文件中的其他文件,因此成为取证、隐写等题目的必用工具。Kali虚拟机中一般会自带binwalk命令,但在某些版本的Kali中,binwalk命令无法使用,此时可以通过官网https://github.com/ReFirmLabs/binwalk在Kali或者Windows中手动安装。

binwalk命令的用法和file命令完全相同,如图1.4.2所示。当命令中没有任何选项时,binwalk只能检测(识别)对象中有哪些文件,检测结果有3列,第1列代表十进制,表示检测出的文件距离原文件开头的偏移字节数;第2列是第1列数对应的十六进制,第3列是对检测出来的文件的详细说明。图中的信息表示从原GIF文件中检测出6个zip压缩包,并说明了每个压缩包中包含的文件。

图1.4.2 binwalk使用方法

如果检测出的文件中有我们感兴趣的文件,那么需要将这些文件提取出来。“-e”选项可以根据默认的预定义配置文件extract.conf,自动从对象中提取文件。带“-e”选项的命令运行结果和图1.4.2完全一样,如果成功提取文件,就会在终端的执行目录下生成一个新文件夹,文件夹的名字是:“_”+对象名字+“.extracted”。从对象中提取出来的文件都会保存到这个文件夹,这里有个细节需要注意,文件夹生成的位置和终端运行时所在的路径有关,建议在运行binwalk命令前将所在路径设置为桌面。

本节所介绍的工具(010 Editor)和相关命令(file、strings、binwalk)都是MISC类题目的 必用工具和命令 ,几乎所有杂项题目都可能用到,建议初学者一定要掌握,并搭建好相关运行环境。

1.4.1 文件恢复

文件恢复在CTF比赛中涉及的知识点较多,但很少作为一个单独的考点出现,一般会作为一个隐含的知识点进行考查。常见的文件恢复题目包含以下几种:文件头损坏修复;文件被拆分为若干片段,需要拼接复原;根据临时文件或者中间文件恢复原文件;恢复被删除文件等。本节重点介绍利用文件格式修复和利用临时文件恢复原文件,而被删除文件的恢复则放在后续章节中介绍。

文件头修复和文件拼接复原的原理是一样的,都需要熟练掌握不同文件的文件格式。通过残留的文件格式信息可以确定文件类型,然后通过修复文件头部使文件正常打开。这就需要初学者掌握常见文件的文件格式,压缩文件格式会在1.5节中详细说明,图像和音频文件格式会在第2章详细说明。

【例题】decipherme

【题目来源】 2016 Pragyan。

【题目描述】 找到flag。

【解题思路】 文件没有后缀,file命令也无法识别。在010 Editor中打开文件,如图1.4.3所示,文件头不是我们熟悉的格式,第一行最后4个字节是“49 48 44 52”,对应的ASCII码是“IHDR”,这个字段是PNG文件格式的第一个数据块,其余的字符串(例如:sRGB,gAMA, pHYs等)也都是PNG文件格式中的数据块名称。因此,可以确定这个文件是PNG文件,但是文件头有异常。我们可以打开一个正常的PNG文件和这个文件进行逐字节比对。如果手头没有现成的PNG图片文件,一个简单的方法是利用计算机自带的“画图”工具,保存成PNG图片,然后进行修复。修改后的头部如图1.4.4所示,打开修复后的图片,即可看到flag:cyber_punk。

图1.4.3010 Editor显示结果

图1.4.4 PNG文件头修复后

通过临时文件恢复出原文件也是曾经多次出现的比赛题目。由于每种临时文件都不相同,因此限于篇幅不能一一讲述。本节主要讲解Vi m中间文件的恢复,其他类型中间文件的恢复方法,大家可以自行总结。Vim是从Vi发展而来的一个Linux系统下的编辑器,可以通过在终端输入“sudo apt-get install vim”完成安装。

用vim打开一个文件时,会产生一个.swp的隐藏文件,该文件的命名规则是:“.”+原文件全名+“.swp”。这个文件是一个临时交换文件,可备份缓冲区中的内容,因此用于保存数据。当文件非正常关闭(例如直接关闭终端或者计算机断电等)时,临时文件不会被删除,可用此文件来恢复;当正常关闭时,此文件会被删除。如果没有对文件进行修改,而只是读取文件,是不会产生.swp文件的。通过“vim-r”可以恢复原文件。

【例题】104

【题目来源】 2018年央企大赛。

【题目描述】 找到flag。

【解题思路】 通过file命令可以知道这是一个Vim的swap文件,也就是上面所讲的临时文件。将文件名字改为“.file.txt.swp”,我们可以知道原文件名为“file.txt”,将终端路径改为该文件所在路径,在终端输入命令“vim -r file.txt”,Vim会完成修复,如图1.4.5所示,再按回车键,就可以看到file.txt文件的内容,将文件保存并退出,即可在该路径下看到生成的file.txt文件。

上面的方法略显复杂,另一种更简洁的方法是利用strings命令或者使用010 Editor打开原文件,即可在文件底部发现flag。如果初学者不认识临时文件的格式或者不知道某类临时文件如何恢复,那么建议尝试这种更为通用的方法。

图1.4.5 利用Vim命令修复临时文件

1.4.2 磁盘取证分析方法

在一般的数据取证工作中,为了保全证据,在获取证据介质后,首先要做的就是对介质数据进行全盘镜像备份。在制作完镜像备份后,接下来要做的就是对镜像进行数据提取了。在CTF比赛中,磁盘取证类题目一般会提供一个磁盘镜像,选手要综合利用磁盘存储和文件系统的知识来提取磁盘镜像文件中的flag。

我们先来了解一下文件系统的概念。文件系统是一种存储和组织计算机数据的方法,可以方便地访问和查找文件数据。文件系统使用 文件和树形目录 的抽象逻辑概念代替了硬盘和光盘等物理设备使用的数据块的概念。用户使用文件系统来保存数据,不必关心数据实际保存在硬盘(或者光盘)的数据块上的地址,只需要记住这个文件所属的目录和文件名即可。

文件数据除了文件的实际内容外,还包含 文件权限(RW X) 文件属性(所有者、群组、时间参数等) 。在Linux系统下,文件系统通常会把这两部分数据放到不同的块,权限与属性放置到inode中,实际数据则放置到数据块(block)中。另外,还有一个Superblock会记录文件的整体信息,包括inode与block的总量、使用量、剩余量等,每个inode和block都有编号。这三个数据的意义简要说明如下:

❑Superblock:记录文件的整体信息,包括inode与block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。

❑inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号。

❑block:实际记录文件的内容,若文件太大,会占用多个block。

常见的磁盘镜像格式如下:

❑Windows:FAT12、FAT16、FAT32、NTFS。

❑Linux:EXT2、EXT3、EXT4。

不同格式的文件系统在读取文件时的方法也不尽相同。例如,对于EXT2和EXT3格式的磁盘镜像,如图1.4.6所示,文件系统先格式化出inode(较小的长方形)与block(较大的长方形)的区块,假设某一个文件的属性与权限数据被放置到inode4,而这个inode记录了文件数据的实际放置点为2,7,13,15这四个block,操作系统根据文件的inode信息排列读取顺序,然后一次性读出4个block的内容。

图1.4.6 文件系统读文件数据

文件雕复技术

文件雕复(File Carving)是电子取证中经常使用的一种文件恢复技术,它从表面上无差别的二进制数据集(即原始磁盘映像)中提取或恢复文件,而不是利用磁盘映像的文件系统类型。这个过程就如同在一块光滑的石头上雕刻出许多图案一样,这也是“文件雕复”这个名字的由来。其本质仍然是基于格式分析的文件识别和恢复,通常需要扫描原始字节,检查文件头和文件尾并将其排序。

在CTF比赛中,建议大家使用工具去解决这类题目,这里推荐WinHex和DiskGenius这两款工具。实践证明,综合使用这两个工具往往会有非常不错的效果。DiskGenius是国产工具,操作安装简便,读者们可自行学习。本节通过例题重点讲述WinHex的使用。

【例题】haha

【题目来源】 2016 PCTF。

【题目描述】 找到flag。

【解题思路】通 过file命令识别出文件是EXT2格式。打开WinHex Pro,拖入文件,在“Specialist”工具栏选择“Interpret Image File As Disk”,如图1.4.7所示,这个功能是把磁盘镜像文件视为原始物理磁盘或分区,相当于在WinHex中挂载这块磁盘。操作后的结果如图1.4.8所示,可以看到镜像中有0、1、10等几百个文件,双击每个文件后可以发现这些文件都只有一个字节。选中要提取的第一个文件(文件名为“0”),按住<Shift>键,再选中要提取的最后一个文件(文件名“99”),就可以实现要提取文件的全选。在选中区域单击鼠标右键,如图1.4.9所示,选择“Recover/Copy”,如图1.4.10所示,在“Output Path”中选择好保存路径,单击OK,即可提取出选中的所有文件。每个文件中只有一个字节,文件名从0~253,应该是把文件中的字节按照文件名的顺序拼接,就能找到flag。编写脚本haha.py,按0~253的顺序读取每个文件,把字节拼接再输出,并且需要把脚本和恢复得到的254个文件放到同一个文件夹下,运行命令:python2 haha.py,即可得到答案:PCTF{P13c3_7oghter_i7}。

图1.4.7 选择“Interpret Image FileAs Disk”

图1.4.8 在WinHex中挂载磁盘镜像文件

图1.4.9 从WinHex恢复文件

图1.4.10 恢复文件时注意选择保存路径

1.4.3 内存取证分析方法

网络攻击日益隐蔽化使得部分关键电子证据只能保存于物理内存中,传统的基于文件系统的磁盘取证无法有效解决这个问题。通过对内存数据的全面备份与仔细分析,提取出网络攻击的关键电子证据,这就是内存取证。内存取证作为磁盘取证的重要补充,是计算机取证科学的重要组成部分。

在CTF比赛中,内存取证类题目都会提供内存镜像文件,需要参赛选手对镜像文件做深入分析。对于有些非常简单的内存取证题目,通过strings或binwalk命令就能找到flag;但是更多的题目需要用到专业分析工具Volatility,其Github项目网址为:https://github.com/volatilityfoundation/volatility。该项目在Python2.6以上才能运行,但不支持Python3。2019年,Volatility Foundation组织利用Python3重写代码,新的项目网址为https://github.com/volatilityfoundation/volatility3。读者可根据自己电脑的配置选择安装不同版本的Volatility。

Volatility通常是Kali虚拟机中自带的,它是一个开源的取证框架,能获取内核的数据结构,使用插件获取内存的详细情况和运行状态,同时可以直接转储系统文件,进行屏幕截图,查看进程等。内存取证题目中的“套路”比较少,但需要对Volatility的各种插件非常熟悉。Volatility的用法如下:

<插件>部分的常用插件选项包括:

❑imageinfo:显示目标镜像的摘要信息,知道镜像的操作系统后,就可以在--profile中带上对应的操作系统。

❑pslist:该插件列举出系统进程,但它不能检测出隐藏的进程。

❑psscan:可以找到先前已终止的进程以及被rootkit隐藏的进程。

❑pstree:以树的形式查看进程列表,和pslist一样,它也无法检测出隐藏的进程。

❑mendump:提取出指定的进程。

❑filescan:扫描所有文件列表。

❑hashdump:查看当前操作系统中的password hash,例如Windows的SAM文件内容。

❑svcscan:扫描Windows的服务。

❑clipboard:查看系统剪贴板中的信息。

❑connscan:查看网络连接。

❑lsadump:从注册表中提取出已解密的LSA密钥信息。LSA是Windows系统本地安全认证的模块,它会存储用户登录其他系统和服务时所使用的用户名和密码。

❑procdump:将进程转储为一个可执行文件。

❑memdump:转储进程的可寻址内存。

除了上述自带的一些插件,Volatility还提供了插件社区项目,地址为https://github.com/volatilityfoundation/community,但这个项目没有给出详细说明。每个文件夹是插件制作者的姓名,文件夹内才是插件真正的名称。插件的安装和使用方法见项目内的描述,这里我们介绍一些社区插件:

❑mimakatz:提取内存中的密码,使用前需要安装依赖sudo pip install construct==2.5.5-reupload,作者是Francesco Picasso。

❑ndispktscan:搜索内核的网络流量包信息,作者是Adam Bridge。

❑chrome_ragamuffin:分析内存中的Chrome浏览器运行实例,可以分析正在浏览的页面,作者为Alessandro DeVito。

❑rdpkeys:分析Windows RDP远程连接的数据,提取密钥,可配合Wireshark对抓取的RDP流量解密,作者为Bartosz Inglot。

❑powersh:对内存中(隐藏)的powershell进程进行分析,作者是Cesare Pizzi。

❑lastpass:从浏览器内存空间中读取账户密码信息,作者是Kevin Breen。

❑bitlocker:提取BitLocker全卷加密密钥(FVEK),可以用来解密BitLocker卷,只支持Windows Vista/7,作者是Marcin Ulikowski。

❑volatility-bitlocker:bitlocker的同类插件,支持Windows7/8/10。

【例题】flag.7z

【题目描述】 找到flag。

【解题思路】 解压后,在Kali虚拟机终端输入“volatility -f flag imageinfo”,可以获取题目的基本信息。对于本题而言,没有profile信息也不会有影响,但是建议平时在比赛过程中还是使用profile信息。接下来,需要查看内存中的各种信息。首先扫描所有文件列表,命令是“volatility -f flag filescan > filescan.txt”,文件扫描结果会保存在filescan.txt中。通过搜索常见文件格式,发现有一个flag.7z文件,7z是一种压缩格式,如图1.4.11所示。为了提取文件,可使用命令“volatility -f flag--profile=WinXPSP2x86 dumpfiles -Q 0x0000000001609628 -n --dump-dir=./”,-Q表示使用物理偏移量进行转储,-n表示以文件名保存,--dump-dir=为目标存储位置。提取出的flag.7z在解压时需要密码,查找文件和进程,没有找到比较像密码的字符串。密码实际保存在剪贴板中,可使用命令“volatility -f flag --profile=WinXPSP2x86 clipboard”,如图1.4.12所示。利用图中的data对压缩包解压,就得到flag{Th1s_1s_2oo_4a3y}。

图1.4.11 发现flag.7z文件

图1.4.12 查看剪贴板

取证过程中还有一个经常使用的命令,虽然在本题中没有用到,但也希望大家掌握,即python vol.py-f文件--profile=XXX memdump-p [PID]-D [dump出的文件保存的目录]

这个命令的作用是根据进程号(PID)提取某个进程,其中的memdump可以换成procdump。通过Volatility自带插件pslist可以查看进程信息,如果存在可疑或需要重点关注的进程,通过上述命令就可以将进程提取出来,再利用binwalk、strings等命令可以对提取出的进程做进一步分析。 0k0um9Q7843AJkMgBuFYYozZENfd4BJeZaC5IsVxjkrR3tA5wrWJarOTM9L1eWWQ

点击中间区域
呼出菜单
上一章
目录
下一章
×