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, 恶意软件分析, 沙箱, 网络信息收集, 虚拟化, 身份验证强制