gabrielbelli/drakvuf-lab
GitHub: gabrielbelli/drakvuf-lab
一份详尽的 DRAKVUF 恶意软件自动化分析沙箱实验室搭建指南,基于 Xen 虚拟机内省技术实现对恶意样本透明且隐蔽的行为分析。
Stars: 0 | Forks: 0
# DRAKVUF 恶意软件分析实验室
基于 Xen 内省 构建的自动化恶意软件分析沙箱。样本通过 Web UI 提交,在 Windows 10 虚拟机中引爆,并通过二进制插桩进行分析——这一切对恶意软件都是不可见的。
## 当前实验室概览
```
Internet
|
Physical NIC (enp6s0)
|
[xenbr0] ── Dom0 (Ubuntu 24.04, management)
| |
| OPNsense WAN
|
[xenbr1] ── OPNsense LAN (192.168.100.254/24, DHCP + Suricata IDS)
|
Analysis VMs (Windows 10, managed by drakrun)
```
### 硬件 (当前服务器: panopticon)
| 组件 | 规格 |
|-----------|------|
| CPU | Intel Xeon E5-2620 v3 @ 2.40 GHz (6 核 / 12 线程) |
| 内存 | 64 GB DDR4 ECC (4x 16 GB, 2400 MT/s) |
| 存储 | 477 GB NVMe SSD (单盘, LVM) |
| 网络 | 1x GbE NIC (enp6s0) |
### 资源分配
| 域 | vCPUs | 内存 | 用途 |
|--------|-------|-----|---------|
| Dom0 | 4 | 4 GB | 宿主机管理 |
| OPNsense | 4 | 4 GB | 防火墙, DHCP, Suricata IDS |
| 分析虚拟机 | 6 | 8 GB | Windows 10 沙箱目标 |
| **空闲** | — | **~47 GB** | 可用于额外的工作节点 |
### 软件版本 (已部署)
| 包 | 版本 |
|---------|---------|
| Ubuntu Server | 24.04.4 LTS (Noble Numbat) |
| Xen Hypervisor | 4.20.1 (来自 drakvuf-builds) |
| DRAKVUF Bundle | 1.1-cb62139 |
| drakvuf-sandbox | 0.20.0 |
| QEMU (Xen) | 8.2.2 |
| Redis | (发行版默认) |
| Python | 3.12 |
## 1. 安装 Ubuntu Server 24.04 LTS
- 使用标准安装程序
- 使用整个磁盘并启用 LVM
- 安装后,扩展 LVM 以使用整个磁盘:
```
# 对于 NVMe 驱动器:
sudo growpart /dev/nvme0n1 3
sudo pvresize /dev/nvme0n1p3
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
# 对于 SATA/SAS 驱动器:
# sudo growpart /dev/sda 3
# sudo pvresize /dev/sda3
# sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
```
- 在 BIOS 中禁用 Secure Boot (Xen 未签名)
- 在 BIOS 中启用 VT-x 和 VT-d
## 2. 安装 Xen 和 DRAKVUF
下载最新的预构建 .deb 包:
1. 前往:https://github.com/tklengyel/drakvuf-builds/releases
2. 下载两个 `ubuntu-noble` 文件 (xen-hypervisor 和 drakvuf-bundle)
3. 将它们传输到服务器并安装:
```
wget
wget
sudo dpkg -i xen-hypervisor-*-ubuntu-noble-amd64.deb
sudo dpkg -i drakvuf-bundle-*-ubuntu-noble.deb
sudo apt install -f
```
## 3. 配置 Xen 启动参数
DRAKVUF 的 .deb 包会自动生成包含合理默认值(如 `altp2m=1`、`hap_1gb=0`、`hap_2mb=0`、自动检测的 CPU/RAM 等)的 `/etc/default/grub.d/xen.cfg`。
**当前服务器配置** — 取消注释并设置 Dom0 资源限制:
```
sudo vim /etc/default/grub.d/xen.cfg
```
```
DRAK_DOM0_CPU=4
DRAK_DOM0_RAM=4096
```
`GRUB_CMDLINE_XEN_DEFAULT` 行应如下所示:
```
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=${DRAK_DOM0_RAM}M,max:${DRAK_DOM0_RAM}M dom0_max_vcpus=${DRAK_DOM0_CPU} dom0_vcpus_pin=1 force-ept=1 ept=ad=0 hap_1gb=0 hap_2mb=0 altp2m=1 hpet=legacy-replacement smt=1 sched=credit"
```
关键参数说明:
| 参数 | 值 | 原因 |
|-----------|-------|-----|
| `dom0_mem` | 4096M | 对 Dom0 来说足够;为虚拟机预留 RAM |
| `dom0_max_vcpus` | 4 | 为 Dom0 预留 4 个线程 |
| `dom0_vcpus_pin` | 1 | 绑定 Dom0 的 CPU 以获得可预测的性能 |
| `force-ept` | 1 | DRAKVUF 内省所需 |
| `ept=ad=0` | — | 禁用 EPT A/D 位 (altp2m 必需) |
| `hap_1gb` / `hap_2mb` | 0 | 禁用大页 HAP (altp2m 必需) |
| `altp2m` | 1 | 启用 alternate p2m (DRAKVUF 核心功能) |
| `smt` | 1 | 启用超线程 (使用 `0` 禁用) |
| `sched` | credit | Xen CPU 调度器 |
应用并重启:
```
sudo update-grub
sudo reboot
```
## 4. 验证 Xen 是否正在运行
```
sudo xl info
sudo xl list
sudo xl dmesg | grep -i ept
```
首次启动后 `xl list` 的预期输出:
```
Name ID Mem VCPUs State Time(s)
Domain-0 0 4096 4 r----- ...
```
## 5. 安装依赖
```
sudo apt install qemu-system-xen qemu-system-data bzip2 qemu-utils bridge-utils iptables tcpdump dnsmasq libmagic1 python3-venv redis-server ntfs-3g python3-pefile
```
## 6. 修复库和 ROM 冲突
安装 `qemu-system-xen` 会引入一个与 DRAKVUF 冲突的系统 `libxenstore`:
```
sudo rm -f /lib/x86_64-linux-gnu/libxenstore.so.4 /lib/x86_64-linux-gnu/libxenstore.so.4.0
sudo ldconfig
```
链接缺失的 QEMU ROM 文件:
```
sudo mkdir -p /usr/share/qemu
sudo ln -s /usr/share/qemu-xen/qemu/efi-*.rom /usr/share/qemu/
```
## 7. 设置网络 (Xen 网桥)
需要两个网桥:
- **xenbr0** — 用于互联网访问的物理 NIC 网桥 (Dom0 + OPNsense WAN)
- **xenbr1** — 隔离的实验室网络 (OPNsense LAN + 分析虚拟机)
```
sudo vim /etc/netplan/50-cloud-init.yaml
```
```
network:
version: 2
ethernets:
enp6s0:
dhcp4: false
bridges:
xenbr0:
interfaces: [enp6s0]
dhcp4: true
xenbr1:
addresses: [192.168.100.1/24]
dhcp4: false
```
```
sudo netplan apply
```
## 8. 设置 OPNsense 虚拟机
OPNsense 作为分析网络的网关。它在 xenbr1 上为实验室虚拟机提供 DHCP,并可以运行 Suricata IDS 以捕获来自恶意软件的网络指标。
### 下载并准备串行镜像
```
cd /home/$USER
wget https://mirror.dns-root.de/opnsense/releases/26.1/OPNsense-26.1.2-serial-amd64.img.bz2
bunzip2 OPNsense-26.1.2-serial-amd64.img.bz2
sudo mkdir -p /vm/opnsense
sudo cp OPNsense-26.1.2-serial-amd64.img /vm/opnsense/boot.img
sudo qemu-img create -f raw /vm/opnsense/disk.img 64G
```
### 创建 OPNsense Xen 配置
```
sudo vim /etc/xen/opnsense.cfg
```
```
name = "opnsense"
type = "hvm"
memory = 4096
vcpus = 4
device_model_override = "/usr/libexec/xen-qemu-system-i386"
vif = [
'bridge=xenbr0,mac=00:16:3e:AA:BB:01',
'bridge=xenbr1,mac=00:16:3e:AA:BB:02',
]
disk = [
'format=raw,vdev=xvda,target=/vm/opnsense/boot.img',
'format=raw,vdev=xvdb,target=/vm/opnsense/disk.img',
]
boot = "c"
vnc = 0
serial = "pty"
```
### 启动并安装
```
sudo xl create /etc/xen/opnsense.cfg
sudo xl console opnsense
```
- 默认登录:`root` / `opnsense`
- 按 `8` 进入 Shell
- 运行 `opnsense-installer`
- 安装到第二块磁盘 (`ada1` 或 `vtbd1` — 即 `disk.img`/`xvdb`)
安装后,更新配置以仅从已安装的磁盘启动:
```
disk = [
'format=raw,vdev=xvda,target=/vm/opnsense/disk.img',
]
```
重启虚拟机:
```
sudo xl destroy opnsense
sudo xl create /etc/xen/opnsense.cfg
sudo xl console opnsense
```
### 配置 OPNsense
- 按 `2` 设置接口 IP
- 将 LAN 设置为 `192.168.100.254/24`
- 在 LAN 上启用 DHCP (范围: `192.168.100.10` – `192.168.100.200`)
- 按 `8` 进入 shell,运行 `pfctl -d` 以临时禁用防火墙,方便 Web UI 访问
- 在 `https://` 访问 Web UI 并配置:
- Suricata IDS (服务 > 入侵检测)
- 按需配置防火墙规则
- DNS 设置
- 重新启用防火墙:`pfctl -e`
### 启用自动启动
```
sudo mkdir -p /etc/xen/auto
sudo ln -s /etc/xen/opnsense.cfg /etc/xen/auto/
sudo systemctl enable xendomains
```
## 9. 安装 DRAKVUF 沙箱
```
sudo python3 -m venv /opt/drakvuf-sandbox
sudo /opt/drakvuf-sandbox/bin/pip install drakvuf-sandbox
```
验证:
```
sudo /opt/drakvuf-sandbox/bin/drakrun --help
```
### 修复沙箱配置模板
默认模板在 Ubuntu 24.04 上存在问题。将其完全替换:
```
sudo vim /etc/drakrun/cfg.template
```
```
arch = 'x86_64'
name = "{{ VM_NAME }}"
maxmem = {{ MEMORY }}
memory = {{ MEMORY }}
vcpus = {{ VCPUS }}
maxvcpus = {{ VCPUS }}
type = "hvm"
boot = "cd"
hap = 1
acpi = 1
on_poweroff = "destroy"
on_reboot = "{{ ON_REBOOT }}"
on_crash = "destroy"
device_model_override = "/usr/libexec/xen-qemu-system-i386"
vnc=1
vnclisten="0.0.0.0:{{ VM_ID }},websocket={{ VNC_PORT }}"
usb = 1
usbdevice = "tablet"
altp2m = 2
shadow_memory = 32
cpuid="host,htt=0"
vga="stdvga"
vif = [ 'type=ioemu,model=e1000,bridge={{ BRIDGE_NAME }}' ]
disk = [ {{ DISKS }} ]
serial = [ "unix:/var/run/drakrun/{{ VM_NAME }}.sock,server,nowait" ]
```
与上游默认值的更改:
| 更改 | 原因 |
|--------|--------|
| 添加了 `device_model_override` | Ubuntu 24.04 需要显式指定 Xen QEMU 二进制文件的路径 |
| 移除了 `audio = 1` 和 `soundhw='hda'` | 打包的 QEMU 版本不支持 |
| 移除了 `vncpasswd="{{ VNC_PASS }}"` | Ubuntu 24.04 的 libnettle 3.9+ 移除了 VNC 密码认证所需的 DES 算法 |
| 将 `vnclisten` 更改为 `0.0.0.0` | 允许通过 SSH 隧道进行 VNC 访问以进行安装 (如需要可设为 `127.0.0.1`) |
### 为无密码 VNC 修复截图工具
由于我们移除了 VNC 密码,需打补丁使截图工具不发送密码:
```
sudo sed -i 's/password=self.vnc_password/password=None/' /opt/drakvuf-sandbox/lib/python3.12/site-packages/drakrun/analyzer/screenshotter.py
```
### 配置 DRAKVUF 沙箱
```
sudo vim /etc/drakrun/config.toml
```
```
[redis]
host = "localhost"
port = 6379
[network]
dns_server = "use-gateway-address"
out_interface = "xenbr1"
net_enable = true
[drakrun]
default_timeout = 300
plugins = ["apimon", "clipboardmon", "exmon", "filetracer", "memdump", "procmon", "regmon", "socketmon", "tlsmon"]
```
关键设置:
| 设置 | 值 | 用途 |
|---------|-------|---------|
| `out_interface` | `xenbr1` | 将分析虚拟机的流量路由通过 OPNsense (和 Suricata) |
| `net_enable` | `true` | 在引爆期间为分析虚拟机提供网络访问 |
| `dns_server` | `use-gateway-address` | 使用 OPNsense 作为 DNS (允许 DNS 日志记录) |
| `default_timeout` | `300` | 每个样本 5 分钟的分析时间窗口 |
| `plugins` | (见上文) | 要启用的 DRAKVUF 内省插件 |
## 10. 通过 DRAKVUF 沙箱安装 Windows 虚拟机
DRAKVUF 沙箱管理着自己的 Windows 虚拟机、VMI 配置文件和快照:
```
sudo /opt/drakvuf-sandbox/bin/drakrun install --vcpus 6 --memory 8192 ~/Win10.iso
```
通过 VNC 连接以完成安装。默认情况下,VNC 端口为 `5901` (5900 + VM_ID):
```
# 从你的本地机器:
ssh -L 5901:localhost:5901 user@server
# 然后将 VNC 客户端连接到 localhost:5901
```
Windows 安装完成并进入桌面后:
1. **禁用 UAC:** 在“开始”菜单中搜索“UAC” > “更改用户账户控制设置” > 将滑块拖动到“从不通知”
2. **禁用篡改保护:** 设置 > Windows 安全中心 > 病毒和威胁防护 > 管理设置 > 关闭“篡改保护”开关
3. **通过 PowerShell (管理员) 禁用 Windows Defender:**
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows Defender" /v DisableAntiSpyware /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableRealtimeMonitoring /t REG_DWORD /d 1 /f
4. **安装常用软件** (Office、浏览器等) 使虚拟机看起来更真实,从而触发更多恶意软件行为
5. **让 Windows 更新完成** — 避免分析期间产生与更新相关的噪音
然后完成虚拟机的收尾工作 (生成 VMI 配置文件并创建快照):
```
sudo /opt/drakvuf-sandbox/bin/drakrun postinstall
```
此操作创建:
- `/var/lib/drakrun/volumes/snapshot.sav` — 虚拟机内存快照
- `/var/lib/drakrun/volumes/vm-0.img` — 基础磁盘镜像
- `/var/lib/drakrun/profiles/` — VMI 配置文件 (kernel.json, native_*.json, wow64_*.json, runtime.json)
## 11. 启动 DRAKVUF 沙箱
### 创建 systemd 服务
Worker 服务 (模板 — 每个分析虚拟机运行一个实例):
```
sudo vim /etc/systemd/system/drakrun-worker@.service
```
```
[Unit]
Description=DRAKVUF Sandbox Worker (vm-%i)
After=xendomains.service redis-server.service
[Service]
Type=simple
ExecStart=/opt/drakvuf-sandbox/bin/drakrun worker --vm-id %i
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Web UI 服务:
```
sudo vim /etc/systemd/system/drakrun-web.service
```
```
[Unit]
Description=DRAKVUF Sandbox Web UI
After=redis-server.service
[Service]
Type=simple
ExecStart=/opt/drakvuf-sandbox/bin/flask --app drakrun.web.app:app run --with-threads --host 0.0.0.0
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
### 启用并启动
```
sudo systemctl daemon-reload
sudo systemctl enable drakrun-worker@1
sudo systemctl enable drakrun-web
sudo systemctl start drakrun-worker@1
sudo systemctl start drakrun-web
```
### 验证
```
sudo systemctl status drakrun-worker@1
sudo systemctl status drakrun-web
```
如果 worker 失败并提示“active worker already exists”,请从 Redis 中清除过期条目:
```
sudo pkill -f "drakrun worker"
redis-cli DEL rq:worker:drakrun-worker-vm-1
sudo systemctl restart drakrun-worker@1
```
在 `http://:5000` 访问 Web UI
### 添加更多 worker
每个 worker 需要自己的虚拟机克隆。第一个 worker 使用 `vm-1`。要添加第二个 worker:
```
sudo systemctl enable drakrun-worker@2
sudo systemctl start drakrun-worker@2
```
这会使用来自 `vm-0` 的快照来创建 `vm-2`。每个额外的 worker 大约需要 8 GB RAM。
## 磁盘布局参考
当前服务器磁盘使用情况:
```
/dev/nvme0n1 (477 GB NVMe)
├── nvme0n1p1 1 GB /boot/efi
├── nvme0n1p2 2 GB /boot
└── nvme0n1p3 474 GB LVM → ubuntu-vg/ubuntu-lv → /
```
虚拟机存储位于根文件系统上:
| 路径 | 大小 | 内容 |
|------|------|----------|
| `/vm/opnsense/disk.img` | 64 GB (raw) | OPNsense 防火墙磁盘 |
| `/vm/win10/disk.img` | 60 GB (raw) | Windows 10 基础镜像 |
| `/vm/win10/win10.snapshot` | 8.1 GB | 虚拟机内存快照 |
| `/var/lib/drakrun/volumes/vm-0.img` | 25 GB (qcow2) | DRAKVUF 基础磁盘 |
| `/var/lib/drakrun/volumes/snapshot.sav` | 8.1 GB | DRAKVUF 内存快照 |
| `/var/lib/drakrun/volumes/vm-1.img` | 26 MB (qcow2) | Worker 1 CoW overlay |
| `/var/lib/drakrun/profiles/` | ~14 MB | VMI 内省配置文件 |
实验室总磁盘使用量:约 150 GB (可用 474 GB)
## 文件参考
| 文件 | 用途 |
|------|---------|
| `/etc/default/grub.d/xen.cfg` | Xen 启动参数 (Dom0 资源, EPT, altp2m) |
| `/etc/netplan/50-cloud-init.yaml` | 网桥配置 |
| `/etc/xen/opnsense.cfg` | OPNsense 虚拟机定义 |
| `/etc/xen/auto/opnsense.cfg` | OPNsense 自动启动的符号链接 |
| `/etc/drak/config.toml` | DRAKVUF 沙箱配置 |
| `/etc/drakrun/cfg.template` | 分析虚拟机的 Xen 域模板 |
| `/etc/drakrun/install.json` | DRAKVUF 安装参数 (自动生成) |
| `/etc/systemd/system/drakrun-worker@.service` | 分析 worker 服务 |
| `/etc/systemd/system/drakrun-web.service` | Web UI 服务 |
| `/opt/drakvuf-sandbox/` | 包含 drakvuf-sandbox 的 Python venv |
## 已启用的服务
应启用这些服务,以便实验室在重启后能够正常运行:
```
sudo systemctl enable xendomains # Auto-start Xen VMs (OPNsense)
sudo systemctl enable xen-init-dom0 # Xen Dom0 initialisation
sudo systemctl enable xenconsoled # Xen console daemon
sudo systemctl enable redis-server # Job queue backend
sudo systemctl enable dnsmasq # DNS (installed as dependency)
sudo systemctl enable drakrun-worker@1 # Analysis worker
sudo systemctl enable drakrun-web # Web UI
```
## 快速参考
| 命令 | 描述 |
|---------|-------------|
| `sudo xl list` | 列出正在运行的虚拟机 |
| `sudo xl create /etc/xen/vm.cfg` | 启动虚拟机 |
| `sudo xl destroy vmname` | 强制关闭虚拟机 |
| `sudo xl console vmname` | 连接串行控制台 (Ctrl+] 退出) |
| `sudo xl dmesg` | Xen Hypervisor 消息 |
| `sudo /opt/drakvuf-sandbox/bin/drakrun vm-start` | 从快照启动分析虚拟机 |
| `sudo /opt/drakvuf-sandbox/bin/drakrun vm-stop` | 停止分析虚拟机 |
| `sudo /opt/drakvuf-sandbox/bin/drakrun analyze --sample /path/to/malware` | 运行 CLI 分析 |
| `sudo /opt/drakvuf-sandbox/bin/drakrun modify-vm0` | 修改基础 Windows 虚拟机 |
## 已知限制
- **VNC 截图受限:** 在 DRAKVUF 追踪开始之前只能捕获 1 张截图。在活跃追踪期间 VNC 会失去响应 ([drakvuf#238](https://github.com/tklengyel/drakvuf/issues/238))
- **实时交互:** 仅在虚拟机准备阶段有效,在活跃分析期间无效
- **Ubuntu 24.04 不支持 VNC 密码:** libnettle 3.9+ 移除了 VNC 密码认证所需的 DES 算法
- **需要 Intel CPU:** DRAKVUF 依赖 EPT 和 Monitor Trap Flag (MTF),而 AMD 处理器不具备这些特性
- **升级后截图工具补丁丢失:** pip 升级 drakvuf-sandbox 后必须重新应用 `screenshotter.py` 中的 `password=None` 修复
## 故障排除
- **“Failed to bring up CPU”错误:** 从 `/etc/default/grub.d/xen.cfg` 中的 Xen 命令行移除 `no-real-mode` 和 `edd=off`,然后执行 `sudo update-grub && sudo reboot`
- **QEMU ROM 文件缺失 / “failed to find romfile”:** `sudo ln -s /usr/share/qemu-xen/qemu/efi-*.rom /usr/share/qemu/`
- **LibVMI/DRAKVUF 段错误:** 移除冲突的 libxenstore:`sudo rm -f /lib/x86_64-linux-gnu/libxenstore.so.4 /lib/x86_64-linux-gnu/libxenstore.so.4.0 && sudo ldconfig`
- **“Cipher backend does not support DES”:** 从 `/etc/drakrun/cfg.template` 中移除 `vncpasswd`
- **使用串行镜像时 VNC 黑屏:** 改用 `sudo xl console vmname` — 串行镜像没有图形输出
- **QEMU “no default audio driver”:** 从 cfg.template 中移除 `audio = 1` 和 `soundhw='hda'`
- **沙箱 worker 崩溃 / “active worker already exists”:** 使用 `sudo xl list` 检查是否有卡住的虚拟机域,使用 `sudo xl destroy` 销毁它们,使用 `redis-cli DEL rq:worker:drakrun-worker-vm-1` 清除 Redis 缓存,然后重启 worker
- **分析虚拟机没有网络:** 验证 OPNsense 是否正在运行 (`sudo xl list`),检查 config.toml 中的 `net_enable = true`,并确认 `out_interface` 与您的实验室网桥名称匹配
- **Windows Defender 干扰分析:** 使用 `drakrun modify-vm0` 重新进入基础虚拟机,再次禁用 Defender,然后执行 `drakrun postinstall` 重新创建快照
标签:DAST, DRAKVUF, LVM, Metaprompt, OPNsense, pdftotext, Python, QEMU, Redis, Suricata, TCP SYN 扫描, Ubuntu Server, Web UI, Windows 10, Xen Hypervisor, Xen虚拟化, 二进制插桩, 入侵检测系统, 内联执行, 威胁情报, 安全实验室搭建, 安全数据湖, 安全沙箱, 开发者工具, 恶意软件分析, 恶意软件研究, 搜索引擎查询, 搜索语句(dork), 无后门, 现代安全运营, 网络安全, 自动化沙箱, 虚拟化安全, 虚拟机自省, 身份验证强制, 逆向工具, 防火墙配置, 隐私保护, 隐蔽分析