Пример атаки Docker escape (побег из Docker-контейнера)

Пример атака Docker escape побег из Docker контейнера

В этой статье рассмотрим атаку Docker escape, на примере прохождения задания Hack The Box Carpediem.

Еще по теме: Проверка безопасности Docker и Kubernetes в облаке Amazon

Что такое Docker escape

Docker — самое популярное приложение для контейнеризации ПО. С технической точки зрения контейнер — это запущенный процесс (наподобие процессов в ОС), который изолирован от других процессов и имеет доступ к ресурсам компьютера.

Как и в любом другом ПО, в Docker есть всякие уязвимости. Одной из самых известных уязвимостей считается Docker escape (побег из Docker) или более распространенная формулировка — побег из Docker контейнера. Эта уязвимость позволяет получить доступ к основной (хостовой) ОС, тем самым совершая побег из контейнера Docker.

Впервые уязвимость была обнаружена июле 2019 года, экспертами ИБ Project Zero. Несмотря на то, что с момента выявления уязвимости уже прошло несколько лет, ее все еще можно реализовать. Упоминание атаки отсутствует и в официальном сайте и форуме Docker. Описание атаки предоставлено на сайте поиска уязвимостей Exploit DB.

Пример атаки Docker escape (побег из Docker-контейнера)

Кон­тей­нер Docker работа­ет в при­виле­гиро­ван­ном режиме, и у нас есть пра­ва рута, что поз­воля­ет нам вый­ти из кон­тей­нера на основной хост так­же в при­виле­гиро­ван­ном режиме. В этом нам помогут кон­троль­ные груп­пы Linux.

Cgroup, или «кон­троль­ная груп­па», в Linux — это груп­па про­цес­сов, для которой механиз­мами ядра наложе­на изо­ляция и уста­нов­лены огра­ниче­ния на некото­рые вычис­литель­ные ресур­сы (про­цес­сорные, сетевые, память, ввод‑вывод). Это как раз один из механиз­мов, с помощью которых Docker изо­лиру­ет кон­тей­неры.

Этот метод исполь­зует фун­кцию notify_on_release в cgroups v1, что­бы запус­тить опре­делен­ный код от име­ни поль­зовате­ля root. Дело в том, что, ког­да пос­ледняя задача в кон­троль­ной груп­пе покида­ет ее, на хос­те выпол­няет­ся коман­да, ука­зан­ная в фай­ле release_agent. Таким обра­зом пред­полага­ется сок­ратить чис­ло заб­рошен­ных кон­троль­ных групп. Эта коман­да при вызове запус­кает­ся на хос­те как поль­зователь с пол­ными при­виле­гиями.

Пер­вым делом нам нуж­но запус­тить новую коман­дную обо­лоч­ку.

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

Самый прос­той спо­соб добить­ся это­го — смон­тировать кон­трол­лер cgroup и соз­дать дочер­нюю cgroup. Для это­го мы соз­даем каталог /tmp/ralf, мон­тиру­ем кон­трол­лер cgroup RDMA и соз­даем дочер­нюю cgroup x.

За­тем акти­виру­ем уве­дом­ления кон­троль­ной груп­пы, записы­вая еди­ницу в ее файл notify_on_release. Так­же нас­тра­иваем cgroup RDMA для выпол­нения сце­нария /cmd. Путь к самому кон­тей­неру на основном хос­те берем из фай­ла /etc/mtab.

Ко­ман­ды из фай­ла /cmd будут выпол­нены в при­виле­гиро­ван­ном режиме на основном хос­те, поэто­му нуж­но выб­рать один из методов пер­систен­тнос­ти. К при­меру, уста­нов­ка бита SUID для фай­ла коман­дной обо­лоч­ки /bin/bash.

Пос­леднее дей­ствие — вызов триг­гера RDMA. Соз­дадим про­цесс, который немед­ленно завер­шится внут­ри дочер­ней кон­троль­ной груп­пы x. Для это­го запус­каем про­цесс bash и записы­ваем его PID в файл cgroup.procs.

Те­перь мы можем вер­нуть­ся на основной хост и про­верить пра­ва на файл /bin/bash.

Docker escape. Пра­ва на файл bash
Docker escape. Пра­ва на файл bash

S-бит уста­нов­лен, поэто­му запус­каем его и лег­ко получа­ем обо­лоч­ку в при­виле­гиро­ван­ном режиме.

Docker escape. Флаг рута
Docker escape. Флаг рута

За­бира­ем флаг рута, и машина зах­вачена!

РЕКОМЕНДУЕМ:

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *