Организация виртуальной лаборатории с использованием 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
