0xThrL狗蛋师傅整理的内存取证笔记 有问题可以联系狗蛋师傅VX:GD0xThrL
这是国赛里面有的内存取证相关的学习笔记绝对的详细
目录
Volatility是一款开源的内存取证分析工具,支持Windows,Linux,MaC,Android等多类型操作系统系统的内存取证方式。该工具是由python开发的,目前支持python2、python3环境。目前作者已公布了两个版本的Volatility,Volatility2是基于py2环境,Volatility3是基于py3环境,接下来小编将带领大家分别对这两个环境进行安装。
这是国赛样题公布出的内存取证方向师傅们在练手
第二部分 数字取证调查(150分)
任务2 :基于Linux的内存取证(40分)
A集团某服务器系统感染恶意程序,导致系统关键文件被破坏,请分析A集团提供的系统镜像和内存镜像,找到系统镜像中的恶意软件,分析恶意软件行为。
本任务素材清单:存储镜像、内存镜像。
请按要求完成该部分的工作任务。
任务2:基于Linux的内存取证
序号
任务内容
答案
1
请提交用户目录下压缩包的解压密码
2
请提交root账户的登录密码
3
请指出攻击者通过什么命令实现提权操作
4
请指出内存中恶意进程的PID
5
请指出恶意进程加密文件的文件类型
一、安装Volatility(Linux版)
- 在volatility官网下载一个linux版本的安装包
- 下载下来的文件放到/usr/local/sbin目录下 用户自己编译的软件默认会安装到这个目录下(差不多就等于放可执行文件的)
- 解压:unzip FileName.zip
- 文件夹改名 mv FileName volatility
- 在使用是可能会权限失败,那就单独吧文件拿出来使用
- 添加环境变量 echo $PATH
- 可以直接使用了
- 可以直接分析 vmem文件
二、Volatility命令大全
-
volatility -f xxx.vmem imageinfo 分析系统 第一步 知道系统后加上 profile=xxxx
- 查看用户名和密码
-
volatility -f xxx.vmem profile=Win7SP1x64 hashdump/lsadump
-
- 查看进程
-
volatility -f xxx.vmem --profile=Win7sp1x64 pslist/pstree(与pslist差不多,但可以识别子进程和父进程)/psscan显示隐藏进程
-
- 提取进程
-
volatility -f xxx.vmem --profile=Win7sp1x64 memdump -p [PID] -D 保存路径 以dump形式保存
-
volatility -f xxx.vmem --profile=Win7sp1x64 procdump -p [PID] -D 保存路径 以exe形式保存
- 同时还支持输入 --offset地址的方式来提取一些无法从pid提的进程
-
volatility -f xxx.vmem --profile=Win7sp1x64 procdump --offset 0x7d789b50 -D 路径
-
- 查看命令行操作
-
volatility -f xxx.vmem --profile=Win7sp1x64 cmdscan
-
- 找计算机用户名 步骤
-
volatility -f xxx.vmem --profile=Win7sp1x64 hivelist 查看注册表
- 找到system的位置 我这里是0xfffff8a000024010
- 打开注册表键值
volatility -f xxx.vmem --profile=Win7sp1x64 printkey
-
volatility -f xxx.vmem --profile=Win7sp1X64 -o 0xfffffffffffff(system地址)printkey 指定查看 查看system的注册表用户有哪些
-
volatility -f xxx.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001\(键值)" 查看system注册表键值
- 一定要注意的是反斜杠 \\\\\\\\\\ 一般计算机名都在“ControlSet001\Control\ComputerName\ComputerName”
- 此题的计算机名就在此
-
- 注册表数据
-
volatility -f xxx.vmem --profile=Win7sp1x64 hivelist (找注册表system位置)
-
volatility -f xxx.vmem --profile=Win7sp1x64 hivedump -o 0xfffff8a000024010(注册表的Virtual)
-
- 查看网络连接
-
volatility -f xxx.vmem --profile=win7sp1x64 netscan
-
- 查看Windows服务
-
volatility -f xxx.vmem --profile=Win7SP1x64 svcscan
-
- 查看浏览器历史记录
-
volatility -f xxx.vmem --profile=Win7SP1x64 iehistory
-
- 查看剪切板数据
-
volatility -f xxx.vmem --profile=Win7SP1x64 clipboard
- 加参数 -v 可以到处数据
-
volatility -f xxx.vmem --profile=Win7SP1x64 clipboard -v >clip.txt
-
- 查看所有进程
-
volatility -f xxx.vmem --profile=Win7sp1x64 dilllist
- 加参数 -p [PID] 可以看进程相关的dll文件列表
-
- 获取内存中正在运行的程序
-
volatility -f xxx.vmem --profile=Win7sp1x64 userassist
-
除了这些命令以外,在取证中还会用到一些命令 我也给大家整理了一下
grep xxx -A 5 -B 5 / grep xxx -C 5
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
binwalk xxx.exe 分析文件
三、内存取证实操
我这里拿的是OtterCTF靶场里面的取证题实操 就是水懒CTF 绝对的干货实操 绝对的详细
- 1.What the password?
- you got a sample of rick’s PC’s memory. can you get his user password?(你得到了瑞克电脑内存的样本,你能得到他的用户密码吗?
- 使用 volatility -f qz.vmem imageinfo 获取基本信息 profile为Win7SP1x64
- volatility -f qz.vmem --profile=Win7SP1x64 hashdump 用hashdump查看一下密码 发现全是MD5加密过的
- volatility -f qz.vmem --profile=Win7SP1x64 lsadump 用lsadump获取一下明文的密码
- 得到 CTF{MortyIsReallyAnOtter}
- 2.General Info
- Let’s start easy - whats the PC’s name and IP address?(让我们从简单的开始–电脑的名称和IP地址是什么?)
- volatility -f qz.vmem --profile=Win7SP1x64 netscan 使用netscan查看IP地址 得到IP地址:192.168.202.131
- volatility -f qz.vmem --profile=Win7SP1x64 hivelist 使用hivelist查看注册表
- volatility -f qz.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey 使用printkey查看注册表system值
- 接下来在表里进行翻找
- volatility -f qz.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001"
- volatility -f qz.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001\Control" 翻到这里时发现了一个名为ComputerName的值
- volatility -f qz.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001\Control\ComputerName" 一直不停的解析
- volatility -f qz.vmem --profile=Win7SP1x64 -o 0xfffff8a000024010 printkey -K "ControlSet001\Control\ComputerName\ComputerName"
- 电脑名称: WIN-LO6FAF3DTFE IP地址:192.168.202.131
- 3.Play Time
- Rick just loves to play some good old videogames. can you tell which game is he playing? whats the IP address of the server?(瑞克只是喜欢玩一些好的老式电子游戏,你能告诉他在玩哪个游戏吗? 服务器的IP地址是什么?)
- volatility -f qz.vmem --profile=Win7SP1x64 netscan 使用netscan查看 在这里看到 LuanrMS google发现是一款游戏 但是没有找到服务器的IP地址
- volatility -f qz.vmem --profile=Win7SP1x64 netscan|grep LunarMS.exe 使用|grep精准查找一下
- CTF{LunarMS} CTF{77.102.199.102}
- 4.NameGame
- We know that the account was logged in to a channel called Lunar-3. what is the account name?(我们知道该账户登录了一个名为Lunar-3的频道。什么是账户名称?)
- 方法一
- strings qz.vmem | grep "Lunar-3" -C 5
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- strings qz.vmem | grep "Lunar-3" -C 5
- 方法二
- strings qz.vmem | grep Lunar-3 -A 5 -B 5
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- strings qz.vmem | grep Lunar-3 -A 5 -B 5
- CTF{0tt3r8r33z3}
- 5.NameGame2
- From a little research we found that the username of the logged on character is always after this signature: 0x64 0x??{6-8} 0x40 0x06 0x??{18} 0x5a 0x0c 0x00{2} What’s rick’s character’s name?(通过一点研究,我们发现,登录的字符的用户名总是在这个签名之后。0x64 0x??{6-8} 0x40 0x06 0x??{18} 0x5a 0x0c 0x00{2} 瑞克的角色叫什么名字?
- volatility -f qz.vmem --profile=Win7SP1x64 memdump -p 708 -D ./ 先将LunarMS.exe dump出来 然后进一步分析
- hexdump 708.dmp | grep "5a 0c 00" -A 3 -B 3 进行搜索 或者放到WinHex里面找也可以
- CTF{M0rtyL0L}
- 6.Silly Rick
- Silly rick always forgets his email’s password, so he uses a Stored Password Services online to store his password. He always copy and paste the password so he will not get it wrong. whats rick’s email password?(愚蠢的瑞克总是忘记他的电子邮件的密码,所以他使用在线存储密码服务来存储他的密码。他总是复制和粘贴密码,这样他就不会弄错。瑞克的电子邮件密码是什么?)
- volatility -f qz.vmem --profile=Win7SP1x64 clipboard 使用clipboard查看剪切板
- CTF{M@il_Pr0vid0rs}
- 7.Hide And Seek
- The reason that we took rick’s PC memory dump is because there was a malware infection. Please find the malware process name (including the extension)(我们提取瑞克的电脑内存转储的原因是有一个恶意软件感染。请找到恶意软件的进程名称(包括扩展名))
- volatility -f qz.vmem --profile=Win7SP1x64 pslist 使用pslist查看一下进程
- 发现一个问题 在程序中运行着一个vmware-tray.exe 此程序是虚拟机在任务栏里面的那个小图标 但是除了他以外没有任何关于虚拟机的服务
- volatility -f qz.vmem --profile=Win7SP1x64 pstree 使用pstree查看一下父进程子进程
- 很奇怪的是这个vmware-tray.exe 居然是Rick And Morty的子进程 更加验证刚才的猜疑
- volatility -f qz.vmem --profile=Win7SP1x64 dlllist -p 3720 使用dlllist查看一下进程相关的dll文件列表
- 这个进程的执行目录是在temp,所以说一看就不是什么正经程序
- CTF{vmware-tray.exe}
- 8.Path To Glory
- How did the malware got to rick’s PC? It must be one of rick old illigal habits…(恶意软件是如何进入里克的电脑的?这一定是瑞克的一个老习惯…)
- 这个题没给什么思路 但是在上一题的时候提到了是Rick And Morty的子进程,于是搜索一下跟这个有关的文件,搜到了三个种子文件,每个都dump下来
- 这三个都进行筛选字符,只有第二个发现了可疑字符串
- 当做答案提交时 结果错了 最后上网看师傅们的wp发现末尾的e是没有的,我也不明白为什么
- CTF{M3an_T0rren7_4_R!ck}
- 9.Path To Glory 2
- Continue the search after the the way that malware got in.(在恶意软件进入后继续搜索。) #在网上有一万种解法 我写一下自己的思路
- 在上一题的时候发现了三个.exe文件和种子文件 那种子文件是需要下载的
- 浏览器的进程dump下来
- 然后用strings命令打印一下 加上grep筛选一下 条件(种子名)=Rick And Morty season 1 download.exe.torrent
- CTF{Hum@n_I5_Th3_Weak3s7_Link_In_Th3_Ch@in} 最后需要吧Year去掉
- 10.Bit 4 Bit
- We’ve found out that the malware is a ransomware. Find the attacker’s bitcoin address.(我们发现这个恶意软件是勒索软件。找到攻击者的比特币地址。)
- 勒索软件总喜欢吧勒索标志丢在显眼的地方,所以搜索桌面的记录
- volatility -f qz.vmem --profile=Win7SP1x64 filescan | grep "Desktop" 两个文件 一个flag.txt 这题肯定用不到 另一个Read_it
- 提取Read_it volatility -f qz.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007d660500 -D ./ 提示查看程序或多更多信息(也就是上面的Vmware-tray.exe)
- volatility -f qz.vmem --profile=Win7SP1x64 memdump -p 3720 -D ./ 提取出来
- 提取后 根据题目提示 ransomware 搜索赎金相关内容
- strings -e l 3720.dmp | grep -i -A 5 "ransomware"
- CTF{1MmpEmebJkqXG8nQv4cjJSmxZQFVmFo63M}
- 11.Graphic's For The Weak
- There’s something fishy in the malware’s graphics.(恶意软件的图形中有些可疑。)
- volatility -f qz.vmem --profile=Win7SP1x64 procdump -p 3720 -D ./ 使用procdump转存进程为可执行的文件
- binwalk executable.3720.exe 使用binwalk分析文件 发现存在图片
- 使用dnSpy逆向文件 在资源处就能看到此图片
- CTF{S0_Just_M0v3_Socy}
- 12.Recovery
- Rick got to have his files recovered! What is the random password used to encrypt the files?(里克得把他的档案找回来!用于加密文件的随机密码是什么?)
- 这一题就是找出加密文件所使用的的密码
- 分析exe可以在form1中看到两个函数 第一个创建密码是随机的,然后是发送密码sendpassword函数、密码格式为computerName和userName还有password拼接后发送
- 前面得到的computeName是 WIN-LO6FAF3DTFE ,userName是Rick,所以这个函数发送的字符串应该是WIN-LO6FAF3DTFE-Rick-password
- 接下来直接去勒索软件的内存搜索或者直接在题目内存搜索都可以
- 勒索软件内存: strings -el 3720.dmp | grep 'WIN-LO6FAF3DTFE-Rick' 加参数C是为了确保它100%可以显示
- 题目内存:strings -el qz.vmem | grep 'WIN-LO6FAF3DTFE-Rick' 一样可以出来 就是有点慢
- CTF{aDOBofVYUNVnmp7}
- 13.Closure
- Now that you extracted the password from the memory, could you decrypt rick’s files?(既然你从内存中提取了密码,你能解密瑞克的文件吗?)
- 在上一题中已经获得了密码 aDOBofVYUNVnmp7 ,这个题让我们解密文件
- 在前面分析软件时 发现多次出现Desktop 猜想被加密的文件就放在桌面
- 发现有两个文件 READ_IT已经看过 所以这次将flag.txtdump下来
- volatility -f qz.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000007e410890 -D ./
- 解密过程 :
- 已知这个勒索软件为HiddenTear 直接在网上找到解密程序HiddenTearDecrypter
- 先将文件末尾多余的0去掉 再把后缀加上.png.locked
- 打开解密后的文件得到 CTF{Im_Th@_B3S7_RicK_0f_Th3m_4ll}