一. 关于 volatility 的安装与使用

https://volatilevirus.home.blog/2018/08/31/the-volatility-framework/

volatility 是一款内存取证和分析工具,可以对 Procdump 等工具 dump 出来的内存进行分析,并提取内存中的文件。该工具支持 Windows 和 Linux,Kali 下面默认已经安装。
volatility 的许多功能由其内置的各种插件来实现,例如查看当前的网络连接,命令行中的命令,记事本中的内容等等。

我的电脑是ubuntu的。其实并没有装好这个工具,需要自己手动安装,装起来也比较简单,有两个小坑注意下

安装

安装本体

apt-get install volatility

安装各种依赖
Distorm3:牛逼的反编译库

pip install distorm3

Yara:恶意软件分类工具

pip install yara

PyCrypto:加密工具集

pip install pycrypto

PIL:图片处理库

pip install pil

OpenPyxl:读写excel文件

pip install openpyxl

ujson:JSON解析

pip install ujson

记录一个坑
首先这玩意儿必须在python2.7下跑
之后运行的时候会爆出

 “OSError: /usr/lib/libyara.so: cannot open shared object file: No such file or directory” 

的错误,解决方法

https://stackoverflow.com/questions/41255478/issue-oserror-usr-lib-libyara-so-cannot-open-shared-object-file-no-such-fi

ln -s /..<你py2.7的包路径>../lib/python2.7/dist-packages/usr/lib/libyara.so /usr/lib/libyara.so

使用与相关插件

启动命令

volatility -f <xxx.img> --profile=<运用的东西> <插件名字> <各种命令>

-f 自然不用说,--profile是调用的配置文件,这个等等结合插件说。

imageinfo

此特定命令通常用于标识操作系统,Service Pack和硬件体系结构(32位或64位)。
imageinfo输出告诉您在使用其他插件时应将参数传递给-profile = PROFILE的建议配置文件。可能有多个建议的配置文件,我们必须小心选择正确的配置文件。

内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

pslist/pstree/psscan

这是一个非常常用的插件,它有助于列出转储时运行的进程的详细信息。它示出了偏移量,过程名,过程ID(PID),该父进程ID(PPID),线程的数目,把手的数目,和日期/时间时,过程开始和退出。
pslist无法显示隐藏/终止进程。解决这个问题的插件是psscan,这个插件输出的内容会比pslist多得多。
pstree同样也是扫描进程的,但是是以进程树的形式出现的。

内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

cmdscan

可以用来查看受害者系统上攻击者操作的最强大的命令之一,无论他们是否打开cmd.exe
简单地说,您可以看到攻击者在命令提示符中键入的内容。

filescan

扫描当前打开的文件。配合 dumpfile有意想不到的效果
内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

dumpfile/memdump

文件缓存就在内存中,而这些缓存,就成了信息的采集点!

二者的相关参数如下:
内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

二 内存分析实战:InCTF 2018 Evil Crypter

参考wp https://volatilevirus.home.blog/2018/10/12/inctf-2018-evil-crypter-writeup/
下载地址 TODO

imageinfo 拿配置文件

volatility -f challenge.raw imageinfo
==>           Suggested Profile(s) : Win7SP1x86_23418, Win7SP0x86, Win7SP1x86

filescan桌面拿到关键文件

之后几种方法测试过去,有个notepad线程,但是看不出什么东西,其他几种也提取不到什么有趣的信息。

利用filescan扫描文件,并用各种正则表达式来匹配,可以发现桌面下有些有点意思的文件

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.5-7 InCTF/Forensics/Evilcrypter$ volatility -f ./challenge.raw  --profile Win7SP1x86_23418 filescan | grep Desktop
Volatility Foundation Volatility Framework 2.6
0x0000000004f34148      2      0 RW---- \Device\HarddiskVolume2\Users\hello\Desktop\suspision1.jpeg
...
0x000000003de1b5f0      8      0 R--rw- \Device\HarddiskVolume2\Users\hello\Desktop\evilscript.py.py
...
0x000000003e727e50      8      0 -W-rw- \Device\HarddiskVolume2\Users\hello\Desktop\vip.txt

很好,一个 py,一张图,一个vip.txt

解密得到第一段flag

读取py内容,发现这加密算法简直小儿科级别的。

import sys
import string

def xor(s):

    a = ''.join(chr(ord(i)^3) for i in s)
    return a


def encoder(x):

    return x.encode("base64")


if __name__ == "__main__":

    f = open("C:\\Users\\hello\\Desktop\\vip.txt", "w")

    arr = sys.argv[1]

    arr = encoder(xor(arr))

    f.write(arr)

    f.close()

解码vip.txt即可得到第一段flag

inctf{0n3_h4lf

steghide解密图片拿第二段flag

之后到了图片这里,利用steghide和第一段flag解开就是第二段flag

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.5-7 InCTF/Forensics/Evilcrypter/dump$ steghide extract -sf suspision1.jpeg  -p inctf{0n3_h4lf
the file "secret text" does already exist. overwrite ? (y/n) y
wrote extracted data to "secret text".
shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.5-7 InCTF/Forensics/Evilcrypter/dump$ cat secret\ text 
_1s_n0t_3n0ugh}

三. 内存分析实战:2018护网杯预选赛

文件下载地址 TODO

imageinfo 拿配置

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc$ volatility -f easy_dump.img imageinfo
          Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_23418

pslist 找到notepad进程

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc$ volatility -f easy_dump.img --profile=Win7SP1x64 pslist 
Volatility Foundation Volatility Framework 2.6
Offset(V)          Name                    PID   PPID   Thds     Hnds   Sess  Wow64 Start                          Exit                          
0xfffffa8007eb3b30 notepad.exe            2872   1244      1       57      1      0 2018-10-02 13:26:51 UTC+0000                                

memdump 查看notepad进程

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc$ volatility -f easy_dump.img --profile=Win7SP1x64 memdump -D . -p 2872
Volatility Foundation Volatility Framework 2.6
************************************************************************
Writing notepad.exe [  2872] to 2872.dmp
  • -D 表示导出文件的路径
  • -p 表示进程号

一般内存使用16位小端序的方式,要使用strings -e l ./2872.dmp | grep flag的方法搜索,可以找到flag

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc/easy_dump_output$ strings -e l ./2872.dmp | grep flag
flag{flag is not here,but I put an strange jpg for you,hope you like it :)} 
flag{flag is not here,but I put an strange jpg for you,hope you like it :)} 
flag{flag is not here,but I put an strange jpg for you,hope you like it :)} 

好吧flag不再这里,但是它在一个图片里。

filescan 找到奇怪的jpg

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc$ volatility -f easy_dump.img --profile=Win7SP1x64 filescan | grep jpg
Volatility Foundation Volatility Framework 2.6
0x00000000230bef20     32      0 RW---- \Device\HarddiskVolume1\phos.jpg

foremost一波拿到一个zipjpg

从zip到二维码

解压zip得到一个.img文件,挂载,又拿到一些东西

root@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc/easy_dump_output/output/message_mount# tail -n 10 hint.txt 
269 260
269 261
269 262
269 263
269 264
269 265
269 266
269 267
269 268
269 269

hint.txt文件都是一些数字,看上去是个图片
内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

gnuplot 画出来是个二维码,用python把它画出来。

#!/usr/bin/env python
# coding=utf-8
from PIL import Image

img=Image.new('RGB',(270,270))
imgload=img.load()

with open('output.txt') as f:
    data=f.readlines()
    for i in data:
        x,y=i.split(' ')
        try:
            imgload[int(x),int(y)]=(255,255,255)
        except:
            print(i)
    img.show()
内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

扫描二维码,可以得到一个密钥

root@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc/easy_dump_output/output# cat hint.txt 
Here is the vigenere key : aeolus 

vim 文件恢复与getflag

而发现这个目录下还有隐藏的文件,点开是个vim的备份文件。其实直接正则message.img文件也是可以找到的

root@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018.10.12 护网杯/Misc/easy_dump_output/output# strings message.img | grep [[:alpha:]]
yispyweispyl!jyge_zanh_oyx_kopjp

直接过去解维吉尼亚密码即可getflag
内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

四. 内存分析实战:TJCTF 2018 - virusvolatile

文件下载地址 TODO
这道是...真的牛逼....

题目描述

这些天我的电脑似乎运行得很慢。我可能下载了病毒或其他东西。幸运的是,在坠毁之前我能抓住一些东西。
请提交整个小写标志(包括tjctf {})的md5哈希,而不是实际提交标志。

imageinfo 拿配置文件

内存分析第一遍,imageinfo直接上

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018 TJCTF Volatile Virus$ volatility -f file_patched.dmp imageinfo
          Suggested Profile(s) : Win7SP1x86_23418, Win7SP0x86, Win7SP1x86_24000, Win7SP1x86 (Instantiated with WinXPSP2x86)

从下载入手!

通过查找进程树,能够找到chrome和py。

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018 TJCTF Volatile Virus$ volatility -f file_patched.dmp --profile=Win7SP1x86_23418 pstree
Volatility Foundation Volatility Framework 2.6
Name                                                  Pid   PPid   Thds   Hnds Time
-------------------------------------------------- ------ ------ ------ ------ ----
 0x860b33a8:explorer.exe                             2292   2276     48   1248 2018-08-06 03:13:12 UTC+0000
. 0x86139d20:chrome.exe                              3968   2292     35   1264 2018-08-06 03:14:13 UTC+0000
.. 0x850d0d20:chrome.exe                             3500   3968      6    143 2018-08-06 03:16:00 UTC+0000
. 0x8506b030:python.exe                              2976   2292      1     58 2018-08-06 03:15:14 UTC+0000

既然是下载,那就是找下载的文件夹了,一般windows下载的内容都放在 Download 文件夹中。

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018 TJCTF Volatile Virus$ volatility -f file_patched_tjctf.dmp --profile=Win7SP1x86_23418 filescan |  grep Downloads
[...LOT OF FIIIIIILES...]
0x000000000e080690      8      0 RW---- \Device\HarddiskVolume1\Users\IEUser\Downloads\keylogger.py
[...LOT OF FIIIIIILES...]

OK 找到了一个 keylogger.py 把它导出来

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018 TJCTF Volatile Virus$ volatility -f file_patched.dmp --profile=Win7SP1x86_23418 dumpfiles -D ./ -Q 0x000000000e080690

我们来看看这个键盘记录文件,前面的不重要重要的是这个路径

...
def on_key_up(event):
    key_combo = get_key_combo_code()
    key_clicks.append(key_combo)
    pickle.dump(key_clicks, open('C:\\Users\\IEUser\\AppData\\Local\\Temp\\logs.pkl', 'wb'))
    keys_held.remove(event.Key)
    return True

hm = pyHook.HookManager()   
hm.KeyDown = on_key_down
hm.KeyUp = on_key_up
hm.HookKeyboard()
pythoncom.PumpMessages()

键盘记录文件恢复

0x000000000f275d50      3      0 R--rwd \Device\HarddiskVolume1r\AppData\Local\Temp\logs.pkl
0x00000000185883d8      8      0 -W-rw- \Device\HarddiskVolume1\Users\IEUser\AppData\Local\Temp\logs.pkl
0x00000000decc23d8      8      0 -W-rw- \Device\HarddiskVolume1\Users\IEUser\AppData\Local\Temp\logs.pkl

通过正则可以找到这个文件,把它dump下来。百度以下pkl文件的读取方法,得知python有一个库能够解析它

>>> import pickle
>>> data = pickle.load(open('logs.pkl', 'rb'))
>>> print(data)
['W', 'W', 'W', 'Oem_Period', 'G', 'O', 'O', 'G', 'L', 'E', 'Oem_Period', 'C', 'O', 'M', 'Return', 'W', 'J', 'A', 'Back', 'Back', 'H', 'H', 'A', 'T', 'Back', 'Back', 'Back', 'A', 'T', 'Space', 'I', 'S', 'Space', 'A', 'Space', 'C', 'T', 'F', 'Return', 'T', 'J', 'C', 'T', 'F', 'Oem_Period', 'O', 'R', 'G', 'Return', 'Lcontrol+L', 'Lcontrol', 'G', 'O', 'O', 'G', 'L', 'E', 'Oem_Period', 'C', 'O', 'M', 'Return', 'H', 'O', 'W', 'Space', 'T', 'O', 'Space', 'G', 'E', 'T', 'Space', 'G', 'O', 'O', 'D', 'Space', 'A', 'T', 'Space', 'F', 'O', 'R', 'T', 'I+N', 'I', 'T', 'E', 'Return', 'Lcontrol+L', 'Lcontrol',
'W', 'H', 'O', 'Space', 'I', 'S', 'Space', 'N', 'I', 'N', 'J', 'A', 'Return', 'Lcontrol+L', 'Lcontrol', 'W', 'H', 'Y', 'Space', 'D', 'O', 'E', 'S', 'Space', 'N', 'I', 'N', 'J', 'A', 'Space', 'H', 'A', 'V', 'E', 'Space', 'L', 'I', 'G', 'M', 'A', 'Return', 'Lcontrol+L', 'Lcontrol', 'L', 'I', 'G', 'M', 'A', 'Return', 'Lcontrol+L', 'Lcontrol', 'G', 'O', 'O', 'G', 'L', 'E', 'Oem_Period', 'C', 'O', 'M', 'Return', 'Lwin+R', 'Lwin', 'T', 'Back', 'N', 'O', 'T', 'E', 'P', 'A', 'D', 'Return', 'P', 'U', 'B', 'L', 'I', 'C', 'Space', 'S', 'T', 'A', 'T', 'I', 'C', 'Space', 'V', 'O', 'I', 'D', 'Space', 'Oem_4+Rshift', 'Rshift', 'Return', 'Return', 'Oem_6+Rshift', 'Rshift', 'Up', 'Return', 'Return', 'Up', 'Tab', 'P', 'Back', 'A+Lcontro ....

好吧,这些内容其实并不可读,我并没有在网上找到一个还算可行的脚本来分析它。只能自己来读取了。我注意到里面有 TJCTF这几个字,很明显能够读到些有用的东西,解析下来是这样的。

'TJCTF.ORG',
'TJCTF{TH1S_1S_N0T_A_V1RU5_',

至于别的内容,WP把它解析出来了,可以去看看原来的wp。我大概就自己做到了这里。

下载了什么?

在之前的下载目录中,除了这个键盘记录的东西外,还有一些乱七八糟的东西,这些是突破口。原生的volatility并不能完成这些操作。需要加载插件Superponible

  • Chrome插件介绍:https://blog.superponible.com/2014/08/31/volatility-plugin-chrome-history/
  • GitHub地址:https://github.com/superponible/volatility-plugins

利用这个插件,可以导出一个csv文件,方便来查阅内容

shaobao@shaobao-Precision-3510:~/桌面/CTF_BOX/CTF_race/2018 TJCTF Volatile Virus$ volatility  --plugins=<插件目录>/volatility/plugins -f file_patched_tjctf.dmp --profile=Win7SP1x86_23418 chromedownloads --output csv > data.csv

这样就可以得到所有经由网络下载到本地的文件。打开这个CSV,确实非常的...头疼

仔细看能够看到有个文件的内容是以}结尾的,当文件通过文件大小升序排列的时候,它在最末尾。也就意味着当把文件名按照文件大小的顺序提取后,就是flag的后半部分了。

内存取证工具volatility用法与实战-ShaoBaoBaoEr's Blog

对此,把文件名粘帖到txt里面,替换到一些多余的内容就拿到了flag的后半部分。

>> D73C00EDD0C6F9FD2D9ED2D9E80CBDBE1C494A699E87AAB38B7139DE0B284581C8042C8042C968C5BA5571568EA7037A7037A70375603AF425A238823F6951FA712EEA8B0A9173830C113E76E08FBA833F47BE2CDB2DD8089A9206910445CD445CD445CDA7DFE792C18C4F4FE6B8AF4A560291E09832AC882AC88112E8ED80DED80DED80D02F601D21850D6CF3FBC5CD90D6A89396172757E3F6A6DE516C94491CB1C0A3146C45AB85B669F38D4297BA58CC8B91792F1A51491867D3D0E8401319E8A4812F501F5701F57E3CCD0FB71521B6BD86F3ACBB2E887181F0E71C20F32DC65BC5BEC8C1728BC391CEECF8530A3864C86B545F5ECDA182941F9C27CC11B53FB9865E7D2730A42B8A87854}

将两个内容拼起来MD5即可

getflag

$ echo -n 'tjctf{th1s_1s_n0t_a_v1ru5_D73C00EDD0C6F9FD2D9ED2D9E80CBDBE1C494A699E87AAB38B7139DE0B284581C8042C8042C968C5BA5571568EA7037A7037A70375603AF425A238823F6951FA712EEA8B0A9173830C113E76E08FBA833F47BE2CDB2DD8089A9206910445CD445CD445CDA7DFE792C18C4F4FE6B8AF4A560291E09832AC882AC88112E8ED80DED80DED80D02F601D21850D6CF3FBC5CD90D6A89396172757E3F6A6DE516C94491CB1C0A3146C45AB85B669F38D4297BA58CC8B91792F1A51491867D3D0E8401319E8A4812F501F5701F57E3CCD0FB71521B6BD86F3ACBB2E887181F0E71C20F32DC65BC5BEC8C1728BC391CEECF8530A3864C86B545F5ECDA182941F9C27CC11B53FB9865E7D2730A42B8A87854}' | md5sum
0be1ffc97da3488ae7f25bcbf966cb73