Системная переменная PATH


Основы Linux

До сих пор Вы запускали команды несколькими способами:

  • Через абсолютный путь (например, /challenge/run).
  • Через относительный путь (например, ./run).
  • Просто по имени команды (например, ls).

Первые два случая — с абсолютным и относительным путём — довольно просты: файл run находится в директории /challenge, и оба варианта указывают именно на него (при условии, конечно, что относительный путь вызывается из текущей рабочей директории /challenge). Но как быть с последним случаем?

Где находится программа ls? Откуда оболочка знает, где её искать? В этом модуле мы приоткроем завесу тайны и ответим на этот вопрос!

Оказывается, ответ на вопрос «Как оболочка находит ls?» довольно прост. Существует специальная переменная оболочки под названием PATH, в которой хранится набор путей к директориям, где оболочка ищет программы, соответствующие командам. Если очистить эту переменную, многое перестаёт работать:

hacker@path:~$ ls
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos
hacker@path:~$ PATH=""
hacker@path:~$ ls
bash: ls: No such file or directory
hacker@path:~$

Без переменной PATH bash не может найти команду ls.


На этом уровне Вы нарушите работу программы /challenge/run. Эта программа ПРОБУЕТ УДАЛИТЬ файл с флагом с помощью команды rm. Однако если программа не сможет найти команду rm, флаг не будет удалён, и задание отдаст его Вам. Таким образом, Вам нужно сделать так, чтобы /challenge/run тоже не смог найти команду rm!

Помните: если у Вас не получится и флаг будет удалён, Вам придётся перезапустить задание, чтобы попробовать снова.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Итак, мы убедились, что при очистке переменной PATH многое перестаёт работать. Но можно ли использовать PATH для чего-то полезного?

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

hacker@path:~$ ls /home/hacker/scripts
goodscript	badscript	okayscript
hacker@path:~$ goodscript
bash: goodscript: command not found
hacker@path:~$ /home/hacker/scripts/goodscript
ДА! Это лучший скрипт!
hacker@path:~$

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

hacker@path:~$ PATH=/home/hacker/scripts
hacker@path:~$ goodscript
ДА! Это лучший скрипт!
hacker@path:~$

На этом уровне /challenge/run запустит команду win по её имени, однако эта команда находится в директории /challenge/more_commands/, которая изначально не входит в PATH. Команда win — это единственное, что нужно /challenge/run, так что Вы можете просто перезаписать PATH, указав только эту директорию.

Удачи!

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Когда Вы вводите имя команды, на самом деле выполняется что-то, что находится в одной из множества директорий, перечисленных в переменной $PATH (разумеется, если эта команда не встроена в оболочку). Но какой именно файл? Узнать это можно с помощью команды с говорящим названием which.

Пример использования which:

hacker@path:~$ which cat
/bin/cat
hacker@path:~$ /bin/cat /flag
ФЛАГ
hacker@path:~$

Повторяя то, что делает оболочка при поиске команд, which последовательно просматривает каждую директорию в $PATH и выводит первый найденный файл, имя которого совпадает с переданным аргументом.


В этом задании мы разместили команду win где-то в системе сослались на нее в переменной $PATH, но сама по себе команда win не даст Вам флаг. win находится в той же директории, что и файл flag, доступ на чтение к которому мы Вам предоставили.

Вам нужно найти win (с помощью команды which) и вывести флаг командой cat из этой же директории.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Вспомните наш пример из предыдущего уровня:

hacker@path:~$ ls /home/hacker/scripts
goodscript	badscript	okayscript
hacker@path:~$ PATH=/home/hacker/scripts
hacker@path:~$ goodscript
ДА! Это лучший скрипт!
hacker@path:~$

Здесь мы видим, как пользователь hacker делает оболочку удобнее для себя, добавляя в неё собственные команды. Со временем Вы можете накопить собственный набор полезных инструментов. Давайте попрактикуемся в конфигурации линукс "для себя", начнём с команды win.

Ранее команда win, которую запускал /challenge/run, хранилась в директории /challenge/more_commands. На этот раз команды win не существует! Вспомните последний уровень модуля Объединение команд и создайте shell-скрипт с именем win, добавьте путь к нему в PATH и сделайте так, чтобы /challenge/run мог его найти.


ПОДСКАЗКА: /challenge/run запускается от имени root и вызывает win. Таким образом, команда win может просто вывести содержимое файла с флагом с помощью cat. Опять же, команда win — это единственное, что нужно /challenge/run, так что Вы можете просто перезаписать PATH, указав только эту директорию.

Но помните: если Вы так сделаете, Ваша команда win не сможет найти команду cat!

Есть три способа избежать этой проблемы:

  1. Выяснить, где на файловой системе находится программа cat. Она обязательно должна находиться в одной из директорий, перечисленных в переменной PATH, так что Вы можете вывести значение этой переменной (вспомните, как это сделать, обратившись к разделу Переменные окружения), пройти по перечисленным в ней директориям (напомним, что записи разделяются символом :), найти ту, в которой находится cat, и запустить cat, указав абсолютный путь к найденному файлу.
  2. Задать PATH так, чтобы в нём остались старые директории и добавилась новая запись — для той директории, в которой Вы создадите win.
  3. Использовать команду read (снова обратитесь к разделу Переменные окружения) для чтения файла /flag. Поскольку read — это встроенная функциональность bash, манипуляции с PATH на неё не влияют.

Теперь запустите win!

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

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

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

Как же тогда получить /flag?

  1. Вы знаете, что /challenge/run запускат команду rm, которая ищется в директориях перечисленных в переменной PATH.
  2. У Вас уже есть опыт создания команды win, когда это потребовалось в предыдущем задании.

Что ещё Вы можете создать, чтобы изменить логику?

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college