
PoC на C для CVE-2019-5736
Этот репозиторий содержит эксплойт класса proof-of-concept, написанный на C, для CVE-2019-5736.
Эта уязвимость позволяет вредоносному Docker-контейнеру перезаписать бинарный файл runc на хост-системе и выполнять на ней произвольные команды с привилегиями root, полностью компрометируя хост-систему.
Вдохновлено оригинальным PoC на Go от Frichetten
Этот код предназначен только для образовательных целей. Не запускайте его ни на одной системе, которой вы не владеете или на тестирование которой у вас нет разрешения. Неправомерное использование может повлечь юридические последствия.
.
├── docker/
│ └── Dockerfile
├── lib/
│ └── exploit.h
├── scripts/
│ ├── build_docker.sh
│ ├── purge_docker_installation.sh
│ ├── setup_env.sh
│ ├── start_docker.sh
│ └── trigger_exploit.sh
├── src/
│ ├── exploit.c
│ └── main.c
├── LICENSE
├── Makefile
└── README.md
Этот эксплойт был протестирован на:
sudo ./scripts/install_dependencies.sh
Примечание: этот шаг можно безопасно пропустить, если у вас уже установлены
wgetиbuild-essential.
sudo ./scripts/setup_env.sh
Этот скрипт устанавливает Docker без systemd и socket activation. Он идеально подходит для лабораторных виртуальных машин.
sudo dockerd
Примечание: для запуска в фоновом режиме понадобится второй терминал.
sudo ./scripts/build_docker.sh
Этот скрипт компилирует эксплойт и создаёт Docker-образ с бинарным файлом внутри.
Примечание: вы также можете вручную собрать бинарный файл эксплойта, выполнив
make.
Вы можете полностью удалить Docker и вернуть систему в состояние до установки:
sudo ./scripts/purge_docker_installation.sh
Сначала запустим наш контейнер с эксплойтом. Вы можете использовать либо эту команду:
sudo docker run -it --name exp --rm runc_exploit
или прилагаемый shell-скрипт:
sudo ./scripts/start_docker.sh
Внутри контейнера мы теперь можем запустить бинарный файл эксплойта:
./exploit -c "$COMAND"
Бинарный файл принимает три аргумента:
-hвыводит сообщение об использовании,-cзадаёт строку командной нагрузки (payload), которую мы хотим выполнить на хост-системе. Последний аргумент-dпереключает отладочный вывод во время выполнения (например, разбор информации из/proc).
Примечание: если аргумент
-cне указан, эксплойт выполнитcp /etc/shadow > /tmp/pwned && chmod 644 /tmp/pwned.
Теперь эксплойт ожидает входящего процесса runc на хост-системе. Выполните:
sudo ./scripts/trigger_exploit.sh
Этот скрипт откроет новый процесс внутри контейнера, выполнив bin/sh, и тем самым запустит эксплойт.
Примечание: вы также можете запустить эксплойт, вручную выполнив
docker execна хост-системе, но для работы текущей версии PoC критически важны тайминги. Так что может потребоваться несколько попыток...
Если runc был успешно эксплуатирован, вы должны увидеть похожий вывод:

Теперь мы можем открыть наш взломанный файл shadow:
