Как дать скрипту права суперпользователя

Обновлено: 04.07.2024

Назначение прав доступа в ОС Linux является одним из самых важных аспектов обеспечения безопасности системы. Права доступа по сути являются почти последним оплотом, который может встать на пути злоумышленника, взломавшего вашу систему.

Может случиться так, что злоумышленнику, каким-либо способом, удастся подобрать пароль одного из пользователей вашей системы, но ему не удастся поживиться информацией из-за грамотно назначенных вами, прав доступа к файлам и каталогам с данными.

Права доступа - великолепный инструмент для того, чтобы оградить ваши данные от чужого доступа. Ознакомившись и, освоив работу с командой chmod, вы существенно пополните свой уровень знаний и обеспечите безопасность вашей системы.

Давайте посмотрим на содержимое каталога, выполнив команду ls -l. Опция "l" (от "long") позволяет вывести на экран содержимое текущего каталога с отображением информации о владельце, правах на файлы и другое.

Вот, к примеру, то, что мы увидим у себя на экране:


Права доступа для владельца

Итак, посмотрим на первую колонку данных, полученных после выполнения команды ls -l. Содержимое этой колонки содержит информацию о том, что перед нами - обычный файл (символ "-") или каталог (символ "d"). Последующие буквы говорят системе о том, какие права доступа назначены файлам.

Первые три символа, расположенные после типа файла, означают права доступа для пользователя-владельца этого файла или каталога.

Символ r означает право на чтение (от слова read) этого файла. Последующий за ней, символ w, означает, что вы можете изменять или записывать (от слова write) что-либо в этот файл. Кстати, это также означает, что вы можете и удалить этот файл. И последний символ - x, означает, что вы можете запустить на выполнение (от слова execute) этот файл.

Символ "-" в любом месте означает то, что вы не имеете соответствующих прав.


Как вы видите на примере, пользователь vasya (владелец всех этих файлов и каталогов) имеет право на их чтение и запись в них какой-либо информации. А также он может запустить на выполнение скрипт archive.sh и еще что-то выполняемое с названием patch.

Вы спросите - А что же означает символ x в правах доступа на каталог?! Запомните - символ x в правах доступа на каталог, означает право на выполнение поиска в этом каталоге.

Права доступа для группы

Следующие три символа, располагающихся после прав владельца, означают права доступа для группы.


Как вы видите из нашего примера, пользователи, входящие в группу users, не имеют права изменять содержимое скрипта archive.sh, а также файлов file2.txt, passwords.inf, patch и ticket.jpg. Также у них нет прав на добавление чего-либо в каталоги documents и mywork.

Зато они могут изменять файлы dest.jpg и report.html, а также запускать на выполнение скрипт archive.sh и выполнять поиск в каталогах documents и mywork.

Права доступа для остальных пользователей

Последние три символа означают всех остальных пользователей. Это могут быть пользователи других групп или любой человек из любой точки мира (при назначении прав на файлы/каталоги, доступных на web-серверах или других, открытых для всех, ресурсах).

В нашем случае всем остальным пользователям предоставлена возможность выполнять скрипты archive.sh и patch, а также предоставлена возможность доступа в каталоги documents и mywork.

Команда chmod

Мы используем команду chmod (от слов change mode) для назначения и изменения прав на доступ к файлам и каталогам. Команда chmod имеет не очень много ключей, но обладает широкими возможностями в плане назначения и изменения прав доступа.

Итак, посмотрим, каков же синтаксис этой команды:

chmod кому=права файл/каталог

и, разберем, что он значит:

здесь "кому" означает список тех, кому вы назначаете права доступа. А их немного:






















Символ Что означает
u Пользователь (user), который является владельцем файла
g Группа (group), которой принадлежит файл
o Остальные (other) пользователи
a Все (all) (заменяет сочетание символов ugo)

Думаю, что "права" вам уже знакомы - о них мы говорили чуть выше, но, позволю себе, напомнить их значение еще раз:














r Право на чтение (read) файла
w Право на запись (write) или удаление файла
x Право на выполнение (execute) или, если это относится к каталогу - на поиск в нем

Давайте рассмотрим несколько примеров, показывающих как меняются права доступа после выполнения команды chmod.

Исходные права: -rwxr-xr-x patch

Команда: chmod o=r patch

Результат: -rwxr-xr-- patch

В этом примере мы назначаем остальным пользователям право на чтение файла patch. Если до выполнения команды chmod, они имели более расширенные права (в нашем случае - чтение и выполнение), то после ее применения, пользователи будут лишены их и им будут назначены новые права

Исходные права: -rw-r----- passwords.inf

Команда: chmod g= passwords.inf

Результат: -rw------- passwords.inf

В этом примере мы лишаем права чтения группу, которой принадлежит файл password.inf, так как понимаем важность содержимого этого файла.

Исходные права: -rw-r--r-- file2.txt

Команда: chmod go=rw file2.txt

Результат: -rw-rw-rw- file2.txt

В этом примере мы делаем доступными, для группы и остальных пользователей, права доступа, разрешающие возможность чтения и изменения файла file2.txt.

Я надеюсь, что на этих примерах, вы поняли как работает команда chmod. Настало время немного вас удивить. Посмотрите на следующий пример:


Мы имеем два файла, со следующими правами доступа:

и нам необходимо лишить группу и остальных пользователей права запуска на выполнение этих файлов. Как быть?

На основе рассмотренных ранее примеров, вы можете предположить, что можно поступить следующим образом:

chmod go=r archive.sh patch

и, вы, несомненно, будете правы, но есть еще один вариант назначения прав доступа командой chmod, благодаря которому, вы увидите, что команда chmod горазда гибче в использовании. Все дело в том, что команда chmod позволяет "назначать" новые или "лишать" существующих прав при помощи знаков " " и "-" соответственно. Вот как можно поступить в нашем с вами случае:

chmod go-x archive.sh patch

И вот, что мы имеем:

Назначить остальным пользователям право изменение файлов можно таким способом:

chmod o w archive.sh patch

В итоге, результатом наших действий будет являться следующее:

Копирование прав доступа

При назначении прав, вам, возможно, пригодится удобная возможность команды chmod, позволяющая копировать права доступа.

К примеру, мы имеем файл с правами доступа, разрешающими чтение для всех и изменение только владельцу и группе:

Нам необходимо разрешить изменение файла остальным пользователям. Для этого мы поступаем следующим образом:

chmod o=u dest.jpg

указывая то, что остальным пользователям присваиваются те же права, что и владельцу.

Запомните! При назначении прав доступа, вы не можете комбинировать стандартные права доступа (символы "r", "w", "x") с опциями копированием прав (символ " center">Подмена идентификатора пользователя (Set UID)

Может случиться так, что в вашей работе встретится случай, когда необходимо разрешить одному из пользователей другой группы, выполнять ту или иную программу или скрипт, расположенные в каталоге пользователя из другой группы.

В домашнем каталоге пользователя vasya находится скрипт print_users.sh, который при запуске обращается к файлу base.dat. Эти файлы имеют следующие права доступа:

-rwx-r-xr-x vasya users print_users.sh

-rw------- vasya users base.dat

необходимо обеспечить доступ пользователю andrey (входящего в группу managers) к скрипту print_users.sh, разрешив выполнение этого скрипта.

Посмотрим как Linux будет выполнять действия, которые будут совершаться при попытке пользователя andrey запустить на выполнение скрипт print_users.sh с вышеуказанными правами:


















Выполняемые действия/задачи Linux определяет, что..
Andrey выполнил /home/vasya/print_users.sh Вы - пользователь andrey из группы managers.Вы попадаете в разряд "остальные пользователи", так как не входите в группу users.Вы хотите выполнить скрипт /home/vasya/print_users.shВам разрешено выполнять этот скрипт, согласно правам доступа на выполнение для "остальных пользователей".
Скрипт print_users.sh выполняется -
Скрипт запрашивает данные из /home/vasya/base.dat Вы - пользователь andrey из группы managers.
Вы попадаете в разряд "остальные пользователи", так как не входите в группу users.
Вы хотите прочитать данные из файла /home/vasya/base.datВам запрещено читать информацию из этого файла.

Как же быть? Скрипт запускается на выполнение, но при попытке прочитать данные из файла base.dat, останавливается с уведомлением о том, что вам запрещена такая операция.

Для решения этой проблемы пользователю vasya необходимо выполнить следующую команду:

chmod u s print_users.sh

она означает - "Добавить возможность "подмены" идентификатора пользователя при обращении к файлу print_users.sh". Вот как будут выглядеть права доступа после выполнения chmod u s :

-rwxsr-xr-x vasya users print_users.sh

-rw------- vasya users base.dat

Теперь посмотрим, как Linux будет выполнять действия, которые будут совершаться при попытке пользователя andrey снова запустить на выполнение скрипт print_users.sh:


















Выполняемые действия/задачи Linux определяет, что..
Andrey выполнил /home/vasya/print_users.sh Вы - пользователь andrey из группы managers. Вы попадаете в разряд "остальные пользователи", так как не входите в группу users.Вы хотите выполнить скрипт /home/vasya/print_users.shВам разрешено выполнять этот скрипт, согласно правам доступа на выполнение для "остальных пользователей".
Скрипт print_users.sh выполняется "Подмена" идентификатора пользователя.Согласно наличию s в правах доступа, подмена идентификатора успешно произведена.Теперь вы - пользователь vasya на все время выполнения этого скрипта.
Скрипт запрашивает данные из /home/vasya/base.dat Вы - пользователь vasya.Вы хотите прочитать данные из файла /home/vasya/base.dat.Вам разрешено читать информацию из этого файла.

Как вы поняли, пользователь vasya разрешил группе и остальным пользователям выполнение скрипта print_users.sh, с последующим чтением данных из файла base.dat. Заметьте, только для этого скрипта! Выполнение других (также работающих с данными файла base.dat и не имеющих прав с возможностью "подмены" идентификатора) скриптов, не позволит прочитать/извлечь данные их файла base.dat.

При работе с командой chmod и назначении прав доступа на файлы и каталоги будьте предельно осторожны в своих действиях. Помните, что неправильно назначенные права доступа (особенно права с возможностью "подмены" идентификатора пользователя/группы) могут привести к провоцированию взлома вашей системы злоумышленниками.

Права доступа в цифрах

Выше, мы с вами познакомились с "символьным" назначением прав доступа и, научились правильно применять его в различных ситуациях. Не думаю, что кому-то это было тяжелой задачей. Но есть факт, что подавляющее большинство профессионалов мира Linux используют не "символьное", а "цифровое" назначение прав. И это действительно так - есть и другой способ назначения и управления правами доступа, с которым мы и познакомимся.

К примеру, вы имеете в своем распоряжении файл test.py со следующими правами доступа:

- rwx r-x r-x test.py

для того, чтобы представить эти права в "цифровом виде", поставим под каждым назначенным правом цифру "1", а там, где права отсутствуют - цифру "0".

- r w x r - x r - x test.py

и смотрим получившееся по следующей таблице:






































Бинарное значение Значение прав доступа
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

Исходя из этой таблицы, мы можем видеть, что "цифровое" представление прав доступа файла test.py: 755.

Теперь, к примеру, если мы захотим лишить права остальных пользователей на выполнение файла test.py, нам необходимо будет выполнить команду:

chmod 754 test.py

7 - это права владельца файла - "rwx"

5 - права группы - "r-x"

4 - права для остальных пользователей - "r--"

Итак, мы довольно обширно рассмотрели команду chmod и возможные варианты назначения прав доступа к файлам и каталогам в системе Linux. Я надеюсь, что у вас не возникнет вопросов по этому материалу, но если вдруг они все же возникнут, то я буду рад вам помочь и подсказать.

Не новость что Linux является очень гибкой и настраиваемой системой. Благодаря этому он получает все большее распространение в сети. Но как и все остальные операционные системы, качество настройки и уровень безопасности системы зависит от квалификации администратора который занимается ее настройкой. Поэтому не редкость наличие различных дыр в системах безопасности. Как правило это простые дыры которые не дают полного доступа к системе. Но приложив усилия мы можем повысить привилегии и взломать Linux и получить ROOT!

Major Sudo flaw in Linux lets hackers run commands as Root | TechGig

В общем случае эскалация привилегий — это получение прав в системе выше, чем у тебя уже есть. Но чаще всего имеется в виду получение доступа к учетной записи root в Linux или system/administrator в Windows.

Почему становится возможным повысить права в системе, казалось бы призванной предотвращать подобное? Причин много. Вот, как мне кажется, основные:

  • уязвимости в приложениях/скриптах;
  • неверная конфигурация ОС и приложений;
  • забытые критически важные данные (пароли, логины, бэкапы и прочее);
  • уязвимости в ядре ОС.

Ну а основная причина всегда одна и та же — людские ошибки. В идеальной вселенной, скорее всего, повысить привилегии не удалось бы. Но человеческий фактор делает это возможным, поэтому наслаждаемся.

С чего начать?

Прежде чем что-то делать, нужно понять, с чем мы будем иметь дело. Конечно, кое-что мы узнаем о системе, изучив ее на этапе проникновения, но теперь нужно подробнее выяснить, что именно нам может помочь подняться до root.

Какие-то вещи мы можем узнать вручную. Например, получить сведения о ядре:

Или о процессоре:

Можно, конечно, и дальше собирать информацию с помощью терминала, но это долго. Гораздо проще и эффективнее использовать специальные тулзы. Самые распространенные из них:

Все они работают примерно по одному принципу: последовательно запускают команды bash или короткие скрипты, а вывод отправляют в stdout или лог-файл в зависимости от параметров.

Так примерно выглядит вывод подобной тулзы.

LinEnum

LinEnum

Куда смотреть?

Давай теперь разберем несколько примеров уязвимостей и посмотрим, как можно их эксплуатировать.

Всякое забытое

Первое, что стоит проверить, — это забытые критические данные. Ничего не стоит заглянуть в домашние папки юзеров и посмотреть, не хранит ли кто-то на рабочем столе файл с паролем или ключами от чего-нибудь нужного. Это случается редко, но все же случается. Иногда учетные данные хардкодят в скриптах и конфигах. Стоит также проверить историю шелла, там тоже могут найтись длинные команды, содержащие учетные данные. А иногда бывает, что пользователь набрал пароль, когда консоль его не запрашивала, и он тоже сохранится в истории.

SUID/GUID

Флаги setuid и setgid позволяют пользователю запускать программы от имени владельца. Например, когда надо запускать программу от рута, а пользователь рутом не является. Чаще всего встречается SUID. Устанавливается этот бит легко:

Подразумевается, что программа с таким флагом не сможет делать ничего, кроме того, для чего она предназначена. Но так как все мы люди и ошибаемся, то это хорошо порой ошибки позволяют скомпрометировать систему. Чаще всего к возможности повысить привилегии приводит возможность программы производить запись в файловую систему или каким-то образом выполнять код.

В первую очередь нас интересуют файлы, владелец которых — root. Найти их можно руками, такой командой:

Как вариант — можно поискать в выводе тулз, которые я перечислил выше. Так или иначе, если найдешь файлы с подобными разрешениями, значит, у тебя есть шанс подняться до максимальных привилегий.

Вот вывод таких файлов из LinEnum.sh .


Из интересных файлов — find . LinEnum даже услужливо его подсветил отдельно.


Это позволит довольно легко получить привилегии.


Linux capabilities

Так как предыдущий способ дает избыточные права файлам, в 1997 году была придумана идея дополнительных разрешений — linux capabilities. Если коротко, то идея состоит в том, чтобы давать не полные привилегии, а только часть, необходимую для выполнения задачи.

Как это используется? Для начала найдем подобные файлы в системе.

А вот результат.


Классический пример иллюстрации — это исполняемый файл tar с разрешением cap_dac_read_search+ep , которое позволяет ему читать любой файл в системе. Это означает, например, возможность получить архив с файлом /etc/shadow , который от лица обычного пользователя недоступен на чтение. Доступ к этому файлу даст нам хеши паролей, в том числе от root, который мы можем попробовать сбрутить.

Этот пример позволит нам прочитать файл /etc/shadow .



И прочитаем файл.


Далее мы можем просто сгенерить новый shadow и перезаписать им системный. Создадим новый хеш, заменим им хеш (в примере — восклицательный знак) и подготовим файл для заливки.



Копируем его в /etc/shadow и логинимся.


Cron — это служба Unix, которая используется для периодического выполнения скриптов. Действия описываются в файле /etc/crontab и в специальных каталогах (например, /etc/cron.daily ).


Скрипты используются для самого широкого спектра задач — от создания бэкапа по расписанию до очистки директории /tmp .

Программа sudo позволяет выполнять команды от имени суперпользователя (либо других пользователей системы). Ее конфиг находится в /etc/sudoers , и, как правило, ошибки в этом конфиге открывают возможности эскалации привилегий. Сценариев использования — множество, можно выбирать по ситуации. Один из таких вариантов ниже.

Проверяем, какие есть разрешения у sudo .


Здесь редактор vi можно открыть без пароля, и он запустится от имени root. В этом случае проще всего выполнить шелл через редактор, который тоже запустится от рута.


Иногда админы дают разрешение на запуск обычных скриптов sh, и те остаются доступными для записи. Их, конечно же, можно использовать для получения шелла и любых других действий.

Еще один способ абьюзить sudo — возможность внедряться в процесс с действующим токеном.

Эксплоиты для ядра

Как и в любой другой программе, в ядре Linux тоже есть уязвимости. Иногда эти уязвимости позволяют подняться до рута. Как и в остальных способах, здесь не существует универсального рецепта и успешная эксплуатация зависит от многих факторов: версии ядра, наличия необходимых разрешений или файлов и даже наличия нужного железа (например, уязвимого перед Meltdown процессора).

На скриншоте ниже — поиск эксплоитов для ядра Linux в Kali.


При многообразии вариантов эксплуатации не все они окажутся рабочими. Может не быть эксплоита под конкретное ядро, либо версия ядра правильная, но оно уже пропатчено. Некоторые эксплоиты работают нестабильно. И так далее.

Наверняка многие помнят уязвимость в ядре, известную как Dirty COW. Баг позволяет спровоцировать состояние гонки, а это приводит к тому, что пользователь без привилегий получает доступ на запись к memory mappings (хотя доступ должен быть только на чтение) и может повысить свои привилегии.

Существует несколько эксплоитов для этой уязвимости.


На конкретной системе будут работать не все из них, так что всегда есть смысл перебирать разные варианты.

Другие примеры уязвимостей для повышения привилегий:

Заключение

Способов стать рутом в Linux — множество, и я здесь прошелся только по самым очевидным и распространенным. Тем, что встречаются и в реальной жизни, и на CTF, и на экзаменах.

Вообще, зачастую это творческая задача: может не сработать ни один из способов, но поможет какая-то, порой неочевидная комбинация из разных. Универсального рецепта здесь нет, и систему всегда нужно анализировать всесторонне.

На сайте GTFOBins есть отличная подборка способов использовать разные популярные утилиты для повышения привилегий. Но помни: этот список на самом деле значительно больше, просто нам еще пока не все известно!

Читайте также: