$npx -y skills add killvxk/cybersecurity-skills-zh --skill analyzing-memory-dumps-with-volatility使用 Volatility 框架分析被攻陷系统的 RAM 内存转储,以识别恶意进程、注入代码、 网络连接、加载模块和提取凭据。支持 Windows、Linux 和 macOS 内存取证。 适用于内存取证、RAM 分析、易失性数据检查、进程注入检测或内存驻留恶意软件调查相关请求。
| 1 | # 使用 Volatility 分析内存转储 |
| 2 | |
| 3 | ## 适用场景 |
| 4 | |
| 5 | - 被攻陷系统的 RAM 已被捕获,需要对恶意软件工件进行取证分析 |
| 6 | - 检测仅存在于内存中、没有持久化磁盘工件的无文件恶意软件 |
| 7 | - 从进程内存中提取加密密钥、密码或解密后的配置 |
| 8 | - 识别被攻陷系统中的进程注入、DLL 注入或进程空洞化 |
| 9 | - 分析隐藏在标准磁盘取证工具之外的 Rootkit 活动 |
| 10 | |
| 11 | **不适用于**磁盘镜像分析;请使用 Autopsy、FTK 或 Sleuth Kit 进行磁盘取证。 |
| 12 | |
| 13 | ## 前置条件 |
| 14 | |
| 15 | - Volatility 3 已安装(`pip install volatility3`),并带有目标操作系统的符号表 |
| 16 | - 从目标系统获取的内存转储文件(使用 WinPmem、LiME 或 DumpIt) |
| 17 | - 了解源操作系统版本,用于正确选择配置文件/符号 |
| 18 | - 足够的磁盘空间(内存转储可达 4-64 GB) |
| 19 | - 用于扫描内存中已知恶意软件签名的 YARA 规则 |
| 20 | - Strings 工具,用于从内存区域提取可读字符串 |
| 21 | |
| 22 | ## 工作流程 |
| 23 | |
| 24 | ### 步骤 1:识别内存转储配置文件 |
| 25 | |
| 26 | 从内存转储中确定操作系统和版本: |
| 27 | |
| 28 | ```bash |
| 29 | # Volatility 3:自动操作系统检测 |
| 30 | vol3 -f memory.dmp windows.info |
| 31 | |
| 32 | # 列出可用插件 |
| 33 | vol3 -f memory.dmp --help |
| 34 | |
| 35 | # 如果需要符号表,从以下地址下载: |
| 36 | # https://downloads.volatilityfoundation.org/volatility3/symbols/ |
| 37 | |
| 38 | # 对于 Volatility 2(旧版): |
| 39 | vol2 -f memory.dmp imageinfo |
| 40 | vol2 -f memory.dmp kdbgscan |
| 41 | ``` |
| 42 | |
| 43 | ### 步骤 2:枚举运行中的进程 |
| 44 | |
| 45 | 列出所有进程并识别可疑条目: |
| 46 | |
| 47 | ```bash |
| 48 | # 列出所有进程 |
| 49 | vol3 -f memory.dmp windows.pslist |
| 50 | |
| 51 | # 进程树(父子进程关系) |
| 52 | vol3 -f memory.dmp windows.pstree |
| 53 | |
| 54 | # 扫描隐藏/未链接的进程(Rootkit 检测) |
| 55 | vol3 -f memory.dmp windows.psscan |
| 56 | |
| 57 | # 比较 pslist 和 psscan 以查找隐藏进程 |
| 58 | # 在 psscan 中但不在 pslist 中的进程可能被 Rootkit 隐藏 |
| 59 | |
| 60 | # 检查进程空洞化 |
| 61 | vol3 -f memory.dmp windows.pslist --dump |
| 62 | # 然后验证转储的 EXE 是否与磁盘上的预期二进制文件匹配 |
| 63 | ``` |
| 64 | |
| 65 | ``` |
| 66 | 可疑进程指标: |
| 67 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 68 | - svchost.exe 不是由 services.exe 启动(父进程错误) |
| 69 | - csrss.exe/lsass.exe 具有异常的父进程 |
| 70 | - lsass.exe 有多个实例(应该只有一个) |
| 71 | - 进程名称拼写错误(scvhost.exe、lssas.exe) |
| 72 | - cmd.exe 或 powershell.exe 由 WINWORD.EXE 或浏览器启动 |
| 73 | - 从异常路径运行的进程(%TEMP%、%APPDATA%) |
| 74 | - 没有父进程的进程(孤立进程 - 父进程已终止) |
| 75 | ``` |
| 76 | |
| 77 | ### 步骤 3:检测恶意代码注入 |
| 78 | |
| 79 | 扫描注入的代码和进程空洞化: |
| 80 | |
| 81 | ```bash |
| 82 | # 检测进程中的注入代码(malfind) |
| 83 | vol3 -f memory.dmp windows.malfind |
| 84 | |
| 85 | # malfind 查找: |
| 86 | # - 具有 PAGE_EXECUTE_READWRITE 保护的内存区域 |
| 87 | # - 包含 PE 头部(MZ/PE 签名)的内存区域 |
| 88 | # - VAD(虚拟地址描述符)异常 |
| 89 | |
| 90 | # 转储注入的内存区域进行分析 |
| 91 | vol3 -f memory.dmp windows.malfind --dump --pid 2184 |
| 92 | |
| 93 | # 列出每个进程加载的 DLL |
| 94 | vol3 -f memory.dmp windows.dlllist --pid 2184 |
| 95 | |
| 96 | # 通过比较映射镜像与磁盘检测空洞化进程 |
| 97 | vol3 -f memory.dmp windows.hollowfind |
| 98 | |
| 99 | # 扫描加载的驱动程序(潜在的 Rootkit 驱动程序) |
| 100 | vol3 -f memory.dmp windows.driverscan |
| 101 | |
| 102 | # 列出内核模块 |
| 103 | vol3 -f memory.dmp windows.modules |
| 104 | ``` |
| 105 | |
| 106 | ### 步骤 4:分析网络连接 |
| 107 | |
| 108 | 提取活动和已关闭的网络连接: |
| 109 | |
| 110 | ```bash |
| 111 | # 列出所有网络连接(活动和监听) |
| 112 | vol3 -f memory.dmp windows.netscan |
| 113 | |
| 114 | # 输出列:偏移量、协议、本地地址、本地端口、外部地址、外部端口、状态、PID、所有者 |
| 115 | |
| 116 | # 过滤到外部 IP 的已建立连接 |
| 117 | vol3 -f memory.dmp windows.netscan | grep ESTABLISHED |
| 118 | |
| 119 | # 对于旧版 Windows(XP/2003): |
| 120 | vol3 -f memory.dmp windows.netstat |
| 121 | |
| 122 | # 将 PID 与进程列表交叉验证 |
| 123 | # 可疑:svchost.exe 通过非标准端口连接到外部 IP |
| 124 | # 可疑:notepad.exe 或 calc.exe 有网络连接 |
| 125 | ``` |
| 126 | |
| 127 | ### 步骤 5:提取工件和凭据 |
| 128 | |
| 129 | 从内存中恢复敏感数据: |
| 130 | |
| 131 | ```bash |
| 132 | # 转储特定 PID 的进程内存 |
| 133 | vol3 -f memory.dmp windows.memmap --dump --pid 2184 |
| 134 | |
| 135 | # 提取命令行历史 |
| 136 | vol3 -f memory.dmp windows.cmdline |
| 137 | |
| 138 | # 提取环境变量 |
| 139 | vol3 -f memory.dmp windows.envars --pid 2184 |
| 140 | |
| 141 | # 注册表分析(提取 Run 键用于持久化) |
| 142 | vol3 -f memory.dmp windows.registry.printkey \ |
| 143 | --key "Software\Microsoft\Windows\CurrentVersion\Run" |
| 144 | |
| 145 | # 提取哈希/缓存的凭据 |
| 146 | vol3 -f memory.dmp windows.hashdump |
| 147 | vol3 -f memory.dmp windows.cachedump |
| 148 | vol3 -f memory.dmp windows.lsadump |
| 149 | |
| 150 | # 提取剪贴板内容 |
| 151 | vol3 -f memory.dmp windows.clipboard |
| 152 | |
| 153 | # 从内存提取文件 |
| 154 | vol3 -f memory.dmp windows.filescan | grep -i "payload\|malware\|suspicious" |
| 155 | vol3 -f memory.dmp windows.dumpfiles --virtaddr 0xFA8001234560 |
| 156 | ``` |
| 157 | |
| 158 | ### 步骤 6:使用 YARA 规则扫描内存 |
| 159 | |
| 160 | 应用 YARA 签名检测内存中的已知恶意软件: |
| 161 | |
| 162 | ```bash |
| 163 | # 使用 YARA 规则扫描整个内存转储 |
| 164 | vol3 -f memory.dmp yarascan.YaraScan --yara-file malware_rules.yar |
| 165 | |
| 166 | # 扫描特定进程内存 |
| 167 | vol3 -f memory.dmp yarascan.YaraScan --yara-file malware_rules.yar --pid 2184 |
| 168 | |
| 169 | # 使用常见模式的内置 YARA 扫描 |
| 170 | vol3 -f memory.dmp yarascan.YaraScan --yara-rules "rule FindC2 { strings: \$s1 = \"gate.php\" condition: \$s1 }" |
| 171 | |
| 172 | # 扫描加密密钥材料 |
| 173 | vol3 -f memory.dmp yarascan.YaraScan --yara-rules "rule AES_Key { strings: \$sbox = { 63 7C 77 7B F2 6B 6F C5 } condition: \$sbox }" |
| 174 | ``` |
| 175 | |
| 176 | ### 步骤 7:时间线和报告生成 |
| 177 | |
| 178 | 创建分析时间线并汇编发现结果: |
| 179 | |
| 180 | ```bash |
| 181 | # 生成全面的时间线 |
| 182 | vol3 -f memory.dmp timeliner.Timeliner --output-file timeline.csv |
| 183 | |
| 184 | # 时间线包含: |
| 185 | # - 进程创建/退出时间 |
| 186 | # - 网络连接时间戳 |
| 187 | # - 注册表修改时间 |
| 188 | # - 文件访问时间 |
| 189 | |
| 190 | # 导出进程列表用于报告 |
| 191 | vol3 -f memory.dmp windows.pslist --output csv > processes.csv |
| 192 | |
| 193 | # 导出网络连接 |
| 194 | vol3 -f memory.dmp windows.netscan --output csv > network.csv |
| 195 | ``` |
| 196 | |
| 197 | ## 核心概念 |
| 198 | |
| 199 | | 术语 | 定义 | |
| 200 | |------|------------| |
| 201 | | **内存取证** | 分析易失性内存(RAM)内容,以识别运行中的进程、网络连接和可能不存在于磁盘上的内存工件 | |
| 202 | | **进程空洞化** | 恶意软件技术,以挂起状态创建合法进程,用恶意代码替换其内存,然后恢复执行 | |
| 203 | | **Malfind** | Volatility 插件,通过识别非镜像 VAD 中具有可执行权限和 PE 头部的内存区域来检测注入代码 | |
| 204 | | **VAD(虚拟地址描述符)** | Windows 内核结构,跟踪分配给进程的内存区域;VAD 中的异常表明注入或空洞化 | |
| 205 | | **EPROCESS** | 表示进程的 Windows 内核结构;Rootkit 通过取消链接 EPROCESS 条目来向标准工具隐藏进程 | |
| 206 | | **池标签扫描** | 内存取证技术,扫描内核对象池标签以查找对象(进程、文件、连接),即使在未链接时也能找到 | |
| 207 | | **无文件恶意软件** | 完全在内存中运行而不在磁盘上创建文件的恶意软件;只能通过内存取证检测 | |
| 208 | |
| 209 | ## 工具与系统 |
| 210 | |
| 211 | - **Volatility 3**:开源内存取证框架,支持 Windows、Linux 和 macOS 内存分析,具有插件架构 |
| 212 | - **WinPmem**:Windows 系统的内存获取工具,创建原始内存转储用于离线分析 |
| 213 | - **LiME(Linux 内存提取器)**:用于捕获 Linux 系统内存转储的可加载内核模块 |
| 214 | - **Rekall**:具有一些独特分析能力的替代内存取证框架(已停止维护但仍有用) |
| 215 | - **MemProcFS**:内存进程文件系统,允许将内存转储挂载为文件系统进行直观分析 |
| 216 | |
| 217 | ## 常见场景 |
| 218 | |
| 219 | ### 场景:在 EDR 告警后检测无文件恶意软件 |
| 220 | |
| 221 | **场景背景**:EDR 检测到可 |