1 基本使用与详情
首先查看它都有什么命令:
它有丰富的插件命令,可以完成大量的工作。
比如以下常用插件命令:
Pslist
枚举系统中的进程。
Pstree
以树的形式枚举系统中的进程。
Modscan
扫描_ldr_data_table_entry对象的物理内存。
Kpcrscan
查找内存中用于定义内核处理器控制区域(KPCR)的_KPCR结构体信息。
Dlllist
显示一个进程装载的动态链接库的信息。
Filescan
显示系统上的打开的文件。
Handles
显示在一个进程中打开的处理。
Netscan
发现TCP / UDP端点和监听器。
...
我们使用这条命令:vol.py--info,会列出以下几大部分的内容:
Profiles
Scanner Checks
Address Spaces
Plugins(不带前缀的是windows的插件,带linux前缀的是linux的插件,带mac前缀的是mac的插件)
我们查看具体的linux插件:
经常使用的命令
(1)查看镜像需要的profile
vol.py -f <镜像文件> imageinfo
(2)查看进程信息
vol.py -f <镜像文件> --profile=[profile文件] pslist
(3)查看具体恶意进程
vol.py -f <镜像文件> --profile=[profile文件] pstree | egrep '(a.exe|b.exe)' 以树的形式列出
(4) 检查恶意链接
检查链接插件:vol.py -f <镜像文件> --profile=[profile文件] connections
检查端口插件:vol.py -f <镜像文件> --profile=[profile文件] sockets
(5)检测DLL
vol.py -f <镜像文件> --profile=[profile文件] dlllist -p[pid]
vol.py -f <镜像文件> --profile=[profile文件] ldrmodules -p[pid] -v 显示包括隐藏dll的具体信息
(6)找出注入的可执行代码或者DLL
vol.py -f <镜像文件> --profile=[profile文件] malfind -p[pid]
(7)导出程序
vol.py -f <镜像文件> --profile=[profile文件] prodump -p [pid1,pid2,..pidn] -D [目录]
(8)查看恶意的钩子
vol.py -f <镜像文件> --profile=[profile文件] apihooks -p[pid]
(9)追踪
vol.py -f <镜像文件> --profile=[profile文件] volshell -p[pid]
(10)检查恶意驱动程序
vol.py -f <镜像文件> --profile=[profile文件] modules
(11)提取驱动程序
vol.py -f <镜像文件> --profile=[profile文件] moddump -D [目录] --base [base地址]
(12)检查驱动内核回调
vol.py -f <镜像文件> --profile=[profile文件] callbacks
(13)检查恶意注册表项
vol.py -f <镜像文件> --profile=[profile文件] printkey
(14)查看服务
vol.py -f <镜像文件> --profile=[profile文件] svcscan
2 详细使用
我们结合具体的案例来学习该工具的使用。震网(Stuxnet)病毒于2010年6月首次被检测出来,是第一个专门定向攻击真实世界中基础(能源)设施的“蠕虫”病毒,比如核电站,水坝,国家电网。我们使用带有该病毒的镜像。
注意[+]:以下实验内容来自合天实验室的Volatility:AnalyzingStuxnet01与Volatility:AnalyzingStuxnet02
网址:www.hetianlab.com/expc.do?ce=1f93108a-bc52-4c07-9ce9-4c6895157ca3
(1)查看镜像需要的profile
vol.py -f <镜像文件> imageinfo
(2)查看进程信息
vol.py -f <镜像文件> --profile=[profile文件] pslist
vol.py -f <镜像文件> --profile=[profile文件] pstree 以树的形式列出
(3)查看具体恶意进程
Lsass进程:
lsass.exe是一个系统进程,用于微软Windows系统的安全机制。它用于本地安全和登陆策略。一个正常的windows xp系统在启动的时候,只会通过winlogon.exe创建一个lsass进程。
Stuxnet会将自身注入到services.exe,然后创建两个新的lsass.exe,然后释放出mrxnet.sys(驱动)和Mrxcls.sys(驱动)等恶意文件。
(4) 检查恶意链接
检查链接插件:vol.py -f <镜像文件> --profile=[profile文件] connections
检查端口插件:vol.py -f <镜像文件> --profile=[profile文件] sockets
(5)检测DLL
vol.py -f <镜像文件> --profile=[profile文件] dlllist -p[pid]
vol.py -f <镜像文件> --profile=[profile文件] ldrmodules -p[pid] -v 显示包括隐藏dll的具体信息
(6)找出注入的可执行代码或者DLL
vol.py -f <镜像文件> --profile=[profile文件] malfind -p[pid]
发现了两个可疑的区域,在0x80000地址有两个进程,而且它们有PAGE_EXECUTE_READWRITE权限(正常的services.exe, lsass.exe不应该具有写权限)和MZ头,意味着PE可能存储在这里。
(7)导出程序
利用内存转储技术可以将内存中运行的程序导出来
vol.py -f <镜像文件> --profile=[profile文件] prodump -p [pid1,pid2,..pidn] -D [目录]
(8)查看恶意的钩子
首先使用linux下的strings命令查看进程调用的系统函数
vol.py -f <镜像文件> --profile=[profile文件] apihooks -p[pid]
(9)追踪
使用交互式的volshell 命令来查看hook地址前后的内存地址,以此来跟踪hook api流程。可以发现pid = 1928 ZwClose 开始的地址是 0x7C90cfd0,就从这里开:
vol.py -f <镜像文件> --profile=[profile文件] volshell -p[pid]
蓝色框中是正常的内存地址,而红色框是不正常的,可以看到两个不同的值被放到了EDX寄存器。正常的api调用的是0x7ffe0300,数值类型是dword(参照:The system call dispatcher on x86)。而Hooked api调用的是0x7c900050,接着跟踪 0x7c900050
可以看到在0x7c90005d去调用0x7c900066,但是根据反汇编,0x7c900066是在指令0x7c900062开始执行的中间,这可能是使用了一个抗反汇编的技巧。我们试着反汇编0x7c900066
果不其然,所以在调用执行0x7c90005d时,它的返回地址(0x7c900062)被压入堆栈。然后在0x7c900066 执行POP,从堆栈中删除该值,并将其放置在EDX。在0x7c900067,EDX取消引用和调用。所以被取消引用的指针是0x7c900062
该地址上的四个字节:f2009400. 鉴于字节顺序,这其实是0x009400F2
通过在这个位置分析代码,就可以了解钩子的确切目的。病毒修改ntdll.dll文件内存映像中PE头的保护属性,然后将偏移0x40处的无用数据改写为跳转代码,用以实现hook。然后使用ZwCreateSection在内存空间中创建一个新的PE节,并将要加载的DLL模块拷贝到其中。
退出交互模式:ctrl+d
(10)检查恶意驱动程序
vol.py -f <镜像文件> --profile=[profile文件] modules
使用 moddump提取驱动程序
计算sha256hash值 ,然后去www.virustotal.com搜索可查看报告
使用modscan来查找驱动
(11)检查驱动内核回调
(12)检查恶意注册表项
使用printkey插件,我们知道Services注册表项是这样的:ControlSet001\Services\SERVICENAME所以通过关键字来查找,使用如下命令:printkey -K 'ControlSet001\Services\MrxNet'
(13)使用 svcscan 来查看服务