Организация виртуальной лаборатории с использованием KVM
 2024-07-11
В этой статье показана настройка лаборатории для исследования вредоносного ПО с использованием KVM. Так же, как и VirtualBox или VMWare, KVM через Spice предлагает гостевые дополнения, позволяющие переносить образцы ПО с хост-компьютера на виртуальные машины. В отличие от VirtualBox или VMWare, KVM позволяет модифицировать код QEMU, что в свою очередь позволяет создавать более скрытные машины для запуска вредоносного ПО.
Сетевая инфраструктура
Возможность обеспечения виртуальной машины для анализа с доступом в интернет является важной составляющей полноценного анализа, поскольку многие современные вредоносные программы используют интернет-соединение для различных целей. Однако предоставление доступа к интернету требует дополнительных мер безопасности для защиты сети.
[!TIP]
Следует поместить хост-машину в DMZ. Большинство домашних маршрутизаторов обладают настройками DMZ.
Общая схема сети представлена ниже:
  ┌─────────┐
  │Интернет │
  └────┬────┘
       │
┌──────┴───────┐
│Хост-машина   │ Виртуальная машина (KVM) в DMZ
└──────┬───────┘
       │
    ┌──┴──┐
    │NAT  │ (по умолчанию)
    └──┬──┘
       │
   ┌───┴────┐ ┌─────────┐
   │PFSense ├─┤Изолиров.│ LAN 10.0.1.1/24 (vmbr0)
   └────────┘ └────┬────┘
	         │
	      ┌──┴───┐
	      │Remnux│ Статический анализ и перехват трафика
	      └──┬───┘
	         │
	     ┌───┴─────┐
	     │Изолир.  │ Аналитическая LAN 10.0.2.1/24 (vmbr1)
	     └──┬──────┤
	        │      │
         ┌────────┴───┐ ┌┴───────┐
         │Аналит. ВМ  │ │Windows │ Динамический анализ
         └────────────┘ └────────┘
Динамический анализ будет проводиться на машине Windows. Использование Linux (Remnux) позволит нам применять статические аналитические инструменты и осуществлять перехват зашифрованного трафика благодаря расшифровке TLS-секретов. Также мы можем создавать временные C2-соединения для воспроизведения сценариев атаки. В связи с особыми соображениями безопасности, сеть настроена следующем образом:
- Remnux и Windows взаимодействуют через внутреннюю сеть (internal network).
 - Remnux получает выход в интернет через pfSense, выступающий как маршрутизатор и брандмауэр.
 - С помщью NAT и IP Forwarding с Remnux-машины передается трафик Windows-машине через tun-интерфейс. Предпологается использование VPN - соединения во избежание утечки реальных ip-адресов.
 
[!NOTE] Без включённого VPN на машине Remnux, в Windows не будет доступа к интернету.
Далее представлен процесс установки необходимых компонентов.
Установка KVM
- В первую очередь необходимо проверить, включена ли виртуализация на вашем хосте.
 
grep -Po '(vmx|svm)[^\x20]+' /proc/cpuinfo | sort | uniq # Для хост-машины
cat /sys/module/kvm_intel/parameters/nested              # Влож. виртуализ. (intel)
cat /sys/module/kvm_amd/parameters/nested                # Влож. виртуализ. (amd)
- Включаем вложенную виртуализацию (необязательно)
 
sudo nano /etc/modprobe.d/kvm.conf # Файл конфигурации вложенной виртуализации
# Добавьте следующую конфигурацию
: '
options kvm_intel nested=1
' # сохраните и перезагрузите
sudo reboot
Если после выполнения предыдущей команды есть какой-либо вывод, значит виртуализация включена, в противном случае включите её в BIOS и попробуйте снова.
[!WARNING] Использование вложенной виртуализации приведёт к значительным потерям производительности. Если у вас слабый ПК, используйте Linux с KVM на голом железе.
- Устанавливаем зависимости
 
sudo apt update
sudo apt install -y virt-manager qemu-kvm build-essential python-is-python3
- Проверим, запущен ли libvirtd
 
sudo systemctl enable libvirtd
sudo systemctl start libvirtd
- Добавим текущего пользователя в libvirtd - группу
 
sudo usermod -a -G libvirt $USER
- Установим модифицированную версию SeaBios (изменен /src/config.h на более реалистичные значения)
 
git clone https://github.com/c3rb3ru5d3d53c/seabios.git
cd seabios/
make
sudo cp /usr/share/seabios/bios.bin /usr/share/seabios/bios.bin.bak
sudo cp out/bios.bin /usr/share/seabios/bios.bin
- Если вы хотите чтобы virt-manager имел доступ к вашей домашней директории, установите следующее разрешение (этот пункт необязателен)
 
sudo setfacl -m u:libvirt-qemu:rx /home/$USER
- Выполните перезагрузку
 
sudo reboot
Создание виртуальных машин
В этой секции показано как создавать виртуальные машины KVM с использованием virt-manager.
Создание виртуальной сети
Настройка PFSense LAN
- Откройте Edit.
 - Перейдите к Connection Details.
 - Нажмите на + для добавления новой конфигурации.
 - Выберите vmbr0 Isolated (PFSense LAN).
 - Отключите IPV4 и IPv6 (настройки PFSense).
 
Настройка Analysis LAN
- Откройте Edit.
 - Перейдите к Connection Details.
 - Нажмите на + для добавления новой конфигурации.
 - Выберите vmbr1 Isolated (Analysis LAN).
 - Отключите IPV4 и IPv6 (настройки Remnux).
 
Создание виртуальной машины с PFSense
Основная цель создания машины с PFSense - это простой способ управления брандмауэром между сетью и интернетом.
- Скачать PFSense: https://www.pfsense.org/download/
 - Создадим образ qcow2
 
qemu-img create -f qcow2 pfsense.qcow2 16G
Создадим виртуальную машину
- Импортируем существующий образ диска
 - Выберем pfsense.qcow2 в качестве хранилища
 - В качестве ОС выберем FreeBSD
 - Название: pfsense
 
Настроим конфигурацию
- Сетевая карта - NAT
 - Add Hardware -> Network -> vmbr0 (Сеть PFSense)
 - Add Hardware -> Network -> CDROM Device -> Manager -> PFSense ISO
 - Boot Options -> Установим CDROM device как первый на этапе загрукзи ОС
 
Запустим машину
В настройках PFSense установим LAN 10.0.1.1/24
Создание виртуальной машины Remnux (Ubuntu 24.04)
Основная цель этой виртуальной машины - проводить статический анализ бинарных файлов с помощью таких инструментов как IDA, Ghidra, Cutter и.т.д, а также служить шлюзом для подсети анализа. Это дает полный контроль над серверами DNS и DHCP для перехвата трафика и других операций.
[!NOTE] Официальные дистрибутивы Remnux обновляются довольно редко. Рекомендуется скачать последний LTS-образ Ubuntu и использовать Remnux в качестве контейнера.
- Скачать https://releases.ubuntu.com/noble/
 - Создадим образ диска
 
qemu-img create -f qcow2 remnux.qcow2 40G
- Создадим новую виртуальную машину
- Импортируем существующий образ диска
 - В качестве хранилище выберем remnux.qcow2
 - В качестве ОС выберем Ubuntu
 
 - Настроим конфигурацию перед установкой
- Установим первый сетевой интерфейс как vmbr0 (Сеть PFSense)
 - Add Hardware -> Network -> vmbr1 (сеть анализа)
 - Add Hardware -> Storage -> CDROM Device-> Manage -> Ubuntu ISO Image
 - Boot Options -> Установим CDROM device как первый при загрузке
 
 - Запустим ВМ
 - Установим зависимости
 
sudo apt update
sudo apt install dnsmasq isc-dhcp-server openvpn docker.io spice-vdagent
sudo systemctl enable spice-vdagent
sudo systemctl enable docker
sudo usermod -a -G docker $USER
# выйти и зайти снова
- Создадим remnux - контейнер
 
docker run --rm -it -v $(pwd):$HOME -u remnux remnux/remnux-distro:focal bash
- Настроим интерфейсы
 
sudo nano /etc/netplan/01-network-manager-all.yaml
# Заменить содержимое следующим
 'network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      dhcp4: yes
    enp7s0:
      addresses:
        - 10.0.2.1/24
'
- Отключим конфликты dnsmasq с systemd-resolved
 
sudo nano /etc/systemd/resolved.conf
# Добавить DNSStubListener=no в конец файла и сохранить
sudo systemctl restart systemd-resolved
sudo systemctl enable dnsmasq
sudo systemctl restart dnsmasq
- Настроим dhcp - сервер для сети анализа
 
sudo nano /etc/dhcp/dhcpd.conf
# Добавить следющее в файл конфигурации
 'subnet 10.0.2.0 netmask 255.255.255.0 {
   option domain-name "mydomain.org";
   default-lease-time 600;
   max-lease-time 7200;
   option routers 10.0.2.1;
   option subnet-mask 255.255.255.0;
   option broadcast-address 10.0.2.255;
   option domain-name-servers 10.0.2.1;
   range 10.0.2.2 10.0.2.254;
}'
sudo systemctl enable isc-dhcp-server
sudo systemctl restart isc-dhcp-serve
- Настроим firewall PFSense.
- Перейдем по адресу https://10.0.1.1 и авторизуемся (admin:pfsense)
 - Добавим правила, запрещающие доступ из LAN в 192.168.0.1/24
 - Применим изменения
 
 - Настроим internet forwarding
 
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE # 
sudo apt install iptables-persistent # "Yes" в обоих случаях
sudo nano /etc/sysctl.conf # Убрать комментарий с net.ipv4.ip_forward=1
sudo sysctl -w net.ipv4.ip_forward=1
- Создадим скрипт, позволяющий запускать VPN
 
nano vpn.sh
# Добавить след. инструкции и сохранить
'
#!/usr/bin/env bash
openvpn --daemon --config VPNJantit_All-servers_UDP-443.ovpn
'
chmod +x vpn.sh
sudo ./vpn.sh
- Установим утилиту для просмотра https трафика MITMProxy
 
sudo apt update
sudo apt install -y wireshark tshark # Yes
sudo usermod -a -G wireshark $USER   # Выйти и зайти снова
wget https://snapshots.mitmproxy.org/8.1.0/mitmproxy-8.1.0-linux.tar.gz
tar -xzvf mitmproxy-8.1.0-linux.tar.gz
sudo mv mitmdump /usr/bin/
sudo mv mitmproxy /usr/bin/
sudo mv mitmweb /usr/bin/
wget https://gist.githubusercontent.com/c3rb3ru5d3d53c/d9eb9d752882fcc630d338a6b2461777/raw/f56cbef4b98c7bad8f265534eabf696923b649a2/mitmpcap
chmod +x mitmpcap
sudo mv mitmpcap /usr/bin/
wget https://gist.githubusercontent.com/c3rb3ru5d3d53c/3bc8041a182467ccae0207394c1e16b3/raw/33bf201da721ae8f8dc057480221a3c6612e7c11/mitmhttp
chmod +x mitmhttp
sudo mv mitmhttp /usr/bin/
sudo mkdir /root/.mitmproxy
После этого можно перезапустить машину и использовать интернет.
Создание виртуальной машины Windows
Эта ВМ будет находиться в сети анализа, основная её задача - динамический анализ исполняемых файлов (Отладка, просмотр API - вызовов и т.д.).
[!WARNING] При установке Windows необходимо убедиться что загрузочным диском является VirtIO
- Скачаем VirtIO ISO
 - Создадим образ диска
 
qemu-img create -f qcow2 windows.qcow2 128G
Создадим новую виртуальную машину
- Импортируем существующий образ диска
 - Выберем windows.qcow2 в качестве хранилища
 - Выберем Windows в качестве ОС
 
Настроим конфигурацию перед установкой
- Установим первый сетевой интерфейс как vmbr1 (Сеть анализа)
 - Add Hardware -> Storage -> CDROM Device-> Manage -> Windows ISO Image
 - Add Hardware -> Storage CDROM Device -> Manage -> VirtIO ISO
 - Boot Options -> Установим CDROM device как первый при загрузке
 - Извлечем SATA диск и заменим на VirtIO (windows.qcow2)
 
Запустим установку
Во время установки Windows диск VirtIO не будет отображаться, пока вы не перейдете к ISO-образу VirtIO и не выберете папку с драйверами для вашей версии Windows. После завершения вы можете продолжить установку.
После установки Windows откройте “Диспетчер устройств” и найдите все драйверы со знаками вопроса, затем обновите их, используя CD-ROM с ISO-образом VirtIO.
Скачайте и установите Spice Guest Tools
Перезагрузите ВМ После того как вы завершите все необходимые шаги, рекомендуется удалить CD-ROM привод для драйверов VirtIO.
Дешифрование TLS - сертификатов
Этот раздел о том, как настроить дешифрование TLS на виртуальной машине Remnux для дешифровки TLS и просмотра секретов и pcap-файлов с аналитической сети (при условии, что устройства имеют установленный корневой сертификат CA).
На Remnux - машине выполним
sudo mitmhttp -i <analysis-network-interface> --enable
mitmproxy --mode transparent --listen-host 0.0.0.0 --listen-port 8080
На машине Windows откроем браузер и перейдем на сайт mitm.it, затем следуем инструкциям установки. Ручная установка:
- На веб-странице скачайте сертификат для Windows.
 - Выберете файл P12, чтобы начать мастер импорта.
 - Выберите расположение хранилища сертификатов. Это определяет, кто будет доверять сертификату — только текущий пользователь или все пользователи. Нажмите “Далее”.
 - Нажмите “Далее” снова.
 - Оставьте поле пароля пустым и нажмите “Далее”.
 - Выберите “Разместить все сертификаты в следующем хранилище”, затем нажмите “Обзор” и выберите “Доверенные корневые центры сертификации”. Нажмите “ОК” и “Далее”.
 - Нажмите “Завершить”.
 - Нажмите “Да”, чтобы подтвердить диалоговое окно предупреждения.
 
Автоматическая установка:
certutil.exe -addstore root mitmproxy-ca-cert.cer
В вашем браузере перейдите на https://example.com, чтобы проверить успешное дешифрование в интерфейсе mitmproxy. Если вышеуказанные шаги были успешными, теперь вы можете использовать инструмент mitmpcap для просмотра трафика в реальном времени с помощью mitmproxy, а также использовать его для захвата TLS-секретов и pcap для последующего анализа.
mitmpcap -i enp7s0 -w dump.pcap -m transparent -p 8080 -s secrets.txt -v 1 -f libpcap
Как только вы закончите перехват, нажмите Q, а затем Y для выхода из mitmproxy. После этого вы должны заметить, что у вас есть файлы dump.pcap и secrets.txt. Следующие шаги о том, как использовать Wireshark для анализа перехваченного трафика.
- Откройте dump.pcap в Wireshark.
 - Перейдите в меню Редактировать -> Настройки -> Протоколы -> TLS -> Имя файла журнала (предварительного) основного секрета, нажмите Обзор -> выберите secrets.txt.
 - В строке фильтра введите http и нажмите Enter.
Теперь у вас должен быть расшифрованный TLS-трафик. Как только вы завершите захват трафика и больше хотите остановить перехват, отключите перенаправление, выполнив следующее 
sudo mitmhttp -i <analysis-network-interface> --disable
