На проверке Как я построил полностью изолированную пентест лабораторию и почему ИИ нельзя доверять

Уже месяц я изучаю создание пентест-инструментов (назовем это так, чтобы с модерацией проблем не было :-) по книге "Black Hat Go", до недавних пор, я тестировал малварь на своём хосте, ибо в них нет ничего опасного, это простейшие утилиты по типу TCP-сканера.

Но продвинувшись дальше, понимаю, тестировать эти утилиты на своем хосте — самоубийство.

Критерии лаборатории​

Значит, нужно построить свою виртуальную и изолированную лабу. В них должно быть минимум 3 машины: Windows 11 в роли жертвы, Ubuntu server lts в роли C2 сервака,
и конечно классический Metasploitable2, опять же в роли жертвы.

Все машины должны видеть друг друга, чтобы малварь понимал куда посылать данные и откуда получать команды, при этом, у машин не должно быть доступа к хосту, но вот в чем главная загвоздка:

Для эффективного функционирования подавляющего большинства малварь — нужен выход в мировую паутину, соответственно, у нас 4 важных критерия:

1. Лаба должна быть изолирована от домашней сети

2. Все виртуальные машины должны видеть друг друга

3. Никакая из виртуальных машин не должна видеть хост

4. Хост должен видеть жертв, он будет играть роль атакующего

5. У всех машин должен быть выход в интернет (кроме Metasploitable2, наверное)

Установка и настройка виртуальных машин​

Итак, мы имеем не тривиальную задачу, я решил не рисковать, спросил у ИИ как это сделать грамотнее всего, захожу в Google Gemini 2.5 pro, и диктую все те же условия,
мой хост - Arch Linux, поэтому ИИ в качестве виртуальной машины посоветовал мне KVM + Virt-Manager, я сразу скачал его, решил начать с win 11, скачал iso образ, а затем и саму винду в KVM.

Установился он довольно просто, теперь нужно было настроить сети, опять же, у машины должен быть выход в интернет и при этом она не должна видеть хост. Я создал ей два сетевых адаптера, первый - isolated network, для тестов, второй - NAT, для выхода в интернет.

Запускаю винду, первым же делом замечаю что выход в интернет есть, чтобы убедиться в этом пингую гугл, пакеты получены успешно.

Проблема изоляции​

Захожу на хост и пишу в терминале ip a, чтобы узнать локальный айпи адрес хоста, после чего на винде я пытаюсь пинговать его, и я удачно получил все отправленные пакеты, это значит сеть не изолирована, то есть в лабе нет смысла.
Затем я попробовал пропинговать windows через свой хост, и всё стало еще страннее, ведь я не мог получить ответа от винды...


Всё должно быть с точностью до наоборот, винда НЕ ВИДИТ хост, а хост ВИДИТ винду, для атак, сканирования портов и т.д.

Я подумал, проблема того, что хост не может достучаться до винды может быть в брандмауере виндоуса, я его выключил, и действительно, теперь я могу удачно её пинговать с хоста.

Но главная проблема осталась — виртуальная винда видит мой хост, это опасно, малварь запросто может атаковать меня же, или любое другое устройство в моей домашней сети.

Настройка фаервола хоста​

Я почти наверняка был уверен: нужно просто сказать фаерволу моего хоста, чтобы он блочил или пропускал ВЕСЬ трафик, который идет из айпи "изолированной" винды.

Звучит как план, верно? Берёшь nftables (или iptables, если повезёт),
пишешь пару правил — и готово.

До этого, мне не приходилось с таким работать, и зная как легко можно поломать линукс, я снова решаю не рисковать и спросить у ИИ, снова мой любимый gemini 2.5 pro, начал спрашивать: "как заблокировать трафик из virbrX в wlan0, но оставить интернет".

И тут начался настоящий цирк, который длился больше трёх дней.

Сначала мне советуют простые iptables-правила в FORWARD и INPUT:

sudo iptables -I FORWARD -i virbr2 -o wlan0 -j DROP
sudo iptables -I INPUT -i virbr2 -j DROP

Казалось бы — всё, малварь ослепла. Перезапускаю VM — интернет умирает полностью. Потому что эти правила блочат и masquerade, через который идёт весь outbound-трафик.

Хорошо, говорю ИИ: "интернет сломался". ИИ: "ну тогда давай умнее" — и начинается ковыряние в цепочках libvirt:
sudo iptables -I LIBVIRT_FWI -s 192.168.200.0/24 -d 192.168.182.0/24 -j DROP (условные ip)

Работает? Нет. Пинг проходит.

Я отчаялся настолько, что решил скачать Virtual Box, который я лично недолюбливаю, но я вспомнил, что там есть режим NAT-Network, который по идее должен решить мою проблему.
Скачал туда ту же винду, дал ей адаптер вида NAT-Network, и проблема никуда не делаcь, виртуальная машина удачно пингует и получает ответ от хоста как и раньше.

Тогда ИИ вспоминает про nftables (потому что Arch 2024–2025 на nft по умолчанию):
sudo nft insert rule ip libvirt_network forward ip saddr 192.168.200.0/24 ip daddr != 192.168.200.0/24 drop

Вставляю — интернет жив, но пинг на хост всё равно проходит.

Почему? Потому что правило оказывается ПОСЛЕ jump guest_cross/guest_input или ещё какой-то там ерунды, и libvirt его просто игнорирует для local routing.

Я флудю цепочку, вставляю в начало, в конец, в LIBVIRT_FWI, в LIBVIRT_FWO — всё равно малварь видит мой wlan0-IP.

Потом ИИ говорит: "переключись на iptables-legacy, nftables багует с libvirt".

Я пытаюсь:
sudo pacman -S iptables

→ конфликт с iptables-nft, удаляю через -Rdd — слетает firewalld, libvirtd падает в ошибку, сети перестают стартовать вообще. Восстанавливаю бэкап — работает, но опять та же дыра.
Потом предлагают rp_filter=2 или =1 — иногда пинг в одну сторону ломается, иногда в обе, но дыра остаётся.

Потом ebtables, потом policycoreutils, потом "создай свою зону в firewalld" — всё это либо убивает интернет, либо оставляет возможность пинговать хост.
Я провёл в терминале, наверное, часов 12 суммарно. Перезагружал VM раз 40. Читал Arch Wiki, libvirt docs, reddit/r/archlinux, bugreports 2024–2025 годов.

И в итоге понял простую вещь, которую ни один ИИ мне прямо не сказал​

Используя хост в качестве маршрутизатора неоправданно сложно и ненадежно создавать виртуальную машину, у которой будет выход в интернет, и при этом она будет изолирована.

Теоретически это возможно, но требует таких танцев с бубном вокруг nftables, masquerade и libvirt hooks, что малейшая ошибка или обновление системы ломает изоляцию.


Я понял, что безопасность не должна зависеть от удачи.

В общем, моя проблема была в том, что я слепо следовал советам ИИ, я даже не думал, что они могут ошибиться, ибо данная задача мне казалась довольно простой для них. К тому же в ютубе почти нет информации касательно всего этого, ибо в большинстве случаев людям не нужна изолированная лаба у которой есть выход в интернет.

Новый маршрутизатор — pfSense​

Теперь, у меня есть 100% решение — скачать отдельную виртуальную машину в качестве маршрутизатора.

В таком случае мой хост не будет иметь абсолютно никакого отношения к лаборатории, и можно спокойно тестировать малвари любой мощности. А хост лишь будет являться мостом между инетом и новым виртуальным маршрутизатором.

В качестве маршрутизатора я выбрал pfSense — специальная операционная система, которая превращает обычный компьютер в мощный сетевой маршрутизатор и firewall.
Она основана на FreeBSD и управляется через удобный веб-интерфейс, поэтому не требует глубоких знаний Linux или сетевого программирования.

Тот факт, что pfSense базируется на FreeBSD, позволил выставить машине довольно скромную конфигурацию:

Конфигурация pfSense в VirtualBox


После успешной установки pfSense нужно настроить в ней две сети:

1. WAN (подключена к хосту, есть выход в интернет)

2. LAN (хост её не видит, в этой сети находятся только виртуальные машины для тестов):

Вот так выглядит начальняя настройка pfSense:

Начальная настройка pfSense


Теперь для виндоуса нужно поменять сетевой адаптер на internal network, тот же самый что и у pfSense:

Сетевой адаптер для тестируемой машины


Windows при запуске автоматически получит айпи адрес из изолированной сети LAN.

Запускаю виндоус, пингую google.com и 8.8.8.8, удачно получаю все пакеты, значит интернет и айпи адрес машина получила корректно.

Завершение?​

Теперь, ключевой момент, пробуем пинговать с машины жертвы наш хост, и...

Снова те же грабли, хост успешно принимает пакеты и отправляет ответ.

Так в чём же может быть проблема? Мы создали отедльную виртуальную машину, которая должна служить заменой хосту, чтобы у жертв был выход в интернет.

Дело в том, что pfSense не работает "из коробки", его нужно настроить.

Более глубокая настройка pfSense​

Для начала с машины жертвы заходим в веб интерфейс pfSense, в моем случае это вводим логин и пароль (по дефолту admin/pfsense) и нас встречает красивое минималистичное меню, в котором нам нужно задать несколько правил фаерволу pfSense.

Заходим Firewal > Rules и выбираем WAN

Первое что я сделал, это создал правило, чтобы любой трафик, из любой сети, мог достигнуть жертв в изолированном сетевом диапазоне 10.10.10.0/24,
это нужно, чтобы я мог их атаковать.

Screenshot_20251122_210714.webp


Теперь, нужно задать последнее и самое главное правило: Если трафик идёт из LAN сети, и направлен в сторону айпи хоста, то мы его блокируем.


Таким образом, у малварь не будет ни единого шанса покинуть изолированную сеть и направиться в сторону хоста, вот как выглядит это правило:

Правило для NAT сети, здесь 10.49.224.168 — айпи адрес хоста

Здесь 10.49.224.168 — айпи адрес хоста

Следует сделать еще безопаснее и точно так же блокировать все пакеты что летят из LAN сети в сторону айпи роутера. (узнать айпи роутера можно командой ip route)

Финал​

Ну, сейчас ведь точно всё готово? Нет.

Если мы попробуем пропинговать жертву с нашего хоста, то хост даже не поймет куда отправлять пакеты, ибо сеть 10.10.10.0/24 (в которой и находятся все жертвы) недоступна для хоста, он её просто не видит.

Значит, мне нужно намекнуть хосту что делать с адресами в диапазоне 10.10.10.0/24, для этого пишу в терминал:
sudo ip route add 10.10.10.0/24 via 10.49.224.73 dev wlan0

Здесь 10.49.224.73 — ip-адрес pfSense, нашего маршрутизатора, теперь, всё что я отправляю на адреса в диапазоне 10.10.10.0/24, будет автоматически посылаться на маршрутизатор 10.49.224.73, который в свою очередь доставит пакеты до жертв.

Пробую пропинговать винду и вижу, что всё работает.

Как видно на следующей картинке, второе правило тоже работает безотказно, жертва не может достучаться до хоста:

Хост видит жертву, а жертва его нет

Хост видит жертву, а жертва его нет.

Вспомним наши критерии:

1. Лаба должна быть изолирована от домашней сети (сделано, виндоус не может пинговать хост)

2. Все виртуальные машины должны видеть друг друга (сделано, они находятся в одной изолированной сети 10.10.10.0/24)

3. Никакая из виртуальных машин не должна видеть хост (сделано, при помощи правил фаервола pfSense)

4. Хост должен видеть жертв (сделано, при помощи правил фаервола pfSense)

5. У всех машин должен быть выход в интернет

Таким образом, хоть и не сразу, но у меня получилось создать отличную и что главное полностью изолированную лабораторию.


Теперь, я могу тестировать малварь любой мощности, и не бояться, что они доберутся до устройств в моей домашней сети.

Важная информация​

Спасибо всем, кто дочитал статью!
Надеюсь вам было интересно, это была моя первая статья, поэтому не бейте больно.

А сейчас, я бы хотел обратиться ко всем, кому интересна тема кибербезопасности, недавно я создал группу в телеграмме, в которой собираюсь выкладывать свои личные проекты, и много-много информации касательно сферы информационной безопасности, будь то новости, слитые и не только курсы, разные интересные ивенты и много чего другого, группа только начинает расти, буду очень рад каждому новому члену нашего маленького комьюнити!

Ссылка: NHNH – Public
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы