$npx -y skills add killvxk/cybersecurity-skills-zh --skill analyzing-malware-behavior-with-cuckoo-sandbox在 Cuckoo Sandbox 中执行恶意软件样本以观察运行时行为,包括进程创建、文件系统修改、 注册表更改、网络通信和 API 调用。生成全面的行为报告,用于恶意软件分类和 IOC 提取。 适用于动态恶意软件分析、沙箱引爆、行为分析或自动化恶意软件执行相关请求。
| 1 | # 使用 Cuckoo Sandbox 分析恶意软件行为 |
| 2 | |
| 3 | ## 适用场景 |
| 4 | |
| 5 | - 可疑样本通过静态分析分类后,需要在受控环境中进行行为观察 |
| 6 | - 需要捕获恶意软件执行期间的网络流量、文件投放、注册表修改和 API 调用 |
| 7 | - 确定完整的感染链,包括第二阶段载荷下载和持久化机制 |
| 8 | - 基于观察到的运行时活动生成行为签名和 YARA 规则 |
| 9 | - 对批量恶意软件样本进行自动化分析,要求一致的报告输出 |
| 10 | |
| 11 | **不适用于**在配置错误的沙箱中通过网络共享传播的已知勒索软件变种;请先验证网络隔离。 |
| 12 | |
| 13 | ## 前置条件 |
| 14 | |
| 15 | - Cuckoo Sandbox 3.x 安装在专用分析服务器上(推荐 Ubuntu 22.04) |
| 16 | - 配置了 Windows 10/11 快照的客户虚拟机(安装 Cuckoo agent,在干净状态下拍取快照) |
| 17 | - VirtualBox、KVM 或 VMware 配置为 Cuckoo 虚拟化后端 |
| 18 | - 隔离网络,使用 InetSim 或 FakeNet-NG 模拟互联网服务 |
| 19 | - 集成 Suricata 或 Snort,用于分析期间的网络级签名匹配 |
| 20 | - 足够的磁盘空间用于 PCAP 捕获和内存转储(推荐最少 500 GB) |
| 21 | |
| 22 | ## 工作流程 |
| 23 | |
| 24 | ### 步骤 1:向 Cuckoo 提交样本 |
| 25 | |
| 26 | 提交恶意软件样本进行自动化分析: |
| 27 | |
| 28 | ```bash |
| 29 | # 通过命令行提交 |
| 30 | cuckoo submit /path/to/suspect.exe |
| 31 | |
| 32 | # 提交并指定分析超时时间(300 秒) |
| 33 | cuckoo submit --timeout 300 /path/to/suspect.exe |
| 34 | |
| 35 | # 提交并指定虚拟机和分析包 |
| 36 | cuckoo submit --machine win10_x64 --package exe --timeout 300 /path/to/suspect.exe |
| 37 | |
| 38 | # 通过 REST API 提交 |
| 39 | curl -F "file=@suspect.exe" -F "timeout=300" -F "machine=win10_x64" \ |
| 40 | http://localhost:8090/tasks/create/file |
| 41 | |
| 42 | # 提交 URL 进行分析 |
| 43 | curl -F "url=http://malicious-site.com/payload" -F "timeout=300" \ |
| 44 | http://localhost:8090/tasks/create/url |
| 45 | |
| 46 | # 检查任务状态 |
| 47 | curl http://localhost:8090/tasks/view/1 | jq '.task.status' |
| 48 | ``` |
| 49 | |
| 50 | ### 步骤 2:实时监控执行过程 |
| 51 | |
| 52 | 跟踪分析进度并观察实时行为: |
| 53 | |
| 54 | ```bash |
| 55 | # 查看 Cuckoo 分析日志 |
| 56 | tail -f /opt/cuckoo/log/cuckoo.log |
| 57 | |
| 58 | # 监控分析任务状态 |
| 59 | cuckoo status |
| 60 | |
| 61 | # 访问 Cuckoo Web 界面查看实时截图和进程树 |
| 62 | # 导航到 http://localhost:8080/analysis/<task_id>/ |
| 63 | ``` |
| 64 | |
| 65 | 执行期间需关注的关键行为事件: |
| 66 | - 进程创建链(父子进程关系) |
| 67 | - 向外部 IP 发起的网络连接尝试 |
| 68 | - 在临时目录或系统文件夹中投放文件 |
| 69 | - 对 Run 键或服务条目的注册表修改 |
| 70 | - 与加密(CryptEncrypt)、注入(WriteProcessMemory)或逃避相关的 API 调用 |
| 71 | |
| 72 | ### 步骤 3:分析进程活动 |
| 73 | |
| 74 | 检查 Cuckoo 报告中的进程树和 API 调用跟踪: |
| 75 | |
| 76 | ```python |
| 77 | # 以编程方式解析 Cuckoo JSON 报告 |
| 78 | import json |
| 79 | |
| 80 | with open("/opt/cuckoo/storage/analyses/1/reports/report.json") as f: |
| 81 | report = json.load(f) |
| 82 | |
| 83 | # 进程树分析 |
| 84 | for process in report["behavior"]["processes"]: |
| 85 | pid = process["pid"] |
| 86 | ppid = process["ppid"] |
| 87 | name = process["process_name"] |
| 88 | print(f"PID: {pid} PPID: {ppid} Name: {name}") |
| 89 | |
| 90 | # 提取可疑 API 调用 |
| 91 | for call in process["calls"]: |
| 92 | api = call["api"] |
| 93 | if api in ["CreateRemoteThread", "VirtualAllocEx", "WriteProcessMemory", |
| 94 | "NtCreateThreadEx", "RegSetValueExA", "URLDownloadToFileA"]: |
| 95 | args = {arg["name"]: arg["value"] for arg in call["arguments"]} |
| 96 | print(f" [!] {api}({args})") |
| 97 | ``` |
| 98 | |
| 99 | ### 步骤 4:审查网络活动 |
| 100 | |
| 101 | 检查网络连接、DNS 查询和 HTTP 请求: |
| 102 | |
| 103 | ```python |
| 104 | # 从 Cuckoo 报告中提取网络分析 |
| 105 | network = report["network"] |
| 106 | |
| 107 | # DNS 解析 |
| 108 | print("DNS 查询:") |
| 109 | for dns in network.get("dns", []): |
| 110 | print(f" {dns['request']} -> {dns.get('answers', [])}") |
| 111 | |
| 112 | # HTTP 请求 |
| 113 | print("\nHTTP 请求:") |
| 114 | for http in network.get("http", []): |
| 115 | print(f" {http['method']} {http['uri']}(Host:{http['host']})") |
| 116 | if http.get("body"): |
| 117 | print(f" Body:{http['body'][:200]}") |
| 118 | |
| 119 | # TCP 连接 |
| 120 | print("\nTCP 连接:") |
| 121 | for tcp in network.get("tcp", []): |
| 122 | print(f" {tcp['src']}:{tcp['sport']} -> {tcp['dst']}:{tcp['dport']}") |
| 123 | |
| 124 | # 提取 PCAP 进行更深入的 Wireshark 分析 |
| 125 | # PCAP 位置:/opt/cuckoo/storage/analyses/1/dump.pcap |
| 126 | ``` |
| 127 | |
| 128 | ### 步骤 5:检查文件系统和注册表变更 |
| 129 | |
| 130 | 记录持久化机制和投放的文件: |
| 131 | |
| 132 | ```python |
| 133 | # 文件操作 |
| 134 | print("创建/修改的文件:") |
| 135 | for f in report["behavior"].get("summary", {}).get("files", []): |
| 136 | print(f" {f}") |
| 137 | |
| 138 | # 带哈希值的投放文件 |
| 139 | print("\n投放文件:") |
| 140 | for dropped in report.get("dropped", []): |
| 141 | print(f" 路径:{dropped['filepath']}") |
| 142 | print(f" SHA-256:{dropped['sha256']}") |
| 143 | print(f" 大小:{dropped['size']} 字节") |
| 144 | print(f" 类型:{dropped['type']}") |
| 145 | |
| 146 | # 注册表修改 |
| 147 | print("\n修改的注册表键:") |
| 148 | for key in report["behavior"].get("summary", {}).get("keys", []): |
| 149 | print(f" {key}") |
| 150 | ``` |
| 151 | |
| 152 | ### 步骤 6:检查签名和评分 |
| 153 | |
| 154 | 检查 Cuckoo 的行为签名和威胁评分: |
| 155 | |
| 156 | ```python |
| 157 | # 触发的行为签名 |
| 158 | print("触发的签名:") |
| 159 | for sig in report.get("signatures", []): |
| 160 | severity = sig["severity"] |
| 161 | name = sig["name"] |
| 162 | description = sig["description"] |
| 163 | marker = "[!]" if severity >= 3 else "[*]" |
| 164 | print(f" {marker} [{severity}/5] {name}: {description}") |
| 165 | for mark in sig.get("marks", []): |
| 166 | if mark.get("call"): |
| 167 | print(f" API: {mark['call']['api']}") |
| 168 | if mark.get("ioc"): |
| 169 | print(f" IOC: {mark['ioc']}") |
| 170 | |
| 171 | # 整体评分 |
| 172 | score = report.get("info", {}).get("score", 0) |
| 173 | print(f"\n整体威胁评分:{score}/10") |
| 174 | ``` |
| 175 | |
| 176 | ### 步骤 7:提取内存转储工件 |
| 177 | |
| 178 | 分析执行期间捕获的完整内存转储: |
| 179 | |
| 180 | ```bash |
| 181 | # 内存转储保存位置: |
| 182 | # /opt/cuckoo/storage/analyses/1/memory.dmp |
| 183 | |
| 184 | # 使用 Volatility 分析内存转储 |
| 185 | vol3 -f /opt/cuckoo/storage/analyses/1/memory.dmp windows.pslist |
| 186 | vol3 -f /opt/cuckoo/storage/analyses/1/memory.dmp windows.malfind |
| 187 | vol3 -f /opt/cuckoo/storage/analyses/1/memory.dmp windows.netscan |
| 188 | ``` |
| 189 | |
| 190 | ## 核心概念 |
| 191 | |
| 192 | | 术语 | 定义 | |
| 193 | |------|------------| |
| 194 | | **动态分析** | 在受控环境中执行恶意软件以观察运行时行为,包括系统调用、网络活动和文件操作 | |
| 195 | | **沙箱逃避** | 恶意软件用于检测虚拟/沙箱环境并改变行为以避免分析的技术(睡眠计时器、虚拟机检测、用户交互检测) | |
| 196 | | **API 钩子** | Cuckoo 拦截恶意软件发出的 Windows API 调用以记录函数名称、参数和返回值的方法 | |
| 197 | | **InetSim** | 互联网服务模拟工具,在隔离分析网络内响应恶意软件的网络请求(HTTP、DNS、SM |