Хакерские лабы
Зачем использовать NotHoly для CTF и лабораторий
Модель, что пишет exploit для вашего задания и объясняет, почему он работает, статический triage бинарника, и solve в вашей лаборатории.
Запустите OWASP Juice Shop в контейнере Docker, привязанном к вашей машине, убедитесь, что он отвечает, и корректно остановите его.
OWASP Juice Shop — намеренно уязвимое веб-приложение. Его можно запустить в контейнере Docker на своём компьютере, открыть в браузере по адресу http://127.0.0.1:3000 и практиковаться в веб-безопасности, не затрагивая чужие системы. По словам проекта, в нём есть уязвимости из всего OWASP Top Ten и другие, найденные в реальных приложениях. Ниже команды, что проверять после каждой, как сохранить порт закрытым для других и как остановить лабораторию.
В Juice Shop уязвимости заложены намеренно. Держите его на машине и в сети, которые контролируете, и никогда не открывайте в интернет.
Выполните в терминале эти две команды:
docker --version
docker infoПервая команда печатает версию Docker CLI. Вторая обращается к движку Docker и печатает его конфигурацию. Если docker info сообщает, что не может подключиться к демону, запустите Docker Desktop или службу Docker и повторите команду. Точный текст ошибки зависит от платформы, поэтому, если исправление неочевидно, следуйте документации Docker по установке.
В документации проекта образ называется bkimminich/juice-shop. В README проекта он запускается без тега, поэтому скачивается latest. Если нужна воспроизводимая лаборатория, выберите тег релиза на странице Docker Hub и допишите его к имени образа (bkimminich/juice-shop:<tag>), чтобы знать, какую версию вы тестируете.
docker run --rm --name juice-shop-lab \
-p 127.0.0.1:3000:3000 \
bkimminich/juice-shopФлаг -p публикует порт контейнера на хосте. Значение 127.0.0.1:3000:3000 состоит из трёх частей: адрес хоста, порт хоста и порт контейнера. В справочнике Docker по публикации портов сказано, что маппинг без адреса может слушать на всех интерфейсах хоста. Если поставить первым 127.0.0.1, лаборатория будет доступна только с вашей машины.
Флаг --rm удаляет контейнер, когда тот останавливается. Команда работает на переднем плане, поэтому терминал печатает логи, пока вы её не остановите. При первом запуске скачивается образ, и это может занять время.
Откройте http://127.0.0.1:3000 в браузере на той же машине. Должна появиться главная страница Juice Shop. Если она не загружается, прочитайте ошибки в терминале, затем выполните docker ps во втором терминале и убедитесь, что контейнер работает, а маппинг портов правильный. VPN-клиенты, прокси и сети виртуальных машин могут менять поведение локального трафика, так что проверьте и их, прежде чем менять флаги.
Не меняйте 127.0.0.1 на 0.0.0.0, чтобы страница загрузилась. Такая настройка открывает лабораторию другим устройствам в вашей сети.
Прежде чем браться за челленджи, посмотрите, как общаются браузер и сервер. Откройте инструменты разработчика, перейдите на вкладку Network и перезагрузите страницу. Выберите один запрос и запишите:
Content-Type;Ту же информацию можно получить из терминала:
curl -I http://127.0.0.1:3000В Windows PowerShell 5.1 curl — это псевдоним другой команды, поэтому вводите curl.exe.
Опция -I отправляет запрос HEAD и печатает только заголовки ответа. RFC 9110 определяет методы, коды статуса и поля заголовков, на которые вы смотрите. Вот первые строки того, что вернул образ без тега в одном из запусков (2026-11-08); другие релизы могут отличаться:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Type: text/html; charset=UTF-8Запишите, что возвращает ваш сервер, и сравните.
В документации проекта описаны учебные челленджи и подсказки к ним. Прочитайте эти материалы, прежде чем пробовать эксплойт, и направляйте все тесты только на 127.0.0.1. Если сначала разобраться в цикле запроса и ответа, позже будет проще оценивать результаты сканеров, потому что вы увидите трафик, который эти инструменты отправляют и получают.
Если контейнер работает на переднем плане, нажмите Ctrl+C в его терминале. Поскольку вы указали --rm, Docker удалит контейнер после остановки.
Если этот терминал потерян, остановите контейнер из другого:
docker stop juice-shop-labDocker отправляет сигнал остановки и ждёт завершения контейнера. Убедитесь, что лаборатории больше нет:
docker psЕсли имени контейнера в списке нет, лаборатория остановлена. Закрытие вкладки браузера контейнер не останавливает, поэтому каждый раз проверяйте docker ps.
Если порт уже занят, docker run завершается ошибкой Bind for 127.0.0.1:3000 failed: port is already allocated. Выберите другой порт хоста, например -p 127.0.0.1:3001:3000, и откройте http://127.0.0.1:3001. Часть 127.0.0.1 оставьте.
Если контейнер сразу завершается, прочитайте логи в терминале. Ищите первую строку с ошибкой, а не последнюю.
Если первый запуск идёт долго, значит Docker скачивает образ и его слои. Следующие запуски быстрее, потому что Docker хранит образ локально.
Языковая модель может объяснить код статуса или помочь упорядочить заметки, и NotHoly — одно из мест, где её можно запустить. Она может и ошибиться в том, что значит ответ, и она не заменяет письменное разрешение и ручную проверку. Вставляйте только вывод из своей лаборатории и никогда не вставляйте сессионные куки, токены или данные реальной цели.
Пишите заметки по тому, что наблюдали сами, а затем сравнивайте их с материалами ниже.
Хакерские лабы
Модель, что пишет exploit для вашего задания и объясняет, почему он работает, статический triage бинарника, и solve в вашей лаборатории.
Хакерские лабы
Создайте сеть Docker без выхода в интернет, запустите в ней OWASP Juice Shop и опубликуйте копию для браузера только на 127.0.0.1. Проверка на каждом шаге.
Хакерские лабы
Структура отчёта о пентесте и одна находка, которую сможет воспроизвести другой человек: улики, импакт, вектор CVSS v4.0 и исправление.