CentOS基于volatility2的内存取证实验
CentOS,Redhat和Fedora 都是Red Hat体系,采用yum管理器,不同于Debian、Ubuntu作为Debian体系使用apt
本文以CentOS为例,采用avml制作内存镜像,并利用volatility官方所给工具制作profile符号文件,进行简单的内存取证实验
虚拟机安装
本次实验测试了centos7和centos8版本,其他同理
https://mirrors.aliyun.com/centos/8.5.2111/isos/x86_64/CentOS-8.5.2111-x86_64-dvd1.iso
https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
安装过程不过多赘述了,安装时建议直接选最小安装,centos一般用ssh连,图形化界面不太好用
其他都默认就行
安装好后查看一下ip 发现net没分配到ip
配置一下网卡,ifcfg后跟的ens网卡名称和上面对应
vi /etc/sysconfig/network-scripts/ifcfg-ens160
重启一下服务
# CentOS7
service network restart
# CentOS8
service NetworkManager restart
有内网ip了就可以ssh连了
制作内存镜像(建议可以放到最后)
下载avmlReleases · microsoft/avml (github.com)
然后用ssh传到centos里,给予运行权限
chmod 711 avml
打内存镜像
./avml out.lime
制作profile
将vol的tools目录下的linux文件夹传到centos里,并尝试编译
make
遇到致命错误
make -C //lib/modules/3.10.0-1160.el7.x86_64/build CONFIG_DEBUG_INFO=y M="/root/linux" modules
make: *** //lib/modules/3.10.0-1160.el7.x86_64/build: 没有那个文件或目录。 停止。
make: *** [dwarf] 错误 2
提示/lib/modules/3.10.0-1160.el7.x86_64/build
目录不存在
查看了一下发现build符号链接指向/usr/src/kernels/3.10.0-1160.el7.x86_64
这符合通常的情况,因为在许多Linux发行版中,内核源码通常位于
/usr/src/kernels/
目录下。这种设置是为了让开发人员方便地访问内核源码,特别是用于编译内核模块时。
进一步发现kernels
目录下没有对应内核开发包
[root@localhost 3.10.0-1160.el7.x86_64]# cd /usr/src/kernels/3.10.0-1160.el7.x86_64
-bash: cd: /usr/src/kernels/3.10.0-1160.el7.x86_64: 没有那个文件或目录
[root@localhost 3.10.0-1160.el7.x86_64]# ls -a /usr/src/kernels
. ..
安装内核开发包,全部选yes就可以
sudo yum install kernel-devel
再查看,发现已经有了
但是发现名字跟之前的软连接对不上,之前软连接指向的是/usr/src/kernels/3.10.0-1160.el7.x86_64
重新构造软连接
sudo rm /lib/modules/3.10.0-1160.el7.x86_64/build
sudo ln -s /usr/src/kernels/3.10.0-1160.108.1.el7.x86_64 /lib/modules/3.10.0-1160.el7.x86_64/build
ps:在这里可以看到其实内核的kernel已经做了一部分修改了,建议在这一步先reboot一下
如果内存镜像在这一步之前打的,后面做下去会提示报错
ArmAddressSpace: Failed valid Address Space check
所以建议内存镜像放在最后去制作
再进行make,又遇到致命错误
[root@localhost linux]# make
make -C //lib/modules/3.10.0-1160.el7.x86_64/build CONFIG_DEBUG_INFO=y M="/root/linux" modules
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
arch/x86/Makefile:96: stack-protector enabled but compiler support broken
arch/x86/Makefile:169: *** CONFIG_RETPOLINE=y, but not supported by the compiler. Compiler update recommended.。 停止。
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
make: *** [dwarf] 错误 2
指出编译器不支持所需的特性。特别地,指出启用了 RETPOLINE(一种用于缓解Spectre漏洞的技术),但是编译器不支持。
centos默认编译器是gcc,重新安装一下
# 安装软件源
sudo yum install epel-release
# 安装gcc
sudo yum install gcc
再make,这次提示报错没有dwarfdump
[root@localhost linux]# make
make -C //lib/modules/3.10.0-1160.el7.x86_64/build CONFIG_DEBUG_INFO=y M="/root/linux" modules
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
Building modules, stage 2.
MODPOST 1 modules
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
dwarfdump -di module.ko > module.dwarf
/bin/sh: dwarfdump: 未找到命令
make: *** [dwarf] 错误 127
[root@localhost linux]# dwarfdump
-bash: dwarfdump: 未找到命令
安装dwarfdump
这里不建议安装最新版本的dwarfdump,在后面继续做会产生报错ValueError: invalid literal for int() with base 16: ‘128 (-128)’ · Issue #866 · volatilityfoundation/volatility (github.com)
但是暂未有前辈给出修改方案,所以建议安装了较新版本的dwarfdump或者产生如下所述报错的,重新卸载并装老版本的dwarfdump
ValueError: invalid literal for int() with base 16: '168 (-88)'
# 下载并解压包
wget https://www.prevanders.net/libdwarf-20201201.tar.gz
tar -xf libdwarf-20201201.tar.gz
cd libdwarf-20201201
# 配置并编译
sudo ./configure
sudo make install
继续回到linux
目录下编译,成功得到dwarf内核调试文件
[root@localhost linux]# make
make -C //lib/modules/3.10.0-1160.el7.x86_64/build CONFIG_DEBUG_INFO=y M="/root/linux" modules
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
Building modules, stage 2.
MODPOST 1 modules
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
dwarfdump -di module.ko > module.dwarf
make -C //lib/modules/3.10.0-1160.el7.x86_64/build M="/root/linux" clean
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
CLEAN /root/linux/.tmp_versions
CLEAN /root/linux/Module.symvers
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.108.1.el7.x86_64”
[root@localhost linux]# ls
kcore libdwarf-0.9.1.tar.xz Makefile Makefile.enterprise module.c module.cile module.dwarf
[root@localhost linux]# ls -lh
总用量 5.0M
drwxr-xr-x. 2 root root 71 2月 5 20:14 kcore
-rw-r--r--. 1 root root 2.6M 1月 28 03:27 libdwarf-0.9.1.tar.xz
-rw-r--r--. 1 root root 384 2月 5 20:14 Makefile
-rw-r--r--. 1 root root 314 2月 5 20:14 Makefile.enterprise
-rw-r--r--. 1 root root 18K 2月 5 20:14 module.c
-rw-r--r--. 1 root root 46 2月 5 20:20 module.cile
-rw-r--r--. 1 root root 2.4M 2月 5 21:12 module.dwarf
获取system.map内存表文件
ls -lh /boot/System.map-$(uname -r)
[root@localhost linux]# ls -lh /boot/System.map-$(uname -r)
-rw-------. 1 root root 3.5M 10月 20 2020 /boot/System.map-3.10.0-1160.el7.x86_64
打包
sudo zip $(lsb_release -i -s)_$(uname -r)_profile.zip module.dwarf /boot/System.map-$(uname -r)
# 如果没有lsb_release命令
yum install redhat-lsb-core
[root@localhost linux]# sudo zip $(lsb_release -i -s)_$(uname -r)_profile.zip module.dwarf /boot/System.map-$(uname -r)
adding: module.dwarf (deflated 91%)
adding: boot/System.map-3.10.0-1160.108.1.el7.x86_64 (deflated 79%)
[root@localhost linux]# ls
CentOS_3.10.0-1160.108.1.el7.x86_64_profile.zip kcore Makefile Makefile.enterprise module.c module.cile module.dwarf
将zip移到volatility2\volatility\plugins\overlays\linux
目录下
# linux下用grep,我volatility2装在windows里
python2 vol.py --info | findstr "Linux"
python2 vol.py -f out.lime --profile=LinuxCentOS_3_10_0-1160_108_1_el7_x86_64_profilex64 linux_banner
成功解析