0emirhan/malware-lab

GitHub: 0emirhan/malware-lab

基于 KVM 和 nftables 的超隔离 Windows 恶意软件分析沙箱,通过宿主机侧流量管控确保样本可传入但无法传出。

Stars: 1 | Forks: 0

# 恶意软件引爆室 — 严格隔离 基于 KVM/QEMU 的隔离 Windows 10 虚拟机,你可以向其中 **传入** 样本 (受控下载),但 **任何东西都无法传出**。出站流量控制由 **host 上的 nftables** 完成:恶意软件在 VM 中运行,且无法访问 host 上的过滤规则 —— 这就是安全保证所在。 ## 前置条件 - 带有 **KVM** 的 Linux(CPU VT-x/AMD-V),≥ 8 GB 可用 RAM,≥ 100 GB 磁盘 - 一份 **Windows ISO**(默认为 Win10 22H2;可覆盖配置,见下文) - host 上的 `sudo` 权限 ## 快速部署(全新机器) ``` git clone git@github.com:0emirhan/malware-lab.git cd malware-lab sudo ./scripts/00-install-host.sh # stack KVM/libvirt/nftables/inetsim # 登出/登录 (libvirt/kvm groups) sudo WIN_ISO=/chemin/vers/Windows.iso ./scripts/10-create-vm.sh ``` `base-images/`, `staging/`, `samples-iso/` 目录在 clone 时是空的 (占位符 `.gitkeep`)—— 磁盘、ISO 和样本 **绝不** 会被纳入版本控制 (见 `.gitignore`)。可覆盖的变量:`WIN_ISO`, `RAM_MB`, `VCPUS`, `DISK_GB`, `VM_NAME`(例如:`sudo WIN_ISO=… RAM_MB=12288 ./scripts/10-create-vm.sh`)。 ## 关键点(必读) “从互联网下载”和“禁止任何传出流量”是 **相互冲突** 的:任何为下载而开放的连接也可能被用于数据窃取。我们通过 **阶段分离**(在 host 层面强制实施)来解决此问题: | 阶段 | 防火墙模式 | 允许的操作 | |-------|---------------|-------------------| | 获取样本 | `acquisition` | **仅** 允许访问 allowlist (80/443) 及网关 DNS | | 引爆 / 执行 | `lockdown` | **禁止** 任何传出流量 (air-gap) | | 观察 C2 | `fakenet` | 流量由 host 上的 INetSim 拦截,**绝无真实流量发出** | **黄金法则:绝不在 `acquisition` 模式下执行样本。** 下载 -> 切回 `lockdown` -> 引爆。 更安全的方法(推荐):**完全不要从引爆 VM 中下载。** 在 host(或一次性 VM)上获取样本,将其放入 `staging/`,并通过 **只读 ISO** (`inject-sample.sh`) 注入。 这样 VM 将保持在永久的 `lockdown` 状态:文件可以进入,但任何东西都无法通过网络传出,也无法重写 ISO。 ## 隔离层 1. 位于 `lab-isolated` 网络 (10.66.66.0/24) 上的 **Windows VM** —— 没有任何网卡连接至 host 的 LAN。 2. **host 上的 nftables** (`firewall/lab-fw.sh`) —— 过滤网桥 `virbr-lab` 的所有出站流量。此处的 `drop` 是最终裁决,它将覆盖 libvirt 的 `accept` 规则。 3. **无 host↔VM 桥接**:无共享文件夹(缺少 `--filesystem`), 禁用剪贴板(`clipboard.copypaste=off`),无 USB 控制器 (`controller usb,model=none`),无拖放功能。 -> 防止 host 受到感染。 4. **qcow2 磁盘 + 快照**:冻结一个干净的基础状态,在处理完每个样本后还原(`snapshot.sh`)。 ## 安装(仅一次) ``` cd /home/emirhan/malware-lab sudo ./scripts/00-install-host.sh # stack KVM/libvirt/nftables/inetsim # 断开/重新连接 (libvirt/kvm groups) sudo ./scripts/10-create-vm.sh # réseau isolé + VM (démarre en lockdown) virt-manager # installe Windows dans la VM ``` 安装 Windows 后,**将 UEFI nvram 转换为 qcow2**(否则 libvirt 将拒绝内部快照:`internal snapshots ... require QCOW2 nvram format`)。在 VM 关机状态下,仅需执行一次: ``` sudo ./scripts/fix-nvram.sh # raw -> qcow2 (idempotent) ``` 然后冻结一个干净的基础状态: ``` sudo ./scripts/snapshot.sh save clean-base ``` ### 加固客户机 Windows(在 VM 内部) - 禁用自动更新和遥测(否则被拦截的出站流量会在日志中产生大量噪音)。 - **不要** 安装 `spice-vdagent`(避免任何剪贴板桥接)。 - 如果你需要上下文信息,可以保留 Defender 开启;或者为了确保样本顺利执行而将其禁用 —— 由你决定。 - 如果你想限制权限,可以创建一个非管理员用户来执行操作。 ## 分析工作流(每个样本) ### 选项 A — ISO 注入(最安全,VM 永不联网) ``` # 1. 上传 sample(s) — 理想情况下使用密码保护的 .zip 格式 cp ~/Downloads/sample.bin /home/emirhan/malware-lab/staging/ # 2. 以只读模式注入 sudo ./scripts/inject-sample.sh # VM reste en lockdown # 3. 在 VM 中:从 CD 复制,引爆,观察 # 4. 清理 sudo ./scripts/snapshot.sh revert clean-base sudo ./scripts/inject-sample.sh eject rm /home/emirhan/malware-lab/staging/* ``` ### 选项 B — 从 VM 下载 (allowlist) ``` sudo ./firewall/lab-fw.sh acquisition # sortie limitée à l'allowlist # 在 VM 中:从 MalwareBazaar、vx-underground... 下载 samples sudo ./firewall/lab-fw.sh lockdown # <<< AVANT toute exécution # 引爆,观察 sudo ./scripts/snapshot.sh revert clean-base ``` ### 在阻止流出的情况下观察网络行为 (fakenet) ``` sudo ./scripts/20-inetsim.sh # services factices sur la passerelle sudo ./firewall/lab-fw.sh fakenet # DNS/HTTP/... redirigés vers INetSim # malware 会看到响应,捕获它们;不会真实发送任何内容 ``` ## 验证隔离性 ``` sudo ./firewall/lab-fw.sh status # mode courant + paquets DROPpés # 从 lockdown 状态的 VM 进行测试:向 8.8.8.8 发起的 ping/curl 必须失败。 # 在 host 端,捕获试图流出的内容: sudo tcpdump -ni virbr-lab not arp and not port 67 and not port 68 ``` ## 绝对禁止事项 - 在 `acquisition` 或 `off` 模式下执行样本。 - 启用剪贴板共享、共享文件夹、USB 重定向,或安装完整的 guest-additions。 - 在 VM 中以可写模式挂载 `staging/`(请使用只读 ISO)。 - 让 `lab-fw.sh 处于关闭状态 —— 这意味着隔离完全失效。 ## 文件 ``` networks/lab-isolated.xml réseau isolé libvirt (10.66.66.0/24) firewall/lab-fw.sh contrôle egress : lockdown / acquisition / fakenet firewall/allowlist.txt domaines autorisés en mode acquisition scripts/00-install-host.sh install stack scripts/10-create-vm.sh crée réseau + VM Windows scripts/20-inetsim.sh config INetSim (fakenet) scripts/snapshot.sh save/revert snapshots scripts/inject-sample.sh transfert one-way via ISO lecture seule staging/ dépose les samples ici (avant injection ISO) base-images/ disque qcow2 de la VM ```
标签:Cutter, DAST, IP 地址批量处理, KVM, libvirt, nftables, 恶意软件分析, 沙箱, 网络信息收集, 虚拟化, 身份验证强制