原谅我这么晚才出来文章,因为最近忙着录课,至于为啥没有基础篇,是因为靶场里没看见,哈哈
这个也是研究了好几个晚上才出来的东西,此处场景为linux环境下的rootkit病毒,我们通过这篇文章可以通过内存取证发现rootkit病毒相关的知识,我个人觉得还是挺实用的,比较linux的rootkit病毒在不借助工具的前提下是不太好发现的
使用工具:
volatility_2.6_lin64_standalone
环境:
kali linux
python 2.7
需要着重注意的是,此次测试环境芮然依然是kali linux,但是使用的volatility_2.6工具不再是集成工具,而是python脚本了,大家需要重新下载或者是获取此工具
strings dump.mem| grep -i "Linux release"
或者直接解压文件
链接: https://forums.centos.org/viewtopic.php?t=74194
此次我们需要使用 python版本的脚本,集成式的脚本不太适用于linux环境,我们首先看一下集成式的volatility_2.6_lin64_standalone工具,里面是没有linux的环境的
./volatility_2.6_lin64_standalone --info
python2 vol.py --info
所以我们需要使用python格式的脚本进行实验,环境为python2.7
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_bash
echo 'c2hrQ1RGe2wzdHNfc3Q0cnRfdGgzXzFudjNzdF83NWNjNTU0NzZmM2RmZTE2MjlhYzYwfQo=' | base64 -d
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_psaux
很明显,该pid进程执行了个nc的脚本,该命令是用来链接肉鸡用的
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_bash
我们回到问题2,会发现,历史命令中,有一条向github下载东西的指令
但是我们直接使用浏览器访问github,发现该文件其实就是一个普通的备份工具
首先检查用户是否已 root 身份运行脚本,如果不是,则提示用户需要 root 权限才能进行备份操作。
然后读取用户输入的选择,选择备份的方式 (生成新 Snapshot、使用最近 Snapshot 或使用最近 Diff 文件)。
如果用户没有提供任何选择,则提示用户并提供备份选项。
如果用户选择生成新 Snapshot,则要求用户指定要备份的目录,并使用 app.snapshot.generateSnapshot() 函数生成新的 Snapshot。
如果用户选择使用最近 Snapshot,则要求用户指定要备份的目录,并使用 app.snapshot.getLast() 函数获取最近生成的 Snapshot。
如果用户选择使用最近 Diff 文件,则要求用户指定要备份的目录,并使用 app.compare.getLast() 函数获取最近生成的 Diff 文件。
如果用户选择使用 Diff 文件进行备份,则使用 app.backup.copyFiles() 函数将 Diff 文件备份到指定的目录中。
最后,程序会打印出备份程序已停止的提示信息。
而后我查看了一下 …/app/snapshot.py 文件和 …/app/compare.py 文件,没发现任何端倪
似乎没有什么问题的样子
问题就在这了,如果使用git命令下载完整脚本,snapshot内容如下
git clone https://github.com/tw0phi/PythonBackup
和明显,直接访问github是看不到该隐藏内容的,实际上该脚本并不是什么恶意文件,只不过这个链接是我们解题需要用到的罢了
curl https://pastebin.com/raw/nQwMKjtZ
echo c2hrQ1RGe3RoNHRfdzRzXzRfZHVtYl9iNGNrZDAwcl84NjAzM2MxOWUzZjM5MzE1YzAwZGNhfQo= | base64 -d
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_netstat
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_netstat | grep "12345"
因为上面我们看到,ncat的命令开启了12345作为通信端口,所以我们可以直接过滤12345作为关键数据
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_bash_env | grep "192.168.49.1"
为了验证我们的猜想,我们执行该命令,看一下该地址正在使用的其他信息
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_psaux
我们可以看到,在执行了ncat命令后,执行了python -c import pty; pty.spawn(“/bin/bash”) 该命令,此命令允许生成新的 tty
接上题,攻击者生成了新的tty之后,访问了/etc/rc.local目录文件,rc.local 是一个脚本,其内容在所有系统服务启动后执行,大家可以理解为计划任务
我们可以直接转储此进程或者是转储他的父进程,这里我转储他的父进程2887
mkdir 2887
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_dump_map --pid 2887 -D 2887/
生成了很多的文件,我们筛选一下
find 2887 -name "*.vma" -type f -exec file {} \; -exec grep -q "/etc/rc.local" {} \; -print
首先我们筛选一下 包含/etc/rc.local字符串的文件有哪些
很显然,只有task.2887.0x7f673821e000.vma文件符合
我们进入该文件,继续检索
strings -a task.2887.0x806000.vma| grep "/etc/rc.local" -A 10 -B 10
很明显,攻击者在该文件写入了加密密钥,但是没有找到我们需要的东西,我们继续检索
strings -a task.2887.0x806000.vma| grep "ssh-rsa " -A 10 -B 10
shkCTF{rc.l0c4l_1s_funny_be2472cfaeed467ec9cab5b5a38e5fa0}
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_dmesg | grep "out-of-tree" -A 5 -B 5
该命令用于提取系统内存信息,通过分析系统内存信息来查看哪一个模块是没有进行系统认证的,通常情况下,rootkit病毒的模块都是没有进行系统认证的
我们可以看到内核警告,指出加载的 sysemptyrect 模块未经验证,可能会损害内核,即模块不受信任。
然后执行CRC65加密。
python2 vol.py -f ../c73-EZDump/dump.mem --profile=LinuxCentos7_3_10_1062x64 linux_check_syscall | grep "HOOKED"
我们可以看到其中一个系统调用(系统调用编号 88 是 symlink)被 sysemptyrect 模块拦截,内核也向该模块发出警告
strings -a dump.mem| grep "sysemptyrect" -A 5 -B 5
直接按照该 rootkit的关键字搜索就行