本文主要是在学习内存取证时,一些基本的原则和操作方法,主要针对正在运行的系统。
当不确定系统是否存在问题时(如果是虚拟机需要专注于快照(包括内存的快照)),可以按照下面的流程对正在运行的系统进行初始数据收集。
所有的操作都必须在你关闭系统之前进行,因为一旦关闭系统,可能就会造成一些证据的丢失!
一.开始前的准备
a) 按照时间顺讯对你采取的每个动作进行记录
i. 使用笔和纸,相对依靠计算机的文档,这种古老的记录方式是最有安全保障的
ii. 使用脚本来记录你所使用的所有命令(script命令)
iii. 如果你面对的问题很复杂,很大或者敏感,要考虑遵循4-eyes原则
b) 如果是远程登录的系统(例如SSH),要避免使用可以在其他系统上重用的证书,你可以认为这些证书已经丢失了,要尽快做出修改。
c) 不要将数据存储在硬盘上:
i. 将HISTFILE设置到/dev/null
ii. 将临时文件存储在tmpfs支持的文件系统中,远程连接或者通过USB上。例如:
mount | grep tmpfs #这里我们选择/dev/shm df -h /dev/shm #确定所给空间足够大 mkdir /dev/shm/work && cd /dev/shm/work
二.数据收集
在你建立的临时文件的位置,开始你的系统数据收集
a) 网络状态:
i. 网络套接字 netstat –apn | tee netstat_apn.txt
ii. 网络环境:
ip -4 neigh show | tee ip6_neigh_show.txt ip -4 route show | tee ip6_route_list.txt ip -4 link show | tee ip6_link_show.txt ip -6 neigh show | tee ip6_neigh_show.txt ip -6 route show | tee ip6_route_list.txt ip -6 link show | tee ip6_link_show.txt
b) 用户登录:
w >w.txt last |tee last.txt lastlog | tee lastlog.txt
c) 正在运行的进程:;
ps -auxwwwe |tee ps_auxwwwe.txt pstree -lap |tee pstree_lap.txt
d) 打开的套接字或者文件:
lsof -b -l -P -X -n -o -R -U | tee lsof_blPXnoRU.txt lsof -b -l -P -X-n -o -R | tee lsof_blPXnoR.txt
e) 列举已经挂载的设备:
cat/proc/mounts | tee proc_mounts.txt
f) 加载内核模块:
cat/proc/modules | tee proc_modules ls/sys/modules |tee sys_modules
ls/sys/modules |tee sys_modules
三.收集恶意进程数据
快速地对收集的数据进行review,并注意比较“奇怪”的地方,比如:
1. 监听原始套接字的进程(但是与DHCP无关)
2. 监听你没有见过的、在网上找不到相关信息的端口的进程
3. 本不应存在的由某个进程产生的进程
4. 本不该存在的有网络活动的进程
对于这类的进程,你应该执行的动作:
1. 保存该进程的PID到一个单独的变量和文件夹中:
exportPID=12345 # <- 这里是进程的PID,假设为12345 mkdir $PID cd $PID
2. 停止进程:
kill-STOP ${PID}
3. 复制可执行文件:
cp /proc/${PID}/exe ${PID}.exe
4. 转储进程的核心部分:
gcore${PID}
如果gcore不能成功执行,你可以按照下面的方法:
gdb -p${PID} # Type "gcore" # Type "detach" # Type "exit"
5. 复制所有“intresting”打开的文件:
i. 根据进程列举已经打开的文件:
lsof -np${PID}
ii. 复制“deleted”文件“
cp/proc/${PID}/fd/${FDNUM} ${FILENAME} # FDNUM和 FILENAME 从上一步的结果中获得
iii. 复制存储在/dev/shm中的文件:
cp/dev/shm/${FILENAME} ${FILENAME}#此处同样是从lsof的结果中获得两个参数
6. 复制proc文件夹中的文件:
tar cvfproc_${PID}.tar /proc/${PID}/{auxv,cgroup, cmdline,comm,environ,limits, maps,sched,schedstat,sessionid,smaps,stack,stat,statm,status,syscall,wchan}
7. 退出你的临时文件夹
一、 收集文件系统的元数据
1. 对于每个本地挂载的文件系统,收集它们的文件元数据(访问权限,内容更改以及更改时间等。)
列举本地文件系统:
grep'^/dev/' /proc/mounts
对于查找到的每个文件系统,进行以下操作:
1. 创建一个挂载点:
mkdir mountpoint
2. 绑定挂载到已有的挂载点,例如:‘/’
mount --bind / mountpoint
3. 重新绑定为只读
mount -o remount,ro mountpoint
4. 进入挂载点:
cd mountpoint
5. 获取所有的元数据:
find . -print0 | xargs -0 stat -c "%Y %X %Z %A %U %G%n" -- | tee ../root.files # 用实际的挂载的文件系统替代‘root’
6. 退出挂载点并卸载:
cd .. umount mountpoint
收集完所有的元数据并将其提取到其他位置后,可以使用下面的脚本重建每个文件系统的时间轴:
#!/usr/bin/python from__future__ import print_function fromdatetime import datetime importsys try: import pytz except: pass iflen(sys.argv) > 1: try: timezone = pytz.timezone(sys.argv[1]) except: print("Impossible to use thistimezone") sys.exit(-1) else: timezone = None defprint_line(flags, t, mode, user, group, name): when = datetime.utcfromtimestamp(float(t)) if timezone is not None: try: when =pytz.utc.localize(when).astimezone(timezone) except: print("Timezone issue!") sys.exit(-1) print(' '.join([t, when.isoformat(), flags,mode, user, group, name])) for linein sys.stdin: line = line[:-1] (m, a, c, mode, user, group, name) =line.split(" ", 6) if m == a: if m == c: print_line("mac", m,mode, user, group, name) else: print_line("ma-", m,mode, user, group, name) print_line("--c", c,mode, user, group, name) else: if m == c: print_line("m-c", m,mode, user, group, name) print_line("-a-", a,mode, user, group, name) else: print_line("m--", m,mode, user, group, name) print_line("-a-", a,mode, user, group, name) print_line("--c", c, mode, user, group, name)
注:自动化测试
可以使用一些自动化工具进行恶意软件分析,但是需要注意,首先要有软件,其次,要先重新挂载你的文件系统为只读模式,可以使用下面的代码:
formountpoint in $(grep '^/dev/' /proc/mounts |cut -d ' ' -f 2 |sort -r); do echo mount -o remount,ro $mountpoint done