
Веб-приложение с уязвимостями, обнаруженными в реальных случаях, как при пентестах, так и в программах Bug Bounty.
Web Hacking Playground — это контролируемая среда для веб-взлома. Она содержит уязвимости, обнаруженные в реальных случаях, как при пентестах, так и в программах Bug Bounty. Цель состоит в том, чтобы пользователи могли практиковаться на них, а также научиться их обнаруживать и эксплуатировать.
Также будут затронуты другие интересные темы, такие как: обход фильтров с помощью создания собственных полезных нагрузок, выполнение цепочечных атак с использованием различных уязвимостей, разработка скриптов доказательства концепции и другие.
Исходный код приложения виден. Однако подход лаборатории — «чёрный ящик». Поэтому код не должен просматриваться для решения задач.
Кроме того, следует отметить, что фаззинг (как параметров, так и каталогов) и атаки методом перебора не дают никаких преимуществ в этой лаборатории.
Рекомендуется использовать Kali Linux для выполнения этой лабораторной работы. В случае использования виртуальной машины желательно использовать гипервизор VMware Workstation Player.
Среда основана на Docker и Docker Compose, поэтому необходимо иметь их установленными.
Для установки Docker на Kali Linux выполните следующие команды:
sudo apt update -y
sudo apt install -y docker.io
sudo systemctl enable docker --now
Для установки Docker на других дистрибутивах на основе Debian выполните следующие команды:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable docker --now
Для установки Docker Compose выполните следующую команду:
sudo apt install -y docker-compose
Примечание: В случае использования M1 рекомендуется выполнить следующую команду перед сборкой образов:
export DOCKER_DEFAULT_PLATFORM=linux/amd64
Следующий шаг — клонировать репозиторий и собрать образы Docker:
git clone https://github.com/takito1812/web-hacking-playground.git
cd web-hacking-playground
sudo docker-compose build
Также рекомендуется установить расширение браузера Foxy Proxy, которое позволяет легко менять настройки прокси, и Burp Suite, который мы будем использовать для перехвата HTTP-запросов.
Мы создадим новый профиль в Foxy Proxy для использования Burp Suite в качестве прокси. Для этого перейдите в настройки Foxy Proxy и добавьте прокси со следующей конфигурацией:
После установки всего необходимого вы можете развернуть среду следующей командой:
git clone https://github.com/takito1812/web-hacking-playground.git
cd web-hacking-playground
sudo docker-compose up -d
Это создаст два контейнера приложений, разработанных на Flask, на порту 80:
Необходимо добавить IP-адреса контейнеров в файл /etc/hosts, чтобы к ним можно было обращаться по имени и чтобы сервер эксплойтов мог связываться с уязвимым веб-приложением. Для этого выполните следующие команды:
sudo sed -i '/whp-/d' /etc/hosts
echo "$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' whp-socially) whp-socially" | sudo tee -a /etc/hosts
echo "$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' whp-exploitserver) whp-exploitserver" | sudo tee -a /etc/hosts
После этого уязвимое приложение будет доступно по адресу http://whp-socially, а сервер эксплойтов — по адресу http://whp-exploitserver.
При использовании сервера эксплойтов необходимо использовать указанные выше URL-адреса, используя доменное имя, а не IP-адреса. Это обеспечивает правильную связь между контейнерами.
Что касается взлома, для представления сервера атакующего необходимо использовать локальный IP-адрес Docker, поскольку лабораторная работа не предназначена для выполнения запросов к внешним серверам, таким как Burp Collaborator, Interactsh и т. д. Можно использовать Python http.server для имитации веб-сервера и приёма HTTP-взаимодействий. Для этого выполните следующую команду:
sudo python3 -m http.server 80
Среда разделена на три этапа, каждый из которых содержит различные уязвимости. Важно выполнять их по порядку, так как уязвимости на следующих этапах основываются на уязвимостях предыдущих этапов. Этапы следующие:
Ниже приведены спойлеры к уязвимостям каждого этапа. Если вам не нужна помощь, вы можете пропустить этот раздел. С другой стороны, если вы не знаете, с чего начать, или хотите проверить, правильным ли путём вы идёте, вы можете развернуть интересующий вас раздел.
На этом этапе сессия конкретного пользователя может быть украдена с помощью межсайтового скриптинга (XSS), который позволяет выполнять код JavaScript. Для этого жертва должна иметь возможность перейти по URL-адресу в контексте пользователя; такое поведение можно смоделировать с помощью сервера эксплойтов.
Подсказки для решения этого этапа:
На этом этапе может быть сгенерирован токен, который предоставляет доступ как администратор. Это типичная атака на JSON Web Token (JWT), при которой полезная нагрузка токена может быть изменена для повышения привилегий.
Подсказка для решения этого этапа: существует конечная точка, которая при предоставлении JWT возвращает действительную куки сессии.
На этом этапе файл /flag можно прочитать с помощью уязвимости Server-Side Template Injection (SSTI). Для этого необходимо заставить приложение выполнить код Python на сервере. Можно выполнять системные команды на сервере.
Подсказки для решения этого этапа:
Уязвимая функциональность защищена двухфакторной аутентификацией. Поэтому перед эксплуатацией SSTI необходимо найти способ обойти запрос OTP-кода. Иногда приложение доверяет запросам, поступающим с того же сервера, и HTTP-заголовки играют важную роль в этой ситуации.
SSTI является «слепым», это означает, что вывод кода, выполненного на сервере, не получается напрямую. Модуль Python smtpd позволяет создать SMTP-сервер, который выводит полученные сообщения на стандартный вывод:
sudo python3 -m smtpd -n -c DebuggingServer 0.0.0.0:25
Приложение использует Flask, поэтому можно предположить, что шаблонизатором является Jinja2, поскольку это рекомендуется официальной документацией Flask и широко используется. Вам необходимо получить совместимую с Jinja2 полезную нагрузку для получения финального флага.
Сообщение электронной почты имеет ограничение на количество символов. Информацию о том, как обойти это ограничение, можно найти в Интернете.
Подробные решения для каждого этапа можно найти в папке Solutions.
Следующие ресурсы могут быть полезны при решении этапов:
Приветствуются pull request'ы. Если вы нашли какие-либо ошибки, пожалуйста, откройте issue.