Live(Quick&Dirty)Forensics

本文主要是在学习内存取证时,一些基本的原则和操作方法,主要针对正在运行的系统。     

当不确定系统是否存在问题时(如果是虚拟机需要专注于快照(包括内存的快照)),可以按照下面的流程对正在运行的系统进行初始数据收集。

所有的操作都必须在你关闭系统之前进行,因为一旦关闭系统,可能就会造成一些证据的丢失!

一.开始前的准备

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值