跳至正文
DATA RECOVERY

专业数据恢复,值得信赖

面向全球数据恢复实验室、取证机构与企业的高科技工具。

FLASH EXTRACTOR

闪存芯片数据恢复,专业之选

支持 U 盘、固态硬盘、存储卡与手机等各类 NAND 闪存芯片,兼容数千种主控并持续更新。

CHIP-OFF TECHNOLOGY

芯片级恢复,精准高效

针对损坏闪存介质与主控的高级提取技术,最大限度还原关键数据。

ORACLE EXTRACTOR

Oracle 数据库精准恢复

从受损或损坏的 Oracle 数据库中精准还原表、模式与数据,助力关键业务快速恢复。

FORENSICS READY

取证级数据提取

为取证与执法机构提供可靠、可追溯的闪存与数据库证据提取能力。

TRUSTED WORLDWIDE

全球数据恢复实验室与取证团队的信赖之选

多语言技术支持、完善的文档资料与持续更新,服务全球专业用户。

ENTERPRISE GRADE

企业级数据安全保障

帮助 IT 与企业团队快速恢复关键业务数据,最大限度降低停机损失。

GET STARTED

立即体验专业数据恢复工具

下载免费试用版,或直接购买正版授权,开启高效数据恢复之旅。

内存镜像取证分析怎么做?

内存镜像取证分析(干货 笔者不喜欢花里胡哨)

 

前言

网络攻击内存化和网络犯罪隐遁化,使部分关键数字证据只存在于物理内存或暂存于页面交换文件中,这使得传统的基于文件系统的计算机取证不能有效应对.内存取证作为传统文件系统取证的重要补充,是计算机取证科学的重要组成部分,通过全面获取内存数据、详尽分析内存数据,并在此基础上提取与网络攻击或网络犯罪相关的数字证据,近年来,内存取证已赢得安全社区的持续关注,获得了长足的发展与广泛应用,在网络应急响应和网络犯罪调查中发挥着不可替代的作用.首先回顾了内存取证研究的起源和发展演化过程;其次介绍了操作系统内存管理关键机制;然后探讨了内存取证的数据获取和分析方法,归纳总结目前内存取证研究的较新技术;较后讨论了内存取证存在的问题、发展趋势和进一步的研究方向.​                                                                  ——《内存取证研究与进展[J].软件学报,2015, 26(5): 1151-1172》

  1. 内存镜像取证分析流程
    1. 镜像内存数据,保存至文件
      1. Windows推荐:Dumpit(这个是真的快,高效率)
      2. Linux推荐:linpmem_2.0.1(Github里google的rekall工具)
    2. 分析镜像文件
      1. 网络连接状态
        1. 分析本地开放的端口
        2. 分析远程连接端口
      2. 用户登录情况
        1. 获取系统当前用户列表
        2. 读取用户的Hash值
      3. 当前系统进程
        1. 分析第三方进程(不知名程序、非系统程序,占高内存、高CPU的程序)
        2. 通过网络状态,分析pid的程序
        3. 恶意代码分析(兄弟们这个就难倒我了,相关只是抛砖引玉)
      4. 当前注册表状态
  2. 取证与分析工具(下载链接在文章结尾)
    1. 取证工具:
      1. Windows推荐:Dumpit
      2. Linux推荐:lime
      3. Mac推荐:osxpmem_2.0.1
    2. 分析工具:
      1. volatility(力鼎这个软件,开源牛逼)
      2. redline(商业,笔者穷啊)
  3. 养兵千日用兵一时(教科书流程)
    1. 制作内存镜像
      1. Windows
        1. 环境win7,直接双击运行,或者cmd里也一样。(注意:管理员权限)【环境样本已经打包,有彩蛋】

程序效率很高(笔者测试是10秒以内),文件大小是与内存一比一

  • win10 (因为虚拟机还有两个2G的内存),计时:2分18秒左右,共18GB。这个写的速度也看硬盘和cpu的

Linux的镜像文件还是比较小的

无法用于Volatilty分析,linpmem生成的文件是无法用于Volatility分析。因为穷笔测试Centos时候发现很多问题。网上都是给出Ubuntu的demo比较多,大家可以试试,

  • 穷笔在这亲测Lime工具非常Nice(内存镜像生成工具)。
    1. 环境:
      1. 系统:CentOS release 6.5 (Final) | 内核:Linux 2.6.32-431.el6.x86_64
        1. 【警告:这里有个严重错误认知提示下,当前系统虽然是6.5,但是在因为Centos6.5已经停止维护了,所以当centos通过yum安装包的时候自动会升级到6.10,也就是实战环节的环境。同理此时我们安装的内核包是内核升级包,而不是对应的lib依赖包。那如何安装6.5的依赖包呢?利用CD光驱。去下载centos6.5的镜像,然后挂载。通过本地CD里的源安装包即可】
        2. CentOS-6.5-x86_64-bin-DVD1.iso
        3. CentOS-6.5-x86_64-bin-DVD2.iso
      2. 实际系统:CentOS release 6.10 (Final) | 内核:Linux 2.6.32-754.28.1.el6.x86_64
    2. 需要依赖安装:

yum install -y kernel kernel-headers kernel-devel kernel-firmware && yum update

  • 解压Lime的源码包,进入src目录。练习创建demo.ko,lime-2.6.32-754.28.1.el6.x86_64.ko,利用ko文件dump内存to文件
[root@localhost src]# make
make -C /lib/modules/2.6.32-754.28.1.el6.x86_64/build M="/root/src" modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
  CC [M]  /root/src/tcp.o
/bin/sh: perl: command not found
make[2]: *** [/root/src/tcp.o] Error 127
make[1]: *** [module/root/src] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
make: *** [default] Error 2
# ls
deflate.c  hash.c  main.c    Makefile.sample  tcp.o
disk.c     lime.h  Makefile  tcp.c
# yum install perl -y
………………(省略)                                         
Complete!
# make
make -C /lib/modules/2.6.32-754.28.1.el6.x86_64/build M="/root/src" modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
  CC [M]  /root/src/tcp.o
  CC [M]  /root/src/disk.o
  CC [M]  /root/src/main.o
  CC [M]  /root/src/hash.o
  CC [M]  /root/src/deflate.o
  LD [M]  /root/src/lime.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/src/lime.mod.o
  LD [M]  /root/src/lime.ko.unsigned
  NO SIGN [M] /root/src/lime.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
strip --strip-unneeded lime.ko
mv lime.ko lime-2.6.32-754.28.1.el6.x86_64.ko
# ls
deflate.c  hash.o                              lime.mod.o  Makefile.sample
deflate.o  lime-2.6.32-754.28.1.el6.x86_64.ko  lime.o      modules.order
disk.c     lime.h                              main.c      Module.symvers
disk.o     lime.ko.unsigned                    main.o      tcp.c
hash.c     lime.mod.c                          Makefile    tcp.o
# insmod lime-2.6.32-754.28.1.el6.x86_64.ko "path=/centos65x64.mem format=lime"
(此处省略10分钟左右,因为虚拟机的内存是2G,这跟你的硬盘和内存条性能有关)

# du -hl /centos65x64.mem 2.0G /centos65x64.mem

  • profile文件生成:
    1. 环境
      1. 系统:CentOS release 6.10 (Final) | 内核:Linux 2.6.32-754.28.1.el6.x86_64
    2. 通过volatility源码tools代码,编译profile的模块,较后成功生成“module.dwarf”文件【提示:make命令报错,可能是dwarfdump文件不存在。参考文章结尾,笔者花了七天搞清所有依赖关系,有问题请联系笔者给你建议,少走弯路,水太深。】

[root@localhost ~]# tar xf volatility-2.6.1.tar.gz

# cd volatility-2.6.1

# cd tools/linux/

# ls kcore Makefile Makefile.enterprise module.c

# make
make -C //lib/modules/2.6.32-754.28.1.el6.x86_64/build CONFIG_DEBUG_INFO=y M="/root/volatility-2.6.1/tools/linux" modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
  CC [M]  /root/volatility-2.6.1/tools/linux/module.o
/root/volatility-2.6.1/tools/linux/module.c:193:1: warning: "RADIX_TREE_MAX_TAGS" redefined
In file included from include/linux/fs.h:421,
                 from /root/volatility-2.6.1/tools/linux/module.c:10:
include/linux/radix-tree.h:62:1: warning: this is the location of the previous definition
/bin/sh: perl: command not found
make[2]: *** [/root/volatility-2.6.1/tools/linux/module.o] Error 127
make[1]: *** [module/root/volatility-2.6.1/tools/linux] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
make: *** [dwarf] Error 2

# yum install perl -y

(此处省略) Complete!

# ls kcore Makefile Makefile.enterprise module.c module.o

# make
make -C //lib/modules/2.6.32-754.28.1.el6.x86_64/build CONFIG_DEBUG_INFO=y M="/root/volatility-2.6.1/tools/linux" modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
  CC [M]  /root/volatility-2.6.1/tools/linux/module.o
/root/volatility-2.6.1/tools/linux/module.c:193:1: warning: "RADIX_TREE_MAX_TAGS" redefined
In file included from include/linux/fs.h:421,
                 from /root/volatility-2.6.1/tools/linux/module.c:10:
include/linux/radix-tree.h:62:1: warning: this is the location of the previous definition
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/volatility-2.6.1/tools/linux/module.mod.o
  LD [M]  /root/volatility-2.6.1/tools/linux/module.ko.unsigned
  NO SIGN [M] /root/volatility-2.6.1/tools/linux/module.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
dwarfdump -di module.ko > module.dwarf
make -C //lib/modules/2.6.32-754.28.1.el6.x86_64/build M="/root/volatility-2.6.1/tools/linux" clean
make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
  CLEAN   /root/volatility-2.6.1/tools/linux/.tmp_versions
  CLEAN   /root/volatility-2.6.1/tools/linux/Module.symvers /root/volatility-2.6.1/tools/linux/modules.order
make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'

# ls kcore Makefile Makefile.enterprise module.c module.dwarf

  • 利用module.dwarf制作profile文件
    1. 注意与解释
      1. module.dwarf 文件:这个文件是根据内核文件生存的,所以内核不一样生成的文件也是不同的。
      2. /boot/System.map-$(uname -r):System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。
        1. System.map文件的作用:https://www.cnblogs.com/linhaostudy/p/10327574.html
        2. 系统调用劫持之(通过/boot/System.map目录获取sys_call_table系统调用表):https://blog.csdn.net/qq_41453285/article/details/103050710
    2. 命令: zip $(lsb_release -i -s)_$(uname -r)_profile.zip ./volatility/tools/linux/module.dwarf /boot/System.map-$(uname -r)

[root@localhost ~]# zip Centos65x64_$(uname -r)_profile.zip module.dwarf /boot/System.map-$(uname -r) adding: module.dwarf (deflated 90%) adding: boot/System.map-2.6.32-754.28.1.el6.x86_64 (deflated 79%)

# ls _2.6.32-754.28.1.el6.x86_64_profile.zip anaconda-ks.cfg Centos65x64_2.6.32-754.28.1.el6.x86_64_profile.zip dirty.c dwarfdump install.log install.log.syslog lime-2.6.32-754.28.1.el6.x86_64.ko module.dwarf

  • 实战利用已经编译文件,直接取证,不对系统进行任何安装文件
    1. 已经编译文件列表
      1. dump内存to镜像文件相关
        1. lime-2.6.32-754.28.1.el6.x86_64.ko
      2. profile文件制作相关
        1. module.dwarf
    2. 测试
      1. 利用demo“lime-2.6.32-754.28.1.el6.x86_64.ko”,免编译直接dump内存to文件。
  • 利用demo“module.dwarf”,生成profile文件
    1. copy system.map文件

[root@localhost ~]# cd /tmp/

# ls

# cp /boot/System.map-$(uname -r) .

# ls System.map-2.6.32-754.28.1.el6.x86_64

  • 通过自己电脑直接生成
kali@kali:~/Desktop$ mkdir profile
kali@kali:~/Desktop$ cd profile/
kali@kali:~/Desktop/profile$ ls
module.dwarf  System.map-2.6.32-754.28.1.el6.x86_64
kali@kali:~/Desktop/profile$ zip centos_65_x64_profile.zip module.dwarf System.map-2.6.32-754.28.1.el6.x86_64 
  adding: module.dwarf (deflated 90%)
  adding: System.map-2.6.32-754.28.1.el6.x86_64 (deflated 79%)
kali@kali:~/Desktop/profile$ ls
centos_65_x64_profile.zip  module.dwarf  System.map-2.6.32-754.28.1.el6.x86_64
kali@kali:~/Desktop/profile$ 
  • 所以说高端黑客都是本地模拟一遍,而不是在服务器上瞎折腾。。。(干货!淦)
  • Mac应该是与Linux的方法一致的,考虑到内核版本问题,我这里建议用“Lime+Vol的Tools生成profile”方法
  • Volatility分析
    1. 环境
      1. 工具vol(工具包里有)任何平台都是可以运行的
      2. 内存镜像文件
      3. profile文件(创建一个文件夹,我这里取名叫linux,将profile文件放入其中)
      4. 当前系统环境是Windows
    2. 加载插件文件夹Linux,测试是否成功加载profile文件
Windows:
B:Security取证volatility>volatility_2.6_win64_standalone.exe --plugins=linux --info|findstr Linux
Volatility Foundation Volatility Framework 2.6
Linux_2_6_32-754_28_1_el6_x86_64_profilex64 - A Profile for Linux _2.6.32-754.28.1.el6.x86_64_profile x64         #有着一条说明成功加载
LinuxAMD64PagedMemory         - Linux-specific AMD 64-bit address space.
linux_aslr_shift           - Automatically detect the Linux ASLR shift
linux_banner               - Prints the Linux banner information
linux_yarascan             - A shell in the Linux memory image

Linux:
# chmod +x volatility_2.6_lin64_standalone 
# ls /root/linux/
_2.6.32-754.28.1.el6.x86_64_profile.zip  Makefile             module.c
kcore                                    Makefile.enterprise  module.dwarf 
# ./volatility_2.6_lin64_standalone --plugins=/root/linux/ --info |grep Linux
Volatility Foundation Volatility Framework 2.6
Linux_2_6_32-754_28_1_el6_x86_64_profilex64 - A Profile for Linux _2.6.32-754.28.1.el6.x86_64_profile x64          #有着一条说明成功加载
LinuxAMD64PagedMemory         - Linux-specific AMD 64-bit address space.
linux_aslr_shift           - Automatically detect the Linux ASLR shift
linux_banner               - Prints the Linux banner information
linux_yarascan             - A shell in the Linux memory image
  • 加载取证文件(内存镜像文件),读取镜像当前的进程情况。
B:Security取证volatility>volatility_2.6_win64_standalone.exe --plugins=linux -f centos65x64.mem --profile=Linux_2_6_32-754_28_1_el6_x86_64_profilex64 linux_psaux
Volatility Foundation Volatility Framework 2.6
Pid    Uid    Gid    Arguments
1      0      0      /sbin/init
2      0      0      [kthreadd]
3      0      0      [migration/0]
4      0      0      [ksoftirqd/0]
5      0      0      [stopper/0]
6      0      0      [watchdog/0]
7      0      0      [migration/1]
8      0      0      [stopper/1]
9      0      0      [ksoftirqd/1]
10     0      0      [watchdog/1]
11     0      0      [events/0]
12     0      0      [events/1]
13     0      0      [events/0]
14     0      0      [events/1]
15     0      0      [events_long/0]
16     0      0      [events_long/1]
17     0      0      [events_power_ef]
18     0      0      [events_power_ef]
19     0      0      [cgroup]
20     0      0      [khelper]
21     0      0      [netns]
22     0      0      [async/mgr]
23     0      0      [pm]
24     0      0      [sync_supers]
25     0      0      [bdi-default]
26     0      0      [kintegrityd/0]
27     0      0      [kintegrityd/1]
28     0      0      [kblockd/0]
29     0      0      [kblockd/1]
30     0      0      [kacpid]
31     0      0      [kacpi_notify]
32     0      0      [kacpi_hotplug]
33     0      0      [ata_aux]
34     0      0      [ata_sff/0]
35     0      0      [ata_sff/1]
36     0      0      [ksuspend_usbd]
37     0      0      [khubd]
38     0      0      [kseriod]
39     0      0      [md/0]
40     0      0      [md/1]
41     0      0      [md_misc/0]
42     0      0      [md_misc/1]
43     0      0      [linkwatch]
46     0      0      [khungtaskd]
47     0      0      [lru-add-drain/0]
48     0      0      [lru-add-drain/1]
49     0      0      [kswapd0]
50     0      0      [ksmd]
51     0      0      [khugepaged]
52     0      0      [aio/0]
53     0      0      [aio/1]
54     0      0      [crypto/0]
55     0      0      [crypto/1]
62     0      0      [kthrotld/0]
63     0      0      [kthrotld/1]
64     0      0      [pciehpd]
66     0      0      [kpsmoused]
67     0      0      [usbhid_resumer]
68     0      0      [deferwq]
100    0      0      [kdmremove]
101    0      0      [kstriped]
131    0      0      [ttm_swap]
214    0      0      [scsi_eh_0]
215    0      0      [scsi_eh_1]
284    0      0      [mpt_poll_0]
285    0      0      [mpt/0]
297    0      0      [scsi_eh_2]
343    0      0      [kdmflush]
345    0      0      [kdmflush]
363    0      0      [jbd2/dm-0-8]
364    0      0      [ext4-dio-unwrit]
450    0      0      /sbin/udevd -d
579    0      0      [vmmemctl]
753    0      0      [jbd2/sda1-8]
754    0      0      [ext4-dio-unwrit]
789    0      0      [kauditd]
913    0      0      [flush-253:0]
1032   0      0      /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
1094   0      0      auditd
1116   0      0      /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
1168   0      0      /usr/sbin/sshd
1247   0      0      /usr/libexec/postfix/master
1253   89     89     pickup -l -t fifo -u
1254   89     89     qmgr -l -t fifo -u
1261   0      0      crond
1274   0      0      login -- root
1276   0      0      /sbin/mingetty /dev/tty2
1278   0      0      /sbin/mingetty /dev/tty3
1280   0      0      /sbin/mingetty /dev/tty4
1284   0      0      /sbin/udevd -d
1285   0      0      /sbin/udevd -d
1286   0      0      /sbin/mingetty /dev/tty5
1288   0      0      /sbin/mingetty /dev/tty6
1292   0      0      -bash
1306   0      0      sshd: root@pts/0,p
1310   0      0      -bash
1857   0      0      insmod lime-2.6.32-754.28.1.el6.x86_64.ko path=/centos65x64.mem format=lime
1858   0      0      -bash
  • 到这里取证已经完成。后续的分析工作,可参考相关Vol的参数。
  • 穷笔文笔略低,大佬勿喷。因为参考了很多相关内存取证,大多数是教你如何分析Windows或者取证Windows。linux的少之又少。所以穷笔写了该文章,希望能帮助到相关朋友。

【0x01】文章中的工具下载链接:https://pan.baidu.com/s/16hIlWLbcUViVGObsfxTC-Q 提取码:5c2d

【0x02】RedLine 软件相关文章:https://www.freebuf.com/articles/system/129463.html

【0x03】Lime:https://github.com/504ensicsLabs/LiME

【0x04】Volatility :https://github.com/volatilityfoundation/volatility/

【0x05】dwarfdump文件:笔者已经通过源文件编译成二进制文件,在【0x01】百度云链接里打包.

dwarfdump源代码文件下载地址:https://www.prevanders.net/libdwarf-20140413.tar.gz【友情提示需要gc-c++依赖,Centos参考:yum -y install gcc+ gcc-c++】


版权申明:本文为原创文章,转载需要说明输出。
作者:AlphaBug
时间:2020年4月18日 20:28:56 北京时间
文章链接: https://www.0xc2.cn/?p=222

常见问题解答

什么是内存镜像取证分析?

内存镜像取证分析是一种计算机取证技术,通过获取和分析物理内存(RAM)中的数据,提取与网络攻击或网络犯罪相关的数字证据。它弥补了传统文件系统取证在应对内存化攻击和隐遁化犯罪时的不足,是计算机取证科学的重要组成部分,广泛应用于网络应急响应和犯罪调查中。

内存取证与文件系统取证有何不同?

内存取证关注的是物理内存和页面交换文件中的易失性数据,而文件系统取证主要分析硬盘等持久化存储中的文件。内存数据在断电后会丢失,但往往包含进程信息、网络连接、加密密钥等关键证据,能揭示传统文件系统取证无法发现的攻击痕迹,因此两者互为补充。

内存镜像取证分析的关键步骤有哪些?

主要步骤包括:内存数据获取(通过工具将物理内存完整镜像到外部存储)、内存数据分析(解析操作系统内存管理结构,如进程列表、内核对象等),以及证据提取(识别恶意代码、网络活动或用户行为痕迹)。整个过程需要深入理解操作系统内存管理机制,并借助专业工具或脚本辅助分析。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享微博XFacebookLinkedIn

需要专业数据恢复工具?

了解我们的旗舰产品,或购买正版授权,立即开始。

查看产品立即购买