Pages

Friday, 29 January 2016

使用 Linux 工具进行计算机取证


本文通过介绍 Linux 系统工具(Ftkimage、xmount、Volatility、dd、netcat)来介绍使用计算机取证的方法和步骤。 硬盘数据的取证是指为了证据保全,确保取证工作造成数据丢失,在获取到证据介质后,首先要做的就是对介质数据进行全盘镜像备份。内存取证主要通过对内存数据及其缓存硬盘数据进行分析,提取那些对案件侦破可能有重要意义的易失性数据,这些易失性数据的特点是存在于正在运行的计算机或网络设备的内存中,关机或重启后这些数据将不再存在。


前言

计算机取证过程中要用到很多工具 , 根据取证工具的用途, 主要可以将取证工具分为三大类:第一类是磁盘文件取证复制工具, 第二类是内存文件取证工具,第三类是取证分析工具。尽管很多商业工具都是在 Windows 环境中开发的,但是 Linux 平台还是获得了自己的一席之地,因为 Linux 包含了非常强大的工具,这些工具对取证调查是非常有帮助的,Linux 环境下的取证工具有不少, 有兴趣的读者可参阅网址http://www.opensourceforensics.org/tools/unix.html,本文主要介绍 Linux 环境下的磁盘和内存取证工具包括 Ftkimage、xmount、Volatility、dd、netcat 等。

磁盘取证简介

一般来说取证就是收集并分析证据,并为司法行动中的展示构建事实的一个过程。但在计算机技术中,或在计算机取证技术中,取证就是通过专门的技术来发现证据的过程,这些证据可被用于确认计算机、计算机网络、相关设备、数据存储媒体是否被用于实施犯罪或未授权的活动。在计算机的取证领域中,取证人员在取证调查的整个过程中证明证据媒体没有在任何方面被篡改是至关重要的。其中一种方法是对原始的证据媒体作一个映象复制,并对映象复制品展开调查,以防止对原始证据的任何更改。本文介绍磁盘取证工具的平台是 Fedora 21 x64 系统。

镜像工具 dd

  计算机取证时需要为计算机生成一个位镜像, 这个操作要在系统还在运行的时候或在系统关闭之前进行。最常使用的就是两个工具: dd 和 netcat(两者都是开源软件安装非常简单这里从略)。dd 为我们生成磁盘的位镜像文件,而 netcat 将拷贝通过网络传送出去。你需要一台联网的电脑来接收该镜像文件,而且该电脑需要有足够的空间来存放镜像文件。
复制/dev/sdc 到文件 cyqdrive.dd 中。将文件分割成多个 1GB 大小的文件。读取错误时,忽略该错误而不停止拷贝行为。这个例子命令如下:
#dd if=/dev/sdc split=1G of=cyqdrive.dd
刚才已经展示如何创建一个磁盘镜像,但只是创建镜像到系统的本地文件。但是当当前的物理空间不足时就要使用 netcat 来将 dd 命令的的输出通过网络连接进行重定向。首先在目标服务器上,启动 netcat 作为一个监听,并将输出重定向到一个远程服务器上的文件。我会用 netcat 监听 TCP 的 3452 端口,并将镜像写入一个远程的文件 cyqimage.dd。
#nc -l -p 3452 > myimage.dd
  然后你可以对服务器(192.168.1.1)进行镜像拷贝,并通过标准输出(没有指定输出的文件)来将镜像文件输出到 netcat,然后由 netcat 将镜像文件发送到目标服务器,使用如下命令:
# dd if=/dev/sdc split=1G of=cyqdrive.dd | nc 192.168.1.1 3452

使用 FTK Imager for Linux

使用 FTK Imager 工具用户可以创建原始证据媒体的取证映象,如本地硬盘、闪盘、软盘、Zip 驱动器、CD、DVD 等。对于 FTK Imager 来说 Command Line Version(命令行版本)是免费的,用户可以访问 http://www.accessdata.com/support/product-downloads 下载对应的操作系统版本,这里笔者使用的是 Fedora and Red Hat Version x64 – 3.1.1 版本的文件,下载后解压缩后即可使用,文件名称是 ftkimager。
用户可以使用这个命令查看帮助信息
./ftkimager –help
首先查看当前加载的驱动器列表,输出界面见图 1
图 1. 查看驱动器列表
图 1. 查看驱动器列表
获取/dev/sdb 这个磁盘的 E01 模式的文件映像, 使用如下命令:
#./ftkimager /dev/sdb /tmp/cyq.e01 --e01 --frag 500M --description "cyq" --examiner cyq
ftkimager 这个命令比较长,参数也比较多。这里简单介绍一下
/dev/sdb 是取证目标驱动器名称
/tmp/cyq.e01 是取证文件的名称和路径
--e01 是表示使用 E01 格式。
--frag 500M 表示每 500MB 分成一个文件,在映象片断的大小中,用户可以可以选择将映象分割为多个文件以便于在 DVD 或 FAT 文件系统中中备份。
--examiner cyq 是取证操作人员的姓名简称。
--description "cyq"是操作说明。
E01 格式说明:dd 镜像格式是目前被最广泛使用的一种镜像格式,也称成原始格式 (RAW Image)。dd 镜像的优点是兼容性强,目前所有磁盘镜像和分析工具都支持 dd 格式。E01 是法证分析工具 EnCase 的一个证据文件格式,较好地解决了 dd 镜像的一些不足。在生成 E01 格式证据文件时,会要求用户输入与调查案件相关的信息,如调查人员、地点、机构、备注等元数据。这些元数据将随证据数据信息一同 存入 E01 文件中。文件的每个字节都经过 32 位的 CRC 校验,这就使得证据被篡改的可能性几乎为 0。默认情况下,分析软件自动以每 64 扇区的数据块进行校验,这种方式兼顾速度和完整性两个方面的考虑。获取个磁盘的 E01 模式的文件映像需要一些时间,根据磁盘大小和硬件型号有所差异,图 2 是完成的界面。
图 2. 获取/dev/sdb 这个磁盘的 E01 模式的文件映像
图 2. 获取/dev/sdb 这个磁盘的 E01 模式的文件映像

使用 xmount 工具制作 snapshot(快照)文件

xmount 工具可以把 E01 格式的镜像文件转化为 VDI 或者 VMDK 格式。然后用户可以使用 VirtualBox 和 Vmware 软件打开文件进行取证操作。
安装 xmount 软件包
#RPM –ivh https://forensics.cert.org/cert-forensics-tools-release-el7.rpm
#yum install xmount
下面需要修改配置文件
#usermod -a -G fuse cyq
#vi /etc/fuse.conf”
把下面一行的 # 去掉,修改为:
user_allow_other
然后保存文件后,然后建立一个目录
#mkdir ~/mnt0
如果需要建立 vdi 格式,使用如下命令:
#xmount --in ewf --out vdi --cache ~/tmp/MyDisk.cache ~/tmp/cyq.E?? ~/mnt0
这个命令比较长,参数也比较多。这里简单介绍一下
--in ewf 是表示源文件是 E01 格式。
-~/tmp/cyq.E?? 表示源文件的路径,并且可能是多个文件。
--out vdi 表示输出格式是 vdi。
/mnt0 是输出文件的目录。
--description "cyq"是操作说明。
~/tmp/MyDisk.cache 是缓存文件名称。
建立 vdi 文件后,可以使用 VirtualBox 虚拟机导入这个 vdi 文件进行取证分析。
如果需要建立 vmdk 格式,使用如下命令:
#xmount --in ewf --out vmdk --cache ~/tmp/MyDisk.cache ~/tmp/cyq.E?? ~/mnt0
建立 vmdk 文件后,可以使用 Vmware Workstation 导入这个文件进行取证分析。

内存取证简介

内存取证主要通过对内存数据及其缓存硬盘数据进行分析,提取那些对案件侦破可能有重要意义的易失性数据,这些易失性数据的特点是存在于正在运行的计算机或网络设备的内存中,关机或重启后这些数据将不再存在。
成功获取物理内存以后,接下来的工作就是要对镜像文件进行分析,从中提取有用的入侵证据。一般来说,我们可以从镜像文件中提取以下信息 ( 这些信息是指在生成镜像文件那个时刻的信息) :
  1. 所有正在内存中运行的进程;
  2. 所有的载入模块和 DLL( 动态链接库),包括被植入的各种恶意程序;
  3. 所有正在运行的设备驱动程序,包括隐藏的 rootkits;
  4. 每个进程打开的所有文件;
  5. 每个进程打开的所有注册表的键值;
  6. 每个进程打开的所有网络套接字 ( sockets),包括 IP 地址和端口信息;
  7. 用户名和口令;
  8. 正在使用的电子邮件 和网页链接;
  9. 正在编辑的文件内容。

内存取证软件 Volatility 简介

Volatility 是一款基于 GNU 协议的开源框架,使用 Python 语言编写而成的内存取证工具集,可以分析内存中的各种数据。Volatility 支持对 32 位或 64 位 Wnidows、Linux、Mac、Android 操作系统的内存数据进行提取与分析。

内存取证的工作流程

工作流程首先在取证计算机上安装 Volatility 软件包。接着获取内存副本后传输到取证计算机上面,最后是进行分析工作。本文介绍内存取证工具的平台是 Backtrack5 x64 系统。

安装 Volatility

#apt-get update
#dpkg --get-selections | grep volatility
#apt-get install volatility
进入程序的存储目录验证一下
#cd /pentest/forensics/volatility
#ls -l vol.py
#./vol.py –h
vol.py 是主程序,主要包括如下
-f FILENAME 选项的功能是说明打开一个镜像文件所使用的文件名,这个命令选项几乎在所有命令中都会用到。
--cache 选项的功能是使用缓存。
--dtb=DTB 选项的功能是说明 DTB(Directory Table Base) 页目录表的基地址。
-k KPCR 选项的功能是说明一个指定的内核处理器控制区的虚拟地址。
apihooks 插件命令的功能是监测在进程和内核中的 api 钩子。
bioskbd 插件命令的功能是动态地从内存中读取键盘缓冲区的数据。
cmdscan 插件命令的功能是通过访问_command_history 获取历史命令记录。
connections 插件命令查看当前内存中活跃的 tcp 连接。

制作 Linux 系统的 Profile

Volatility 自带一些 windows 系统的 profile,Linux 系统的 Profile 需要自己制作,制作的方法如下:实际是将 module.dwarf 和 system.map 打包成一个 zip 文件,接着将 zip 文件移动到 volatility/plugins/overlays/linux/ 目录中。
也可以在 https://github.com/KDPryor/LinuxVolProfiles 处直接下载已经做好的 profile 文件(zip 文件)然后复制到目录后解压缩即可。

制作 Linux 下的内存镜像文件

这里使用的工具是 fmem,fmem 是用于检索内存的取证工具。它是作为一个内核模块的来运行。
安装使用方法:
#wget http://hysteria.sk/~niekt0/foriana/fmem_current.tgz
#tar zxvf fmem_current.tgz
#cd fmem_1.6-0
# make; ./run.sh
下面的命令将内存里的数据拷贝到 root 目录下的 cyq.vmem 文件
# dd if=/dev/fmem of=/root/cyq.vmem bs=10MB count=2048

内存取证的实例

检查进程详细信息
检查进程详细信息可以使用 linux_psaux 子命令,命令如下:
#./vol.py -f /root/pexit.vmem --profile=LinuxUbuntu1004_pae32-33x86 linux_psaux
命令输出结果见图 3
图 3. 检查进程详细信息
图 3. 检查进程详细信息
检查系统进程树信息
检查系统进程树信息可以使用 linux_pstree 子命令,命令如下:
#./vol.py -f /root/pexit.vmem --profile=LinuxUbuntu1004_pae32-33x86 linux_pstree
命令输出结果见图 4
图 4. 检查进程详细信息
图 4. 检查进程详细信息
说明: 进程树 (Process tree) 是计算机科学中的术语,又称为进程图 (Process map) 或进程家族树 (Process graph),是一种表示进程关系的直观方法。linux 的树形进程结构为管理进程提供了很大的方便,不管是内核对进程的管理还是用户对进程的管理都受惠不少,对于审计也是很有用的,不管运行的什么进程,都会有一条不会断的线索将之绑在系统内部。
查看某具体进程的情况
检查某具体进程的情况可以使用 linux_proc_maps 子命令,命令如下:
# ./vol.py -f /root/cyq.vmem --profile=LinuxUbuntu1004_pae32-33x86 linux_proc_maps | grep httpds
命令输出结果见图 5
图 5. 检查 httpds 进程详细信息
图 5. 检查 httpds 进程详细信息
说明:这个子命令可以查看进程细节包括共享库、开始和结束的位置等信息。
查看网络链接情况
检查网络链接情况可以使用 linux_netstat 子命令,命令如下:
#./vol.py -f /root/pexit.vmem --profile=LinuxUbuntu1004_pae32-33x86 linux_netstat
命令输出结果见图 6
图 6. 查看网络链接情况
图 6. 查看网络链接情况
参数查看内核路由表情况
检查内核路由表情况可以使用linux_route_cache子命令,命令如下:
#./vol.py -f /root/pexit.vmem --profile=LinuxUbuntu1004_pae32-33x86 linux_route_cache 命令输出结果见图 7
图 7. 查看内核路由表情况
图 7. 查看内核路由表情况

内存取证的子命令列表简介

限于篇幅这里笔者就介绍以上几个命令,这里笔者把相关命令(也可以叫插件)进行分类。
获取系统进程信息相关命令:
linux_pstree:进程树列表
linux_pslist_cache:来自的 kmem_cache 活动进程
linux_psxview:比较进程列表
linux_lsof :打开文件描述符的每个活动进程
linux_pslist :活动的进程列表
linux_psaux:活动的进程列表(输出内容包括更多的细节)
获取系统内存信息的相关命令:
linux_memmap:内存映射文件
linux_pidhashtable: Linux 内核中的 PID 散列表
linux_proc_maps::转储由-s/--vma 参数到磁盘上指定的内存范围。
linux_dump_map:进程内存的详细信息,包括堆和共享库。
linux_bash :bash 历史文件
获取网络接口信息的相关命令:
linux_arp:显示 arp 列表
linux_ifconfig:显示网络接口详细情况
linux_route_cache:显示网络路由表
linux_netstat:查看网络链接情况
获取系统硬件信息的相关命令:
linux_cpuinfo :显示 cpu 的相关命令信息。
linux_dmesg :显示内核缓存信息。
linux_iomem :显示 io 设备信息。
linux_mount :显示/proc/mouns 的相关命令信息,主要是挂载的磁盘设备。
linux_mount_cache :显示 kmem_cache 的相关命令信息。
linux_slabinfo :显示/proc/slabinfo 的相关命令信息。
rootkit 检测的相关命令:
linux_check_afinfo:检查篡改网络协议结构。
linux_check_creds:检查进程共享结构。
linux_check_fop:检查文件操作数据结构篡改情况。
linux_check_idt:检查中断描述符表(IDT)的篡改情况。
linux_check_syscall:在系统调用表检查功能情况。
linux_check_modules:检查用于从内核模块列表中缺少在 sysfs 中的项目。
获取内核模块信息的相关命令:
linux_lsmod:加载内核模块。
linux_tmpfs::tmpfs 的内容。
详细使用方法可以看在官方网站包含 Linux 的相关命令参考:

总结

计算机取证主要包括两个阶段:物理证据获取和信息分析。本文通过介绍 Linux 系统工具(Ftkimage、xmount、Volatility、dd、netcat)来介绍使用计算机取证的方法和步骤。包括磁盘数据的取证和内存取证。

参考资料

学习