蓝队分析 拷贝取证
0x00 前言
深入贯彻安全思想,守住安全防线。我没接触安全之前也许并不知道自己的信息和隐私多么重要,更多的时候只是为了自己方便就可以(隐私无所谓啦),也可能是因为在安全group中才发现安全有这么多可以获取信息的技术,才知道关于自己的言行隐私的安全的保护是有多么重要,接下来将真实分析内存镜像分析方面的教程。
0x01 内存镜像存在的意义:
内存的增加促使整合水平的提高,内存的可靠性也影响该服务器上所有虚拟机(VM)的整体可靠性。因此,内存的功能就包括各种升级,比如容错内存镜像和内存备用,内存镜像文件格式有raw、vmem、dmp、img。
0x02 Volatility开源实现功能:
Volatility是一款内存取证框架,能够对导出的内存镜像进行分析,通过获取内核数据结构,然后获取内存的详细情况以及系统的所有运行状态,只要你有拷贝好的内存镜像(约0.5G大小),就可实现很多实用的数字证据提取功能:列出会话及窗口站atom表,打印TCP连接信息,显示进程命令行参数,提取执行的命令行历史记录(扫描_COMMAND_HISTORY信息),提取崩溃转储信息,提取内存中映射或缓存的文件,内存镜像中的shell,查看Windows帐户hash,查看进程列表。
在官网的描述中,有关于Volatility的一句:在发布Volatility的稳定版本前,不仅是我们团队进步的一个里程碑,也是社区和取证能力整体发展的一个里程碑。虽然版本可能看起来很少,但我们努力发布不稳定版本之前对我们的新功能进行严格的测试。Volatility可以实现是对操作系统内部、应用程序、恶意代码和可疑活动进行侦察和深入研究。
使用特点是什么:
- 开源:Python编写,易于和基于python的主机防御框架集成。
- 支持多平台:Windows,Mac,Linux全支持
- 易于扩展:通过插件来扩展Volatility的分析能力
0x03 安装注意异常:
下载Volatility和dsitorm3
解压后放在同一目录下,其中distorm3是一个反编译库,用来配合Volatility使用反汇编的的,先按照以下步骤安装(diStorm是用C写的,但对于快速使用,diStorm也有包装在Python / Ruby的/ Java和可以很容易地使用C语言也是如此,它是最快的反汇编库)
下载https://github.com/gdabah/distorm/releases 然后解压到目录中,使用命令 python2 setup.py isntall 编译程序:
推荐安装的插件,我们已经使用的包含前两个:
- Distorm3反编译库:pip isntall distorm3
- PyCrypto加密工具集:pip install pycryto
- Yara恶意软件工具:pip isntall yara
- PIL图片处理库:pip install pil
- UJson JSON解析:pip install ujson
安装Volatility
在解压后的Volatility目录下进行编译:python2 setup.py install
安装完成之后显示vol.py已经生成了,所以验证是否安装成功,使用命令:vol.py,安装成功。
安装pip2,然后通过pip2安装pip2 install pycryptodome依赖。
建议在Kali中使用,首先使用pip -v 查看当前pip版本,一般是python3的pip3,所以我们使用命需要安装一个pip2,并不pip3冲突。
直接输入pip2命令安装:
接下里安装pycryptodome,因为Volatility是python文件,所以需要安装依赖。也可以建议直接使用:pip2 install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple -i 参数表示用来添加清华源
安装mimikatz的python文件
使用方法是把mimikatz.py复制到volatility-master/volatility/plugins,代表插件目录,如下成功。
运行时需要添加参数 --plugins=./volatility-master/volatility/plugins,很可能出现下面错误,因为没有安装construct模块:
Volatility Foundation Volatility Framework 2.6
*** Failed to import volatility.plugins.mimikatz (ImportError: No module named construc)
ERROR : volatility.debug : You must specify something to do (try -h)
使用命令安装contruct模块:
pip install construct==2.5.5-reupload
简单来尝试下面命令来获取用户密码,先读取内存镜像文件后,使用命令 vol.py -f 内存镜像名 --profile=系统名 hashdump,就可成功得到所有用户的用户名和哈希值,然后就可以拿去cmd5.com破解,后面通过实战题来解析。
一、CTF题:破解密码---湖湘杯2020 passwd
需要我们寻找内存中的密码:
1.先获取内存基本信息
使用命令vol.py -f 文件名 imageinfo获取基本信息,得到profile为Win7SP1x86_23418
2.然后获取用户名和hashdump
使用命令 vol.py -f 文件名 --profile=Win7SP1x86_23418 hashdump 获取用户名和哈希值,发现用户名CTF。
3.最后获取和破解密码
根据获取的hash值到https://cmd5.com/ 破解密码。
二、CTF题:挂载转储---BMZCTF Suspicion
给出了一个内存镜像文件和可利用文件:
1.获取系统基本信息:
使用命令 vol.py -f mem.vmem imageinfo 获取基本信息,关注profile值,值为WinXPSP2x86。
2.查看运行进程
使用命令 vol.py -f mem.vmem --profile=WinXPSP2x86 pslist 查看进程
在众多进程中发现加密进程TruCrypt.exe ,于是采取和所给的第二个位置文件进行解密
3.转储进程得到文件
因为我们需要这个进程的文件来解密,所以获取到的pid号可以使用命令:vol.py -f mem.vmem --profile=WinXPSP2x86 memdump -p 2012 -D ./ ,其中-p代表pid号,-D代表转储路径,转储出来得到pid号命名的2012.dump
接下里解密TrueCrypt的转储文件,这里我们使用EFDD,选择TrueCrypt(container),然后选择文件
然后上面选择file已经存在的加密文件,下面keys选择解密密钥,即刚刚dump下来的文件。
破解完成后是这样的,会生成一个evk结尾的内存文件,用于挂载内存文件,选择Mount Disk,然后打开我的电脑磁盘然后就可以看到多出一个挂载的内存文件,并且是明文解密形式的。
挂载解密文件后成功得到答案。
三、CTF题: 关键字查找---NEWSCTF2012 ez-dump
1.查看系统信息
只有一个raw文件,而且题目描述和dump有关,首先查看基本信息。profile为Win7SP1x64,命令为vol.py -d mem.raw imageinfo
2.从执行命令查看密码
这里查看cmd执行的命令,如果执行命令比较少很可能有密码可能性会更大,发现添加了用户,包含密码,这里发现用户mumuzi,密码(ljmmz)ovo,使用命令:vol.py -f mem.raw --profile=Win7SPx64 cmdscan 查看执行过的命令。
3.查找flag关键字
这里filescan代表查找文件,使用管道符代表查找具有关键字flag的文件,并显示出来,这里发现一个压缩文件,因为都是内存里的文件,所以需要查看的话,都必须把它转储下来,
转储需要我们使用filedump的命令,使用命令:vol.py -f mem.raw --profile=Win7SPx64 dumpfile -Q 偏移量 -D 上一级目录,代表转储特定偏移量的文件flag.zip保存到桌面。
打开压缩包,发现已经加密,所以使用我们之前查到的密码,成功得到答案flag。
成功得到flag。
四、CTF题:可疑进程分析---福来阁殿下
只有一个内存镜像文件,考虑使用Volatility。
1.查看系统信息和进程列表
查看profile为WinXPSP2x86,使用命令:vol.py zy.raw imageinfo。查看进程列表,使用命令:vol.py -f zy.raw --profile=WinXPSP2x86 pslist。
发现一个进程叫smss.exe,可以进一步查看。
- 转储进程查找关键字
这里有一个关键的思路就是需要去使用grep关键字来获取的文件。记下pid号,使用命令:vol.py -f zy.raw --profile=WinXPSP2x86 memdump -p 536 -D ./
。
对转储的文件使用grep,使用命令:strings -e l 536.dmp | flag
,可以得到flag关键字相关信息。发现了很多图片,图片无法打开,可能是一条坑。
- 尝试获取浏览器历史记录
使用命令:vol.py -f zy.raw --profile=WinXPSP2x86 iehistory
,发现了隐藏的hint提示文件,打算将这个文件从内存中转储出来。
使用grep扫描查看文件位置,然后保存文件下来,可以看到提示我们正确的flag关键词是fl4g,这也是常用的更换常见思路手段。
使用命令:vol.py -f zy.raw --profile=WinXPSP2x86 filescan | grep hint.txt
,可以得到文件偏移量,根据偏移量获取文件。
使用命令:vol.py -f zy.raw --profile=WinXPSP2x86 dumpfile -Q 偏移量 -D 存储目录
,打开hint.txt。
4.更换思路查找fl4g
可以从这里找到正确的方向,发现了fl4g.zip文件,然后保存下载打开。
使用命令:vol.py -f zy.raw --profile=WinXPSP2x86 filescan | grep fl4g
,查找到文件位置,下一步根据文件在内存中的偏移量保存dump下来。
使用命令:vol.py -f zy.raw --profile=WinXPSP2x86 dumpfile -Q 偏移量 -D 存储目录
,得到fl4g.zip压缩包,一般打开压缩包的话可能还需要密码。
5.图片处理处理发现flag
两个不同格式的同样的图片,发现图片应该采用StegSolve来处理查看。
看到的时候发现了图片隐藏下的二维码,你也可以扫码,基本上到这里应该flag大概就出来了。
得到百度翻译链接:
https://fanyi.baidu.com/translate?aldtype=16047&query=%E6%B0%9F%E5%BE%95%E6%A0%BC%E4%B9%83%E9%8C%B5%E6%89%A9%E5%8F%B7%E6%AC%B8%E5%BF%85%E8%A5%BF%E5%BC%9F%E4%BA%BF%E8%89%BE%E8%99%8E%E9%94%AF%E9%8C%B5%E6%89%A9%E5%8F%B7&keyfrom=baidu&smartresult=dict&lang=auto2zh#zh/en/%E6%B0%9F%E5%BE%95%E6%A0%BC%E4%B9%83%E9%8C%B5%E6%89%A9%E5%8F%B7%E6%AC%B8%E5%BF%85%E8%A5%BF%E5%BC%9F%E4%BA%BF%E8%89%BE%E8%99%8E%E9%94%AF%E9%8C%B5%E6%89%A9%E5%8F%B7
成功得到谐音的flag,原来的文本只有上面的中文,我写出了最后的flag结果,如下。
五、CTF题: 千回百转AES---HDCTF
我们得到的仅仅只有一个镜像文件。
1.获取系统信息和发现关键词
查看系统的镜像基本信息。使用命令vol.py -f memory.img imageinfo
,发现第一个profile系统信息显示无任何信息,于是采取第二profile进行内存分析取证。
在转而使用第二profile信息查看后,并且进行关键字flag的文件扫描,使用grep针对关键字flag信息针对查看,发现一个文件png,后面lnk是快捷方式。
然后我们把图片保存转储出来,使用命令:
发现可以直接打开,是一个二维码信息,尝试使用https://cli.im/deqr草料二维码识别结果。
解码结果为发现是==结尾的base64编码,尝试使用base64解码,可是最后结果却大失所望,那么此时我们应该转向什么方向呢?也许还可以继续从内存镜像查找flag。
jfXvUoypb8p3zvmPks8kJ5Kt0vmEw0xUZyRGOicraY4=
解码后结果:乱码
2.转向图片查看器的flag信息
这里最重要的是通过扫描windows来查看与flag相关的窗口,发现这个flag文件由窗口windows的图片查看器打开过,这也是理所当然,除了用资源管理器打开,一般情况还用啥打开呢?所以接下里我们转储explorer.exe资源管理器的文件,和可能与flag的关键信息有关。
这里类似于三步走操作:查找,然后找explorer.exe进程pid号,为了转储进程分析解密。使用命令vol.py -f memory.img --profile=Win2003SP1x86 windows | grep flag
找到与flag相关联的窗口。
使用命令:vol.py -f memory.img --profile=Win2003SP1x86 pslist | grep flag
找到与flag相关的进程,然后使用命令:vol.py -f memory.img --profile=Win2003SP1x86 memdump -p 1992 -D ./
生成的1992.dump文件。(PID号为1992)
- 处理保存后的Explorer.exe->1992.dump获取Flag
这里考察了用forest工具自动分离几个不同格式和在一起的混合未知文件,然后根据格式之间的差异自动分开成已知有效文件,使用命令forest 1992.dump
发现了Key和IV代表AES加密中的密码和偏移量,联想之前的Base64也不是没有用,很可能就是密文,使用这三个来解密成明文,做题的思路一般就是多信息的查找和利用。
如图,显示AES加密工具,得到结果,注意编码选择Base64的就是正确的,使用网站搜索一个在线解密工具https://www.mklab.cn/utils/aes。成功得到答案:flag{F0uNd\_s0m3th1ng\_1n\_M3mory}
key:Th1s_1s_K3y00000
iv: 1234567890123456
密文:jfXvUoypb8p3zvmPks8kJ5Kt0vmEw0xUZyRGOicraY4=
六、CTF题:风过留声---白帽子内存数字取证
1.查看被同学在记事本里偷摸留下的东西
根据内存镜像系统信息,然后找到记事本,直接打开记事本相关信息。
使用命令vol.py -f 镜像文件名 imageinfod
得到系统版本,根据版本信息分析得到notepad信息,使用命令vol.py -f 镜像文件名 --profile=WinXPSP2x86 notepad
代表指定记事本查看。
最大以E结尾,所以考虑16进制编码,可以16进制转字符,成功获取结果:flag{W3lec0me_7o_For3n5ics}。
2.查看同学偷摸在你的电脑里执行命令
扫描使用的cmd命令,使用命令:vol.py -f 镜像文件名 --profile=WinXPSP2x86 cmdscan
,发现查看了我的电脑网络信息,打开了netcat,下载了zip压缩文件到我的电脑里,现在考虑找到这个文件,然后filedump保存下来,查看转储文件。
使用命令filescan文件扫描,指定关键字p@ssw0rd_is_y0ur_bir7hd4y.zip使用grep管道过滤出来,找到了就得到偏移量,根据偏移量可以使用dumpfile转储文件,成功得到源文件。
注意要考工具中的暴力破解工具了,打不开文件的话,尝试命令zip2john 压缩名 > hsash
使用zip2john工具暴力破解,得到hash名的文件,使用命令john hash
成功获取结果
{19950101}
输入加密的压缩包,成功获取结果flag{Thi5_Is_s3cr3t!}。
<img src="https://shs3.b.qianxin.com/attack_forum/2022/09/attach-351750c9d58e9708e760c0b908fb799264b0df0e.png" alt="image-20220906225152194" style="zoom: 80%;" />
七、总结
本教程只能算是抛砖引玉,期间也参考过其他更好的一些思路,不过最后还是认为最初的选择和感觉更适合第一次看见时候的思考和理解的,所以教程比较详细一些。
参考链接:
- http://volatility.tumblr.com
- http://volatility-labs.blogspot.com
- https://www.volatilityfoundation.org/
- https://zing.gitbooks.io/kali-lunix/content/
- https://github.com/volatilityfoundation/volatility
- https://wiki.wgpsec.org/knowledge/ctf/Volatility.html
- https://github.com/volatilityfoundation/volatility3/archive/refs/tags/v1.0.0.zip
- 本文作者: Tangerine
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1891
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!