Эксплуатация некорректно настроенных прав sudoers

LinuxBeginner
Практиковаться сейчас

Введение

В системах Linux команда sudo позволяет обычным пользователям запускать программы с правами безопасности другого пользователя, как правило, администратора root. Системные администраторы часто настраивают файл /etc/sudoers так, чтобы разрешить определенным пользователям запускать конкретные команды от имени root без ввода пароля. Обычно это делается для удобства, например, чтобы позволить разработчику перезапустить веб-сервер или выполнить поиск файлов по всей системе.

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

Однако такие благие административные «сокращения» могут привести к серьезным уязвимостям. Если пользователю разрешено запускать бинарный файл, способный выполнять другие команды или открывать оболочку (например, find, vim или awk), злоумышленник может воспользоваться этим разрешением, чтобы выйти за рамки ограниченной команды и получить полноценную оболочку root. Этот метод обычно называют «shell escape» или эксплуатацией через «GTFOBins».

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

Проверка прав Sudo (sudo -l)

На этом этапе вы узнаете, как перечислить привилегии sudo, назначенные вашей текущей учетной записи.

При оценке системы Linux на предмет возможностей повышения привилегий одной из первых проверок является выяснение того, какие команды текущий пользователь может запускать от имени root. Команда sudo имеет встроенный флаг -l (list), который отображает разрешенные и запрещенные команды для вызывающего пользователя.

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

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

Выполните следующую команду, чтобы вывести список ваших привилегий sudo и сохранить результат в файл sudo_privs.txt:

sudo -l > /home/labex/project/sudo_privs.txt

Теперь давайте просмотрим содержимое созданного файла, чтобы проанализировать права доступа:

cat /home/labex/project/sudo_privs.txt

Вы должны увидеть вывод, похожий на следующий:

Matching Defaults entries for labex on this host:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User labex may run the following commands on this host:
    (root) NOPASSWD: /usr/bin/find

В некоторых средах могут отображаться дополнительные записи sudo помимо правила для find. В рамках этой лабораторной работы сосредоточьтесь на строке, которая явно разрешает пользователю labex запускать /usr/bin/find от имени root без ввода пароля (NOPASSWD). Именно на этой конфигурации мы и сосредоточимся в следующих шагах.

Анализ разрешенных бинарных файлов на возможность выхода в оболочку

На этом этапе вы проанализируете бинарный файл /usr/bin/find, чтобы понять, как его можно использовать для выполнения произвольных команд.

Команда find — это мощная утилита, используемая для поиска файлов и директорий в иерархии файловой системы. Однако она включает в себя очень гибкий параметр под названием -exec. Флаг -exec позволяет пользователю выполнять указанную команду для каждого файла, который находит find.

Проблема не в том, что find вредоносен. Проблема в его функциональности. Любой мощный бинарный файл, работающий с правами root, является кандидатом на использование для выхода в оболочку, если он не ограничен жесткими рамками.

Критическая уязвимость безопасности возникает, когда find запускается через sudo. Если find работает от имени root, любая команда, переданная параметру -exec, также будет выполнена с правами root.

Давайте проверим эту теорию, используя параметр -exec для запуска команды whoami. Команда whoami просто выводит эффективное имя пользователя. Мы перенаправим вывод в файл, чтобы подтвердить контекст выполнения.

Выполните следующую команду:

sudo find . -exec whoami \; -quit > /home/labex/project/whoami.txt

Давайте разберем эту команду. Часть sudo find . запускает команду find от имени root, начиная поиск в текущей директории (.). Сегмент -exec whoami \; указывает find выполнить команду whoami, где \; необходимо для завершения выражения -exec. Наконец, флаг -quit дает команду find немедленно завершить работу после обработки первого совпадения, что предотвращает многократный запуск whoami для каждого файла в директории.

Теперь проверьте содержимое выходного файла:

cat /home/labex/project/whoami.txt

Вы должны увидеть следующий вывод:

root

Это подтверждает, что команда, переданная в -exec, была успешно выполнена с привилегиями root.

Выполнение бинарного файла с помощью Sudo

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

Одним из самых чувствительных файлов в системе Linux является /etc/shadow. Этот файл содержит зашифрованные хеши паролей для всех учетных записей пользователей в системе. Обычные пользователи не имеют прав на чтение этого файла. Если злоумышленник может прочитать этот файл, он может попытаться взломать хеши паролей в автономном режиме.

Поскольку мы доказали, что можем выполнять произвольные команды от имени root с помощью sudo find, мы можем использовать этот метод для чтения содержимого /etc/shadow.

Мы будем использовать команду head внутри нашего выражения -exec, чтобы прочитать только первую строку файла shadow (которая обычно содержит хеш пользователя root) и сохранить ее в директории нашего проекта.

Выполните следующую команду:

sudo find /etc/shadow -exec head -n 1 {} \; -quit > /home/labex/project/shadow_head.txt

В этой команде {} выступает в качестве заполнителя, который find заменяет именем файла, который он обрабатывает в данный момент (в данном случае /etc/shadow).

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

cat /home/labex/project/shadow_head.txt

Вы должны увидеть вывод, похожий на этот, отображающий запись пользователя root из файла shadow:

root:*:19711:0:99999:7:::

Вы успешно обошли права доступа к файловой системе, злоупотребив некорректно настроенной записью sudo.

Запуск оболочки Root

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

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

Чтобы достичь этого, вместо передачи простой команды, такой как whoami или head, параметру -exec, мы можем передать путь к исполняемому файлу оболочки, например /bin/bash.

В реальном сценарии злоумышленник запустил бы sudo find . -exec /bin/bash \; -quit, чтобы сразу попасть в интерактивный терминал root. Однако для целей этой автоматизированной лабораторной среды переход в интерактивную оболочку приостановил бы выполнение лабораторной работы.

Вместо этого мы запустим оболочку bash от имени root в неинтерактивном режиме, используя флаг -c. Это позволит нам передать команду непосредственно новой оболочке root, выполнить ее и сохранить доказательство полного компромисса системы. Мы будем использовать команду id, которая предоставляет подробную информацию об идентификаторе текущего пользователя и его членстве в группах.

Выполните следующую команду, чтобы запустить оболочку root и записать вашу личность:

sudo find . -exec /bin/bash -c "id > /home/labex/project/pwned.txt" \; -quit

Наконец, прочитайте файл pwned.txt, чтобы подтвердить окончательное повышение привилегий:

cat /home/labex/project/pwned.txt

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

uid=0(root) gid=0(root) groups=0(root)

Поздравляем! Вы успешно использовали некорректно настроенный файл sudoers для повышения своих привилегий от обычного пользователя до root.

Резюме

В этой лабораторной работе вы изучили риски безопасности, связанные с некорректно настроенными файлами sudoers в средах Linux. Вы начали с перечисления привилегий sudo вашей учетной записи и обнаружили, что бинарный файл find можно запускать от имени root без пароля. Поняв функциональность параметра -exec команды find, вы смогли выполнять произвольные команды с привилегиями root. Вы продемонстрировали влияние этой уязвимости, прочитав ограниченные системные файлы и, в конечном итоге, запустив оболочку root для достижения полного компромисса системы. Это упражнение подчеркивает важность соблюдения принципа наименьших привилегий и тщательного аудита конфигураций sudo для предотвращения несанкционированного повышения привилегий.