Содержание статьи
Мы уже рассматривали, как можно поднять свои привилегии до системных в мире Windows. Как оказалось, вариантов для этого более чем достаточно. Что выбрать, зависит как от ситуации, так и от твоих предпочтений. Однако, как ты понимаешь, расширять свои полномочия приходится не только для окошек, но и для пингвинов. Какие здесь есть возможности? Ну что ж, давай посмотрим...
Prefase
Как ты помнишь (и как должен помнить каждый адекватный администратор), работать в линуксе под рутом категорически не рекомендуется. В идеальном мире ты должен использовать его только для конфигурирования сервера, установки и обновления ПО и прочих чисто административных задач. Вся беда в том, что мы живем в обычном мире, который очень далек от идеального. Поэтому такая ситуация все же иногда бывает. Правда, в большинстве случаев чисто из-за халатности, ибо так уж исторически сложилось, что пользователям линукса приходилось разбираться в том, как работает их операционная система. А хоть немного разбираясь в системе и ее механизмах безопасности, под рутом уже сидеть не будешь. Поэтому сегодня, в отличие от Windows, где мы говорили о получении системных привилегий из-под админа, будем рассматривать только варианты повышения привилегий от непривилегированного пользователя до рута. Итак, приступим.
Эксплойты
Все способы получения прав суперпользователя в Linux можно условно разделить на две категории. Первая — это как раз таки использование эксплойтов. В отличие от Windows, c ее механизмом автоматической установки обновлений, приверженцам пингвина приходится по большей части самостоятельно следить за выходом заплаток и их установкой. В связи с этим шанс встретить среди Linux-машин не пропатченную до конца систему гораздо выше. Какие преимущества данного метода можно выделить? Для начала — большинство эксплойтов используют уязвимости в ядре ОС, что позволяет получить максимальные привилегии. Найти код подходящего эксплойта не так сложно, и ты наверняка знаешь пару ресурсов. Плюс ко всему, чтобы воспользоваться сплоитом, подчас не требуется разбираться во всех тонкостях используемой уязвимости — достаточно просто правильно скомпилировать его и запустить (иногда, правда, приходится его немного кастомизировать, но довольно часто все будет работать и без подгонки напильником). В общем виде алгоритм действий выглядит следующим образом:
- Определить версию ядра и дистрибутива.
- Получить список доступных инструментов для сборки сплоита.
- Доставить сплоит на целевую машину.
- Скомпилировать (при необходимости) и запустить.
- Наслаждаться полученным root’ом.
Ну а теперь о каждом шаге более детально.
Идентификация
Судя по плану, сначала надо узнать, куда мы вообще попали, что за дистр используем и какова версия ядра. Версию ядра можно вытянуть с помощью всем известной команды uname -a
или ее аналогов. Для того же, чтобы получить информацию об используемом дистрибутиве, надо глянуть в файлик *-release
, лежащий в каталоге etc
(в зависимости от дистра он может называться по-разному: lsb-release
в Ubuntu, redhat-release
в Red Hat / CentOS и так далее):
cat /etc/*-release
Зная дистрибутив и версию ядра, можно заняться вторым этапом — поиском подходящей «отмычки».
Поиск эксплойта
Как только вся необходимая информация окажется на руках, настанет время искать подходящий эксплойт. Первое, что приходит на ум, — это exploit-db.com, но есть и альтернативы: 1337day, SecuriTeam, ExploitSearch, Metasploit, securityreason, seclists. В конце концов, есть гугл, он точно знает о сплоитах больше всех. Забегая немного вперед, скажу: иногда по какой-либо причине «отмычка» может не работать или же ее надо немного адаптировать под определенные условия или свои нужды, то есть пройтись по ней напильником. В таком случае не помешает выудить о ней дополнительную информацию, которую можно почерпнуть на одном из следующих ресурсов:
www.cvedetails.com
packetstormsecurity.org
cve.mitre.org
Итак, допустим, ты нашел подходящий эксплойт, который дарует тебе пропуск в мир рута. Осталось только как-то переправить его на машину.
Доставка на дом
Для того чтобы доставить сплоит на место, существует достаточно много способов, от всем известных cURL/wget, Netcat, FTP, SCP/SFTP, SMB до использования DNS TXT записей. Чтобы выяснить, какие из данных инструментов у нас представлены, выполняем:
find / -name wget
find / -name nc*
find / -name netcat*
find / -name tftp*
find / -name ftp
Допустим, у нас нашелся Netcat. Для передачи файла с его помощью на принимающей стороне запускаем:
nc -l -p 1234 > out.file
То есть слушаем порт 1234. На отправляющей выполняем следующее:
nc -w 3 [destination] 1234 < out.file
Если передача происходит с *nix- на *nix-систему, то есть там и там есть стандартные утилиты, то для ускорения процесса передачи можно воспользоваться сжатием. В таком случае команды будут выглядеть так:
nc -l -p 1234 | uncompress -c | tar xvfp - // для получения
tar cfp - /some/dir | compress -c | nc -w 3 [destination] 1234 // для отправки
Остальные варианты еще проще, так что не станем рассматривать использование wget, FTP и прочих общеизвестных методов.
Прятки
Хорошо, как доставить, разобрались. Но как при этом не спалиться? Если твой сплоит обнаружат, будь уверен, что лазейку быстро прикроют. Так что размещать его, компилировать и запускать надо из какого-то неприметного места. В линуксе директории, начинающиеся с точки (например, .secret_folder
), являются скрытыми. Поэтому логично было бы их использовать для сокрытия своей активности. Например, поместить в них код эксплойта: /tmp/.nothingthere/exploit.c
. Правда, в таком случае надо сначала убедиться, что tmp
смонтирована без опции noexec
и из нее можно будет запустить собранный сплоит (для этого воспользуйся командой mount
).
Сборка и запуск сплоита
Как только мы доставили и разместили сплоит, его надо будет собрать/настроить. Как правило, сплоиты пишутся на С либо на одном из скриптовых языков Python/Perl/PHP. Постоянные читатели ][ знают, что оставлять на своем сервере компилятор — не самое лучшее решение, поэтому обычно его выпиливают. Если на твой вопрос о версии компилятора gcc -v
bash ругнется gcc: command not found
, значит, тебе «повезло» и придется идти в обход. То есть либо искать сплоит на питоне, перле или чем-то еще, либо компилить его на виртуальной машине с аналогичной ОС и версией ядра. После чего переместить полученный исполняемый файл на целевой хост (правда, стопроцентной работы этот способ не гарантирует, сплоит может упасть и обрушить систему, так что поаккуратнее тут). Однако, как показывает практика, интерпретатор для одного из упомянутых языков все же должен присутствовать в системе. Так что не следует сразу опускать руки, вместо этого проверяем все варианты:
find / -name perl*
find / -name python*
find / -name gcc*
find / -name cc
В случае успеха тебе останется только запустить скомпилированный эксплойт и наслаждаться повышением. Ну или же разбираться, почему он не сработал, тут как повезет.
Противодействие сплоитам
Какие-то новаторские рецепты тут придумать сложно. Все и так давно известно. Надо просто вовремя устанавливать заплатки. Это первое. Второе — ограничить места, откуда можно запускать на исполнение файлы (папку tmp уж точно следует лишить данной возможности). Ну и применить какое-нибудь защитное решение, например grsecurity.
Права, файлы, пути и конфиги
Вторая категория, которую можно выделить в поднятии привилегий, — это способы, не связанные с использованием эксплойтов, а основанные на поиске файлов с некорректно выставленными правами. Здесь, как и в случае с Windows, есть свои хитрости, но в основном это все та же работа по сбору и анализу данных. Обычно первым делом ищутся файлы, которые доступны всем на чтение и запись:
find / -perm 2 ! -type l -ls
Таких может оказаться достаточно большое число, и среди них можно найти что-нибудь интересное: конфигурационные файлы, исходники сайтов/приложений, скрипты, запускаемые init’ом или cron’ом. В принципе, ситуация, когда файл доступен всем на чтение и запись, — это нормальное явление. Проблемы возникают, когда пользователи/администраторы/скрипты начинают бездумно менять разрешения. Поэтому, когда ты изменяешь разрешения, старайся избегать использования chmod 777
. Ну и проводи периодический аудит, чтобы важные файлы не оказались доступны всем подряд.
Setuid + setgid
Как гласит документация, setuid и setgid являются флагами прав доступа, которые позволяют запускать исполняемые файлы с правами владельца или группы исполняемого файла (обычно root’а). Такие исполняемые файлы, запущенные с повышенными привилегиями, могут получать доступ к более привилегированной информации. Например, в случае установки setuid на команду ls ты получишь возможность просматривать содержимое директорий, доступ в которые тебе изначально был запрещен. А в случае vim — править конфигурационные файлы, в которые до этого не имел права заглядывать.
Соответственно, если в приложениях с установленным setuid/setgid-флагом, присутствуют такие уязвимости, как buffer overflow или command injection, то атакующий может выполнить произвольный код с повышенными привилегиями. Поэтому следующим вариантом обычно ищут исполняемые файлы с данными флагами.
sudo find / -xdev \(-perm 4000\) -type f -print0 -exec ls -s {} \;
В принципе, можно и без sudo, это необходимо лишь для того, чтобы проверить директории, к которым у тебя нет доступа.
Обычно существует три варианта дальнейшего использования таких исполняемых файлов. Первый — попытаться поднять привилегии, опираясь на функционал, предоставляемый этим приложением (вернее, придумать свой способ необычного использования этого функционала). Второй вариант — найти публичный сплоит или провести самостоятельный фаззинг с целью выявления багов. Третий — command injection. Универсального рецепта нет, все зависит от ситуации.
SUDO
Команда sudo (substitute user and do), что дословно означает «подменить пользователя и выполнить», позволяет делегировать те или иные привилегированные ресурсы пользователям с ведением протокола работы. То есть предоставляет пользователям возможность выполнять команды от имени root’а (либо других юзеров), используя свой собственный пароль, а не пароль рута. Правила для принятия решений о предоставлении доступа находятся в файле /etc/sudoers
. Подробнее о формате этого файла и задании правил ты можешь посмотреть в официальном мануале или Википедии. Я лишь скажу, что этот файл также необходимо тщательно проверять. Потому как часто бывает, что некоторые приложения при установке его изменяют, и притом не в лучшую сторону. В результате чего у пользователей появляется возможность поднять свои привилегии (пост на Offensive security, повествующий о таком случае).
PATH
Как и на винде, в линуксе некорректно настроенные пути также помогут поднять свои привилегии. Обычно такое случается с переменной окружения PATH
(используй printenv
для ее просмотра). Посмотрел? Отлично, а теперь скажи: что, если переменная окружения PATH
будет начинаться с .
(.:/bin:/usr/sbin ....
)? Обычно так делают пользователи, которые не хотят набирать два лишних символа, то есть хотят вызывать команду так: $ program
вместо $ ./program
. Добавление .
в PATH
означает возможность выполнять файлы/скрипты из рабочей директории. Добавить ее можно следующим образом:
PATH=.:${PATH}
export PATH
А теперь представим ситуацию, что у нас есть два пользователя: Джо (атакующий) и Боб. Джо знает, что у Боба есть sudo-привилегии на изменение паролей пользователей, в том числе и рута. Кроме того, Боб ленив и добавил .
в переменную окружения PATH
. Хитрый Джо пишет программу, которая будет менять пароль рута, называет ее ls
и кладет в папку, куда любит заглядывать Боб. Теперь, когда последний зайдет в папку и захочет посмотреть ее содержимое, выполнится программа, которую написал Джо, и пароль рута будет изменен. Поэтому всегда проверяем переменные окружения на наличие интересных вещей, а для себя делаем следующие выводы:
- Никогда не используем
.
в переменнойPATH
. - Если точка там все-таки присутствует, размещаем следующую строку в
.bashrc
или.profile
:
PATH= echo $PATH | sed -e 's/::/:/g; s/:.:/:/g; s/:.$//; s/^://'
Инструменты
Для автоматизации поиска слабых мест можно воспользоваться следующими тулзами:
1. LinEnum — bash-скрипт, который сделает всю грязную работу за тебя, выполняя все проверки, описанные в данном cheat sheet’e. Всего в его арсенале около 65 различных проверок, начиная от получения информации о версии ядра и заканчивая поиском потенциально интересных SUID/GUID-файлов. Кроме того, скрипту можно передать ключевое слово, которое он будет искать во всех конфигурационных и лог-файлах. Запускается проверка следующим образом: ./LinEnum.sh -k keyword -r report -e /tmp/ -t
. После того как сканирование завершится, тебе будет представлен довольно подробный отчет, наиболее интересные места которого будут подсвечены желтым цветом.
2. LinuxPrivChecker — Python-скрипт, который также пригодится в поиске потенциальных вариантов для повышения привилегий. В общем-то, он выполняет все те же стандартные вещи: проверку привилегий, получение информации о системе... Но основная его фишка в том, что по завершении проверки он предложит тебе список эксплойтов, которые, по его мнению, помогут поднять привилегии. Такой вот молодец :).
3. unix-privesc-check — данный скрипт позволяет искать варианты для прокачки привилегий не только в Linux, но также и в Solaris, HPUX, FreeBSD. Он старается обнаружить ошибки конфигурации, которые позволили бы непривилегированному пользователю подняться в системе.
4. g0tmi1k’s Blog — а это блог, в котором хорошо описаны все те проверки, что выполняются тремя названными инструментами. Так что настоятельно рекомендую заглянуть туда и познакомиться, чтобы представлять, как работают эти инструменты «изнутри».
Afterword
Как ты убедился, в мире Linux с поднятием привилегий все тоже достаточно обыденно. Секрет успеха прост: для того, чтобы добиться своей цели, надо быть терпеливым и знать, где искать и что искать. Куда смотреть, ты теперь знаешь, какие утилиты задействовать для автоматизации — тоже, так что теперь тебе под силу покорить не только win-, но и nix-систему. Дерзай!