Хакерские лабы
Зачем использовать NotHoly для CTF и лабораторий
Модель, что пишет exploit для вашего задания и объясняет, почему он работает, статический triage бинарника, и solve в вашей лаборатории.
Домашняя лаборатория, которую вам разрешено атаковать: файл скоупа, порты Docker только на loopback, изолированная сеть, журнал и чистая разборка в конце.
Домашняя лаборатория законна, когда каждая система, которую вы атакуете, принадлежит вам или человеку, давшему письменное разрешение. Всё остальное следует из этого одного правила. Ваш ноутбук, созданная вами виртуальная машина и запущенный вами контейнер входят в скоуп. Wi-Fi соседа, сеть учебного заведения и «тот сайт, который выглядит уязвимым» не входят, даже если тест безобиден.
Запишите это правило до того, как что-либо установите. Когда инструмент запущен, а цель выглядит интересно, границы разрешённого легко размываются.
Команды ниже запускались в Windows с Docker 29.8.2. Другие версии могут печатать немного другой текст.
Держите лабораторию в одной папке, чтобы её было легко найти и потом удалить:
mkdir -p lab/notes
cd labСоздайте в этой папке scope.md со списком целей, которые вы себе разрешаете:
# Scope
Allowed targets:
- 127.0.0.1 (containers I started, ports bound to loopback)
Not allowed:
- Anything else, until I have written permission from its owner.Выглядит мелочью, но не даёт направить сканер на адрес, который вы и не собирались тестировать.
docker --versionDocker version 29.8.2, build 7fc2dffЕсли команда не сработала, сначала установите Docker. Если docker info сообщает, что не может связаться с демоном, запустите Docker Desktop или службу Docker и попробуйте ещё раз.
Проще всего запускать уязвимое ПО в контейнерах, тогда его не надо устанавливать в систему. Риск здесь в пробросе портов. В документации Docker о публикации портов сказано, что проброс -p без адреса делает порт доступным извне хоста. Намеренно уязвимому приложению там не место.
Указывайте адрес loopback в пробросе явно. В этом примере обычный образ веб-сервера заменяет лабораторную цель:
docker run -d --rm --name lab-check -p 127.0.0.1:18080:80 caddy:2
docker port lab-check80/tcp -> 127.0.0.1:18080127.0.0.1:18080 означает, что порт доступен только с вашей машины. Сравните с пробросом без адреса:
docker stop lab-check
docker run -d --rm --name lab-check -p 18081:80 caddy:2
docker port lab-checklab-check
80/tcp -> 0.0.0.0:18081
80/tcp -> [::]:18081Здесь Docker слушает на 0.0.0.0 и [::], то есть на всех интерфейсах. Смогут ли другие устройства реально подключиться, зависит от вашего файрвола и сети, так что полагаться на это нельзя. Указывайте 127.0.0.1 в каждой лабораторной команде и каждый раз проверяйте результат через docker port.
Некоторым упражнениям сеть вообще не нужна, например чтению подозрительного скрипта или запуску парсера на файле. Сетевой драйвер none в Docker оставляет контейнеру только loopback:
docker run --rm --network none alpine:3.22 ip -o link | cut -d' ' -f2lo:Существует только интерфейс loopback (lo). Используйте --network none для всего, что не должно общаться с внешним миром, и считайте скачанный образец враждебным, пока не прочитаете его.
Создавайте по одному файлу на сессию в notes/. Записывайте дату, цель, что вы пробовали и что получилось, в этом порядке и прямо во время работы:
## 2026-01-15 14:20, first run
- Target: juice-shop-lab, http://127.0.0.1:3000
- Goal: see what a failed login returns
- Command: curl -i http://127.0.0.1:3000/rest/user/login
- Result: (paste what you saw, not what you expected)
- Next: ...У журнала две задачи. Он показывает, что вы делали, когда результат вас удивил, и с этой привычки начинается настоящий отчёт. Записывайте команду, которую запустили, и вывод, который получили. Не вставляйте вывод из руководства.
Остановите то, что запустили, и проверьте, что ничего не осталось:
docker stop lab-check
docker ps -a --filter name=lab-check --format '{{.Names}}'lab-checkdocker stop печатает имя контейнера. Поскольку контейнер запущен с --rm, Docker удаляет его после остановки, и вторая команда ничего не печатает. Если хотите удалить и образ, сделайте это через docker image rm. Удаляйте папку lab, только когда заметки вам больше не нужны.
Лаборатория, которую можно пересобрать за несколько минут, лучше той, к которой страшно прикасаться.
Теперь у вас есть папка со скоупом, привычка к loopback и способ всё остановить. Следующая статья, Запуск OWASP Juice Shop в Docker, использует эту настройку, чтобы запустить намеренно уязвимое веб-приложение. Сначала прочитайте страницу проекта OWASP Juice Shop, чтобы знать, что именно вы запускаете.
Хакерские лабы
Модель, что пишет exploit для вашего задания и объясняет, почему он работает, статический triage бинарника, и solve в вашей лаборатории.
Хакерские лабы
Создайте сеть Docker без выхода в интернет, запустите в ней OWASP Juice Shop и опубликуйте копию для браузера только на 127.0.0.1. Проверка на каждом шаге.
Хакерские лабы
Структура отчёта о пентесте и одна находка, которую сможет воспроизвести другой человек: улики, импакт, вектор CVSS v4.0 и исправление.