Задания Cron и планировщик задач

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

Введение

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

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

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

Перечисление заданий Cron

На этом этапе вы узнаете, как перечислять системные задания Cron. Cron — это планировщик задач, основанный на времени, в Unix-подобных операционных системах. Системные администраторы используют его для планирования задач (команд или shell-скриптов), которые должны выполняться периодически в фиксированное время, даты или с определенными интервалами.

Системные задания cron часто определяются в файле /etc/crontab или в каталоге /etc/cron.d/. Эти файлы конфигурации определяют расписание, учетную запись пользователя, от имени которой должна выполняться команда, и саму команду.

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

Давайте проверим каталог /etc/cron.d/, чтобы узнать, есть ли там какие-либо пользовательские запланированные задачи. Используйте команду cat для чтения содержимого файла задания cron для обслуживания.

cat /etc/cron.d/maintenance

Вывод:

* * * * * root /usr/local/bin/maintenance.sh

Вывод показывает задание cron, запланированное на выполнение каждую минуту, на что указывают пять звездочек (* * * * *). Оно настроено на запуск от имени пользователя root и выполняет bash-скрипт, расположенный по адресу /usr/local/bin/maintenance.sh.

Поиск скриптов с правами на запись

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

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

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

Давайте проверим права доступа к файлу скрипта обслуживания с помощью команды ls с флагом -l для подробного списка.

ls -l /usr/local/bin/maintenance.sh

Вывод:

-rwxrwxrwx 1 root root 78 Oct 10 10:00 /usr/local/bin/maintenance.sh

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

Внедрение команды от имени root

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

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

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

echo "id > /home/labex/project/cron_pwned.txt" >> /usr/local/bin/maintenance.sh

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

tail -n 2 /usr/local/bin/maintenance.sh

Вывод:

echo "Maintenance run at $(date)" >> /var/log/maintenance.log
id > /home/labex/project/cron_pwned.txt

Ожидание выполнения задачи от имени root

На этом этапе вы будете ждать, пока задание cron выполнит вашу внедренную полезную нагрузку.

Задание cron выполняется раз в минуту. Когда оно запустится, оно выполнит команду id от имени root и сохранит вывод в ~/project/cron_pwned.txt.

Подождите до 60 секунд, а затем прочитайте файл с результатом:

cat /home/labex/project/cron_pwned.txt

Если эксплойт сработал правильно, вы увидите вывод, похожий на этот:

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

Поздравляем. Вы успешно перехватили задание cron для выполнения команд от имени root.

Резюме

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