
Демонстрация уязвимости Heartbleed CVE-2014-0160
Уязвимость Heartbleed — это пример кибератаки, использующей брешь в библиотеке OpenSSL. Кратко: отсутствие этапа проверки в библиотеке OpenSSL позволяет злоумышленнику получить доступ к конфиденциальной информации на сервере, использующем уязвимую библиотеку. В рамках протокола рукопожатия для установления SSL-соединения между клиентом и сервером клиент отправляет heartbeat-сообщение, которое затем возвращается сервером. Клиент также отвечает за передачу длины своего heartbeat-сообщения, которую сервер использует для определения количества байтов из памяти, которые необходимо вернуть. Поддельное значение длины, не проверяемое сервером, может заставить его вернуть байты, расположенные рядом с областью памяти, где хранится heartbeat-сообщение клиента.
Этот репозиторий содержит демонстрацию того, как уязвимость Heartbleed может быть использована для извлечения сессионных cookie с веб-сервера, что позволяет злоумышленнику получить доступ к защищенной части веб-сайта, контролируемой доступом.
Если вы преподаете концепции кибербезопасности и безопасное программирование, вы можете использовать этот пример для получения практического опыта работы с уязвимостью Heartbleed и демонстрации того, насколько легко можно получить привилегированную информацию.
Если вы студент курса по кибербезопасности или начинающий программист, полезно понять, как незначительные ошибки в коде могут привести к серьезным уязвимостям безопасности. Если вы сейчас изучаете атаку Heartbleed на занятиях, вы можете получить дополнительный практический опыт в том, как работают такие атаки и что можно сделать для их предотвращения.
Эта демонстрация спроектирована с использованием трех Docker-контейнеров: по одному для сервера, хакера и жертвы. На серверном контейнере размещен простой веб-сайт на Python Flask, который возвращает приветственное сообщение при успешном входе. Серверный контейнер работает с неисправленной версией библиотеки OpenSSL, содержащей уязвимость Heartbleed. Контейнеры хакера и жертвы предоставляют VNC-интерфейс к машине Ubuntu. Контейнер хакера также содержит Python-скрипт, который эксплуатирует уязвимость Heartbleed для отправки неверной длины сообщения heartbeat и анализирует данные, возвращенные с сервера, в поисках сессионных cookie. Инструкции приведены в HTML-документе на рабочем столе контейнера хакера.
Рекомендуемый способ запуска этого набора контейнеров — через CHEESEHub, веб-платформу для демонстраций кибербезопасности. CHEESEHub предоставляет необходимые ресурсы для оркестрации и запуска контейнеров по требованию. Чтобы настроить это приложение для запуска на CHEESEHub, необходимо создать спецификацию приложения, которая конфигурирует используемый Docker-образ, требования к памяти и CPU, а также порты, которые необходимо открыть для каждого из трех контейнеров. JSON-спецификация для этой демонстрации Heartbleed находится здесь.
CHEESEHub использует Kubernetes для оркестрации своих контейнеров приложений. Вы также можете запустить это приложение в своей собственной установке Kubernetes. Инструкции по настройке минимального кластера Kubernetes на локальной машине см. в Minikube.
Перед запуском на CHEESEHub или Kubernetes необходимо собрать Docker-образы для трех контейнеров приложения. Определения контейнеров для хакера, жертвы и сервера находятся в каталогах heartbleed-hacker, heartbleed-victim и heartbleed-server соответственно. Чтобы собрать эти контейнеры, выполните:
cd heartbleed-hacker
docker build -t <выбранный вами тег образа хакера> .
cd heartbleed-victim
docker build -t <выбранный вами тег образа жертвы> .
cd heartbleed-server
docker build -t <выбранный вами тег образа сервера> .
После сборки Docker-образов вы можете запустить контейнеры с помощью только Docker Engine.
docker run -d -p 80 <тег образа хакера из предыдущего шага>
docker run -d -p 80 <тег образа жертвы из предыдущего шага>
docker run -d <тег образа сервера из предыдущего шага>
Поскольку пользовательский интерфейс контейнеров хакера и жертвы — это VNC-интерфейс, мы открываем порт 80 для доступа с хост-машины. Поскольку мы будем обращаться к веб-сайту сервера только изнутри контейнеров хакера и жертвы, нам не нужно сопоставлять какие-либо открытые порты серверного контейнера.
При переходе по URL контейнера хакера в вашем браузере откроется интерфейс рабочего стола Linux. Дважды щелкните файл Instructions.html на рабочем столе, чтобы просмотреть пошаговые инструкции для этой демонстрации. Новое окно браузера или терминала можно запустить на контейнерах хакера и жертвы, выбрав меню программ в левом нижнем углу. IP-адрес сервера, который будут использовать хакер и жертва для доступа к веб-сайту сервера, можно получить, запустив консоль на серверном контейнере со страницы списка контейнеров CHEESEHub.
Чтобы сообщить о проблемах или внести улучшения в это приложение, создайте issue на GitHub.