Мы уже рассматривали, как можно поднять свои привилегии до системных в мире Windows. Как оказалось, вариантов для этого более чем достаточно. Что выбрать, зависит как от ситуации, так и от твоих предпочтений. Однако, как ты понимаешь, расширять свои полномочия приходится не только для окошек, но и для пингвинов. Какие здесь есть возможности? Ну что ж, давай посмотрим…

 

Prefase

Как ты помнишь (и как должен помнить каждый адекватный администратор), работать в линуксе под рутом категорически не рекомендуется. В идеальном мире ты должен использовать его только для конфигурирования сервера, установки и обновления ПО и прочих чисто административных задач. Вся беда в том, что мы живем в обычном мире, который очень далек от идеального. Поэтому такая ситуация все же иногда бывает. Правда, в большинстве случаев чисто из-за халатности, ибо так уж исторически сложилось, что пользователям линукса приходилось разбираться в том, как работает их операционная система. А хоть немного разбираясь в системе и ее механизмах безопасности, под рутом уже сидеть не будешь. Поэтому сегодня, в отличие от Windows, где мы говорили о получении системных привилегий из-под админа, будем рассматривать только варианты повышения привилегий от непривилегированного пользователя до рута. Итак, приступим.

 

Эксплойты

Все способы получения прав суперпользователя в Linux можно условно разделить на две категории. Первая — это как раз таки использование эксплойтов. В отличие от Windows, c ее механизмом автоматической установки обновлений, приверженцам пингвина приходится по большей части самостоятельно следить за выходом заплаток и их установкой. В связи с этим шанс встретить среди Linux-машин не пропатченную до конца систему гораздо выше. Какие преимущества данного метода можно выделить? Для начала — большинство эксплойтов используют уязвимости в ядре ОС, что позволяет получить максимальные привилегии. Найти код подходящего эксплойта не так сложно, и ты наверняка знаешь пару ресурсов. Плюс ко всему, чтобы воспользоваться сплоитом, подчас не требуется разбираться во всех тонкостях используемой уязвимости — достаточно просто правильно скомпилировать его и запустить (иногда, правда, приходится его немного кастомизировать, но довольно часто все будет работать и без подгонки напильником). В общем виде алгоритм действий выглядит следующим образом:

  1. Определить версию ядра и дистрибутива.
  2. Получить список доступных инструментов для сборки сплоита.
  3. Доставить сплоит на целевую машину.
  4. Скомпилировать (при необходимости) и запустить.
  5. Наслаждаться полученным 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 и кладет в папку, куда любит заглядывать Боб. Теперь, когда последний зайдет в папку и захочет посмотреть ее содержимое, выполнится программа, которую написал Джо, и пароль рута будет изменен. Поэтому всегда проверяем переменные окружения на наличие интересных вещей, а для себя делаем следующие выводы:

  1. Никогда не используем . в переменной PATH.
  2. Если точка там все-таки присутствует, размещаем следующую строку в .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 — а это блог, в котором хорошо описаны все те проверки, что выполняются тремя названными инструментами. Так что настоятельно рекомендую заглянуть туда и познакомиться, чтобы представлять, как работают эти инструменты «изнутри».

Основные опции LinEnum
Основные опции LinEnum

 

unix-privesc-check предлагает на выбор всего две опции
unix-privesc-check предлагает на выбор всего две опции
LinuxPrivChecker содержит большой список эксплойтов, который постоянно пополняется с Exploit Database

 

 

Afterword

Как ты убедился, в мире Linux с поднятием привилегий все тоже достаточно обыденно. Секрет успеха прост: для того, чтобы добиться своей цели, надо быть терпеливым и знать, где искать и что искать. Куда смотреть, ты теперь знаешь, какие утилиты задействовать для автоматизации — тоже, так что теперь тебе под силу покорить не только win-, но и nix-систему. Дерзай!

Антон Жуков

Редактор рубрики «ВЗЛОМ»

3 комментария

  1. 24.02.2015 at 10:28

    Мог бы и о ShellShok пару слов сказать…

  2. 24.02.2015 at 14:15

    цитата:

    «В отличие от Windows, c ее механизмом автоматической установки
    обновлений, приверженцам пингвина приходится по большей части
    самостоятельно следить за выходом заплаток и их установкой. В связи с
    этим шанс встретить среди Linux-машин не пропатченную до конца систему
    гораздо выше»

    )))))))))
    дальше читать не стал )))

    • 26.02.2015 at 22:01

      +1 тоже угорел)
      да в Linux самая грамотная система обновлений из всех ОС (хотя не знаю что там под Mac, но учитывая ее «фряшность», должно быть что-то похожее).

Оставить мнение

Check Also

Удаленное удаление. Как захватить контроль над WordPress, заставив его стереть файл

В WordPress, самой популярной в мире системе публикации, была обнаружена серьезная уязвимо…