背景
在自动化查杀中有提到过,如果恶意进程迁移到正常进程了,在没看到有网络连接的情况下,很难手动确认,这种情况下怎么去排查呢?当然是从内存中去分析了。
内存转储
建议使用DumpIt对内存进行转储,下载后双击运行即可,默认保存到桌面。也可以用 WinPmem、FTK Imager 等。
内存分析
安装配置
分析建议使用开源的volatility,安装可以看GitHub官方文档,使用的文档见Document
安装好后用插件记得下载符号表
- https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip
- https://downloads.volatilityfoundation.org/volatility3/symbols/mac.zip
- https://downloads.volatilityfoundation.org/volatility3/symbols/linux.zip
然后整个zip解压后放到 volatility3/symbols
目录下。
基础使用
帮助文档
# 查看整体帮助
python3 vol.py -h
# 查看单个插件的帮助
python3 vol.py windows.pslist.PsList --help
加载插件使用举例说明如下:
# python3 vol.py -f <内存文件> <插件> <插件参数>
python3 vol.py -f ../test/PDC-20240731-065952.raw windows.pslist.PsList
插件列表
截止 2024/07/31 的所有官方插件。
插件名 | 说明 |
---|---|
banners.Banners | 尝试识别镜像中的潜在Linux横幅 |
configwriter.ConfigWriter | 运行自动魔术并打印和输出配置到输出目录中 |
frameworkinfo.FrameworkInfo | 列出Volatility的各种模块化组件的插件 |
isfinfo.IsfInfo | 确定当前可用ISF文件或特定文件的信息 |
layerwriter.LayerWriter | 运行自动魔术并写出由堆叠器生成的主层 |
linux.bash.Bash | 从内存中恢复Bash命令历史记录 |
linux.capabilities.Capabilities | 列出进程的能力 |
linux.check_afinfo.Check_afinfo | 验证网络协议的操作功能指针 |
linux.check_creds.Check_creds | 检查是否有进程共享凭据结构 |
linux.check_idt.Check_idt | 检查IDT是否已被修改 |
linux.check_modules.Check_modules | 将模块列表与sysfs信息进行比较(如果可用) |
linux.check_syscall.Check_syscall | 检查系统调用表是否有挂钩 |
linux.elfs.Elfs | 列出所有进程的所有内存映射ELF文件 |
linux.envars.Envars | 列出进程及其环境变量 |
linux.iomem.IOMem | 生成类似于运行系统上/proc/iomem的输出 |
linux.keyboard_notifiers.Keyboard_notifiers | 解析键盘通知器调用链 |
linux.kmsg.Kmsg | 内核日志缓冲区读取器 |
linux.library_list.LibraryList | 枚举加载到进程中的库 |
linux.lsmod.Lsmod | 列出加载的内核模块 |
linux.lsof.Lsof | 列出所有进程的所有内存映射 |
linux.malfind.Malfind | 列出可能包含注入代码的进程内存范围 |
linux.mountinfo.MountInfo | 列出进程挂载命名空间中的挂载点 |
linux.netfilter.Netfilter | 列出Netfilter挂钩 |
linux.proc.Maps | 列出所有进程的所有内存映射 |
linux.psaux.PsAux | 列出带有命令行参数的进程 |
linux.pslist.PsList | 列出特定Linux内存映像中的进程 |
linux.psscan.PsScan | 扫描特定Linux映像中的进程 |
linux.pstree.PsTree | 以进程父ID为基础,以树形列出进程的插件 |
linux.sockstat.Sockstat | 列出所有进程的所有网络连接 |
linux.tty_check.tty_check | 检查TTY设备是否有挂钩 |
linux.vmayarascan.VmaYaraScan | 使用Yara扫描所有任务的虚拟内存区域 |
mac.bash.Bash | 从内存中恢复Bash命令历史记录 |
mac.check_syscall.Check_syscall | 检查系统调用表是否有挂钩 |
mac.check_sysctl.Check_sysctl | 检查sysctl处理程序是否有挂钩 |
mac.check_trap_table.Check_trap_table | 检查mach陷阱表是否有挂钩 |
mac.dmesg.Dmesg | 打印内核日志缓冲区 |
mac.ifconfig.Ifconfig | 列出所有设备的网络接口信息 |
mac.kauth_listeners.Kauth_listeners | 列出kauth监听器及其状态 |
mac.kauth_scopes.Kauth_scopes | 列出kauth作用域及其状态 |
mac.kevents.Kevents | 列出进程注册的事件处理程序 |
mac.list_files.List_Files | 列出所有进程的所有打开的文件描述符 |
mac.lsmod.Lsmod | 列出加载的内核模块 |
mac.lsof.Lsof | 列出所有进程的所有打开的文件描述符 |
mac.malfind.Malfind | 列出可能包含注入代码的进程内存范围 |
mac.mount.Mount | 包含生成Mac的mount命令中数据的插件集合的模块 |
mac.netstat.Netstat | 列出所有进程的所有网络连接 |
mac.proc_maps.Maps | 列出可能包含注入代码的进程内存范围 |
mac.psaux.Psaux | 恢复程序命令行参数 |
mac.pslist.PsList | 列出特定Mac内存映像中的进程 |
mac.pstree.PsTree | 以进程父ID为基础,以树形列出进程的插件 |
mac.socket_filters.Socket_filters | 枚举内核套接字过滤器 |
mac.timers.Timers | 检查恶意内核定时器 |
mac.trustedbsd.Trustedbsd | 检查恶意的trustedbsd模块 |
mac.vfsevents.VFSevents | 列出过滤文件系统事件的进程 |
timeliner.Timeliner | 运行所有提供时间相关信息的相关插件并按时间排序结果 |
vmscan.Vmscan | 扫描Intel VT-d结构并生成它们的虚拟机Volatility配置 |
windows.bigpools.BigPools | 列出大页面池 |
windows.cachedump.Cachedump | 从内存中转储lsa secrets |
windows.callbacks.Callbacks | 列出内核回调和通知例程 |
windows.cmdline.CmdLine | 列出进程的命令行参数 |
windows.crashinfo.Crashinfo | 列出Windows崩溃转储中的信息 |
windows.devicetree.DeviceTree | 基于驱动程序和连接设备列出特定Windows内存映像中的树 |
windows.dlllist.DllList | 列出特定Windows内存映像中的已加载模块 |
windows.driverirp.DriverIrp | 列出特定Windows内存映像中的驱动程序的IRP |
windows.drivermodule.DriverModule | 确定是否有加载的驱动程序被rootkit隐藏 |
windows.driverscan.DriverScan | 扫描特定Windows内存映像中的驱动程序 |
windows.dumpfiles.DumpFiles | 从Windows内存样本中转储缓存的文件内容 |
windows.envars.Envars | 显示进程环境变量 |
windows.filescan.FileScan | 扫描特定Windows内存映像中的文件对象 |
windows.getservicesids.GetServiceSIDs | 列出进程令牌SID |
windows.getsids.GetSIDs | 打印每个进程的所有者SID |
windows.handles.Handles | 列出进程的打开句柄 |
windows.hashdump.Hashdump | 从内存中转储用户哈希 |
windows.hollowprocesses.HollowProcesses | 列出被中空的进程 |
windows.iat.IAT | 提取导入地址表以列出程序使用的外部库中的API(函数) |
windows.info.Info | 显示正在分析的内存样本的操作系统和内核详细信息 |
windows.joblinks.JobLinks | 打印进程的作业链接信息 |
windows.kpcrs.KPCRs | 打印每个处理器的KPCR结构 |
windows.ldrmodules.LdrModules | 列出特定Windows内存映像中的已加载模块 |
windows.lsadump.Lsadump | 从内存中转储lsa secrets |
windows.malfind.Malfind | 列出可能包含注入代码的进程内存范围 |
windows.mbrscan.MBRScan | 扫描和解析潜在的主引导记录(MBR) |
windows.memmap.Memmap | 打印内存映射 |
windows.mftscan.ADS | 扫描备用数据流 |
windows.mftscan.MFTScan | 扫描特定Windows内存映像中的MFT文件对象 |
windows.modscan.ModScan | 扫描特定Windows内存映像中的模块 |
windows.modules.Modules | 列出已加载的内核模块 |
windows.mutantscan.MutantScan | 扫描特定Windows内存映像中的互斥体 |
windows.netscan.NetScan | 扫描特定Windows内存映像中的网络对象 |
windows.netstat.NetStat | 遍历特定Windows内存映像中的网络跟踪结构 |
windows.pedump.PEDump | 允许从特定地址空间中的特定地址提取PE文件 |
windows.poolscanner.PoolScanner | 一个通用的池扫描插件 |
windows.privileges.Privs | 列出进程令牌的权限 |
windows.processghosting.ProcessGhosting | 列出DeletePending位被设置或FILE_OBJECT设置为0的进程 |
windows.pslist.PsList | 列出特定Windows内存镜像中存在的进程 |
windows.psscan.PsScan | 扫描特定Windows内存镜像中存在的进程 |
windows.pstree.PsTree | 列出基于父进程ID的树状结构进程 |
windows.registry.certificates.Certificates | 列出注册表中证书存储的证书 |
windows.registry.getcellroutine.GetCellRoutine | 报告拥有被挂钩的GetCellRoutine处理程序的注册表配置单元 |
windows.registry.hivelist.HiveList | 列出特定内存镜像中存在的注册表配置单元 |
windows.registry.hivescan.HiveScan | 扫描特定Windows内存镜像中存在的注册表配置单元 |
windows.registry.printkey.PrintKey | 列出注册表配置单元下的注册表键或特定键值 |
windows.registry.userassist.UserAssist | 打印userassist注册表键及信息 |
windows.sessions.Sessions | 列出从环境变量中提取的具有会话信息的进程 |
windows.shimcachemem.ShimcacheMem | 从ahcache.sys AVL树中读取Shimcache条目 |
windows.skeleton_key_check.Skeleton_Key_Check | 查找Skeleton Key恶意软件的迹象 |
windows.ssdt.SSDT | 列出系统调用表 |
windows.statistics.Statistics | 列出有关内存空间的统计信息 |
windows.strings.Strings | 读取strings命令的输出,并指示每个字符串所属的进程 |
windows.suspicious_threads.SupsiciousThreads | 列出可疑的用户态进程线程 |
windows.svcdiff.SvcDiff | 比较通过列表遍历发现的服务与扫描发现的服务,以找到rootkits |
windows.svclist.SvcList | 列出services.exe双向链表中的服务 |
windows.svcscan.SvcScan | 扫描Windows服务 |
windows.symlinkscan.SymlinkScan | 扫描特定Windows内存镜像中存在的链接 |
windows.thrdscan.ThrdScan | 扫描Windows线程 |
windows.threads.Threads | 列出进程线程 |
windows.timers.Timers | 打印内核计时器和相关模块的DPC |
windows.truecrypt.Passphrase | TrueCrypt缓存密码查找器 |
windows.unloadedmodules.UnloadedModules | 列出卸载的内核模块 |
windows.vadinfo.VadInfo | 列出进程内存范围 |
windows.vadwalk.VadWalk | 遍历VAD树 |
windows.vadyarascan.VadYaraScan | 使用yara扫描所有虚拟地址描述符内存映射 |
windows.verinfo.VerInfo | 列出PE文件的版本信息 |
windows.virtmap.VirtMap | 列出虚拟映射的部分 |
yarascan.YaraScan | 使用yara规则(字符串或文件)扫描内核内存 |
解决疑问
现在基础使用已经OK了,回到我们背景中的疑问,怎么快速操作去发现。
# 查找注入的恶意代码
python3 vol.py -f ../test/PDC-20240731-090251.raw windows.malfind
# 恶意注入代码转储
python3 vol.py -o output/ -f ../test/PDC-20240731-090251.raw windows.malfind --pid 2452 --dump
因为也看不懂,就借助于云沙箱看看能不能匹配到特定的规则。
尽量还是用一些杀软吧,正常的也好,edr、hids也好,肯定比人工靠谱。