Xây dựng Malware Lab an toàn với KVM: Phân tích mã độc trong môi trường mạng cô lập

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Tại sao cần một lab riêng để phân tích mã độc?

Mình đang chạy homelab với Proxmox VE quản lý 12 VM và container — đây là playground để test mọi thứ trước khi đưa lên production. Nhưng khi bắt đầu tìm hiểu malware analysis, mình nhận ra ngay rằng không thể chạy file độc hại trực tiếp trên môi trường đó. Một con ransomware chạy nhầm có thể mã hóa toàn bộ dữ liệu trong vài phút, kể cả trên host và các VM khác nếu có shared folder.

Malware lab là môi trường máy ảo được thiết kế đặc biệt để:

  • Cô lập hoàn toàn khỏi mạng thật và internet — malware không thể gọi về C2 server thật
  • Quan sát hành vi của mã độc (network calls, file writes, registry changes) mà không bị lây nhiễm ra ngoài
  • Snapshot và rollback về trạng thái sạch sau mỗi lần phân tích, sẵn sàng cho mẫu tiếp theo
  • Capture toàn bộ traffic mạng từ host để phân tích sau

KVM là lựa chọn phù hợp ở đây vì libvirt cho phép kiểm soát mạng rất chi tiết — bạn có thể tạo virtual network hoàn toàn không có đường ra ngoài, khác với cấu hình NAT mặc định mà mọi người hay dùng.

Cài đặt KVM và công cụ cần thiết

Kiểm tra CPU hỗ trợ ảo hóa

Trước tiên xác nhận CPU hỗ trợ hardware virtualization:

grep -E --color '(vmx|svm)' /proc/cpuinfo | head -3
# vmx = Intel VT-x, svm = AMD-V
# Nếu không có output → vào BIOS bật VT-x/AMD-V

Cài KVM và gói hỗ trợ trên Ubuntu/Debian

sudo apt update
sudo apt install -y \
  qemu-kvm \
  libvirt-daemon-system \
  libvirt-clients \
  bridge-utils \
  virt-manager \
  tcpdump \
  wireshark-qt

# Thêm user vào group để không cần sudo mỗi lần
sudo usermod -aG libvirt,kvm $USER
newgrp libvirt

Cài thêm công cụ phân tích trên host

Cài những thứ này trên host machine (không phải trong VM phân tích):

# volatility3 để phân tích memory dump sau này
pip3 install volatility3

# clamav để quick-scan file trước khi đưa vào lab
sudo apt install -y clamav
sudo freshclam  # cập nhật signature database

Cấu hình mạng cô lập và VM phân tích

Tạo isolated network — không có NAT, không có internet

Đây là bước quan trọng nhất. Mạng kiểu “isolated” trong libvirt không có thẻ <forward>, nghĩa là không có routing ra ngoài, chỉ các VM trong lab nói chuyện với nhau qua bridge ảo.

cat > /tmp/malware-lab-net.xml << 'EOF'
<network>
  <name>malware-lab</name>
  <bridge name="virbr-lab" stp="on" delay="0"/>
  <domain name="malware.lab"/>
  <ip address="192.168.100.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.100.10" end="192.168.100.50"/>
    </dhcp>
  </ip>
</network>
EOF

# Đăng ký, khởi động và bật autostart
virsh net-define /tmp/malware-lab-net.xml
virsh net-start malware-lab
virsh net-autostart malware-lab

# Kiểm tra
virsh net-list --all

Chặn bridge này ra internet bằng iptables

Thêm lớp bảo vệ thứ hai ở cấp host — dù VM có cấu hình sai, traffic vẫn không thoát được:

# Thay eth0 bằng interface mạng thật của bạn (dùng 'ip link' để xem)
sudo iptables -I FORWARD -i virbr-lab -o eth0 -j DROP
sudo iptables -I FORWARD -o virbr-lab -i eth0 -j DROP

# Kiểm tra rules đã áp dụng
sudo iptables -L FORWARD -n -v | grep virbr-lab

# Lưu lại để tồn tại qua reboot
sudo apt install -y iptables-persistent
sudo netfilter-persistent save

Tạo VM Windows để chạy malware

Phần lớn mã độc nhắm vào Windows, nên cần ít nhất một Windows VM. Gắn nó vào mạng malware-lab vừa tạo:

virt-install \
  --name win10-malware \
  --ram 4096 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/win10-malware.qcow2,size=60,format=qcow2 \
  --cdrom /path/to/windows10.iso \
  --os-variant win10 \
  --network network=malware-lab \
  --graphics vnc,listen=127.0.0.1,port=5910 \
  --video vga \
  --noautoconsole

# Mở VNC để cài Windows
virt-viewer win10-malware

Sau khi cài Windows xong, tắt Windows Defender và Windows Update trong VM (để malware chạy được), rồi tạo snapshot “trạng thái sạch”:

# Tạo snapshot — đây là điểm rollback sau mỗi phiên
virsh snapshot-create-as win10-malware clean-state \
  --description "Windows sach, Defender tat, san sang phan tich"

# Xem danh sách snapshot
virsh snapshot-list win10-malware

Thêm Linux VM giả lập C2 server (tùy chọn nhưng rất hữu ích)

Nhiều malware cần kết nối về C2 server. Thay vì để nó timeout, bạn tạo một Linux VM trong cùng mạng để bắt chước — dùng netcat hoặc fakedns để “trả lời” malware:

virt-install \
  --name linux-monitor \
  --ram 1024 \
  --vcpus 1 \
  --disk path=/var/lib/libvirt/images/linux-monitor.qcow2,size=20,format=qcow2 \
  --location /path/to/ubuntu-22.04-server.iso \
  --os-variant ubuntu22.04 \
  --network network=malware-lab \
  --graphics none \
  --extra-args "console=ttyS0"

# Trong Linux VM này, chạy fake DNS server
# pip install fakedns
# sudo python -m fakedns --ip 192.168.100.20

Bắt traffic và kiểm tra môi trường

Capture network traffic từ host

Mọi packet trong mạng isolated đều đi qua bridge virbr-lab trên host. Bắt trực tiếp từ host mà không cần cài gì thêm trong VM:

# Bắt tất cả traffic, lưu file pcap có timestamp
sudo tcpdump -i virbr-lab -w /tmp/malware-$(date +%Y%m%d-%H%M).pcap

# Theo dõi real-time: DNS queries + port phổ biến của malware
sudo tcpdump -i virbr-lab -n 'port 53 or port 80 or port 443 or port 4444'

# Chỉ xem DNS để biết malware resolve domain nào
sudo tcpdump -i virbr-lab -n 'port 53' -A

Script chuẩn bị phiên phân tích tự động

Mình hay dùng script nhỏ này để reset môi trường và bắt đầu capture cùng lúc:

#!/bin/bash
# prep-malware-session.sh

VM_NAME="win10-malware"
SNAPSHOT="clean-state"
PCAP_DIR="$HOME/malware-captures"
SESSION=$(date +%Y%m%d-%H%M%S)

mkdir -p "$PCAP_DIR"

echo "[+] Restore VM ve snapshot sach..."
virsh destroy "$VM_NAME" 2>/dev/null  # force stop nếu đang chạy
virsh snapshot-revert "$VM_NAME" "$SNAPSHOT"

echo "[+] Khoi dong VM..."
virsh start "$VM_NAME"

echo "[+] Bat dau capture traffic..."
sudo tcpdump -i virbr-lab -w "$PCAP_DIR/session-$SESSION.pcap" &
TCPDUMP_PID=$!

echo "[+] Session $SESSION san sang."
echo "    PCAP: $PCAP_DIR/session-$SESSION.pcap"
echo "    Khi xong: sudo kill $TCPDUMP_PID && virsh destroy $VM_NAME"

Xác nhận mạng thực sự bị cô lập

Sau khi VM khởi động, kết nối VNC vào Windows VM và mở PowerShell để test:

# Chay trong Windows VM (PowerShell)
ping 8.8.8.8           # Phai Request timeout
Invoke-WebRequest https://google.com  # Phai loi

# Hoac test tu host: xem bridge co route ra ngoai khong
ip route show | grep virbr-lab
# Ket qua chi co: 192.168.100.0/24 dev virbr-lab
# Khong co default route = OK

Rollback nhanh sau mỗi phiên

Thao tác bắt buộc sau mỗi lần chạy malware — đừng bao giờ bỏ qua bước này:

# Tắt VM (dùng destroy nếu malware kill shutdown process)
virsh destroy win10-malware

# Rollback về trạng thái sạch
virsh snapshot-revert win10-malware clean-state

# Sẵn sàng cho mẫu tiếp theo
virsh start win10-malware

Một số lưu ý bảo mật không thể bỏ qua

  • Không mount USB hoặc shared folder từ host vào VM phân tích — malware có thể leo thang lây ra host qua đây
  • Tắt clipboard sharing trong cấu hình VNC/SPICE
  • Không dùng máy cá nhân làm host nếu có thể — một VPS riêng hoặc máy bare-metal cũ tốt hơn nhiều
  • Scan file trước khi đưa vào lab bằng ClamAV để biết bạn đang xử lý loại malware gì
  • Luôn tắt VM khi không phân tích — không để malware chạy ngầm lâu dài trong lab

Với setup này, bạn có một malware lab đủ an toàn để bắt đầu học reverse engineering và phân tích hành vi mã độc. Khi đã quen, có thể mở rộng thêm bằng cách tích hợp FLARE-VM vào Windows guest để có bộ công cụ RE đầy đủ hơn, hoặc cài Cuckoo Sandbox để tự động hóa quá trình phân tích.

Share: