О путях в Linux


Основы Linux

Этот модуль познакомит Вас с основами путей к файлам в Linux.

Файловая система Linux устроена в виде «дерева». У этого дерева есть корень (обозначается как /). Корень файловой системы является каталогом, и каждый каталог может содержать другие каталоги и файлы.

Большинство систем содержит следующие каталоги:

  • / — корневой каталог (root), верхний уровень файловой системы.
  • /bin — основные пользовательские программы и утилиты (например, ls, cp, mv).
  • /sbin — системные утилиты для администратора (например, инструменты настройки сети).
  • /usr — программы и библиотеки для пользователей, документация, общие данные.
  • /var — изменяемые данные: логи, очереди печати, почта, базы данных и т.п.
  • /etc — системные конфигурационные файлы и настройки служб.
  • /home — домашние каталоги обычных пользователей.
  • /root — домашний каталог суперпользователя root.
  • /lib и /lib64 — системные библиотеки, необходимые для работы программ в /bin и /sbin.
  • /tmp — временные файлы, обычно очищаются при перезагрузке.
  • /dev — файлы устройств (диски, терминалы, и т.д.).
  • /proc — виртуальная файловая система с информацией о процессах и ядре.
  • /sys — интерфейс к различным подсистемам ядра и устройствам.
  • /boot — файлы загрузчика и ядра, необходимые для старта системы.
  • /media и /mnt — точки монтирования внешних и дополнительных файловых систем.
  • /opt — дополнительные, обычно сторонние, приложения.

К файлам и каталогам Вы обращаетесь по их пути. Путь от корня файловой системы начинается с символа / (то есть с корневого каталога) и описывает последовательность каталогов, в которые необходимо «спуститься», чтобы найти файл. Каждый элемент пути отделяется очередным символом /.

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

Файловая система начинается с корня - /. Под ним расположено множество других каталогов, конфигурационных файлов и программ.

В данном исмпытании мы добавили программу непосредственно в корневой каталог /; она называется start и выдаёт флаг.
Всё, что требуется от Вас в этом уровне, — запустить эту программу.

Вы можете запустить программу, указав её путь в командной строке. В данном случае Вы будете использовать полный путь, начиная с /, поэтому путь к программе будет /start.

ВАЖНО: Такой тип пути, который начинается с корневого каталога, называется «абсолютным путём».

Запустите задание, откройте терминал, выполните программу start, указав её абсолютный путь, и захватите флаг.

Желаем успехов!

Connect with SSH

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

Давайте рассмотрим немного более сложный пример пути.

Задания в рамках курса располагаются в каталоге challenge, который, в свою очередь, расположен непосредственно в корневом каталоге (/). Таким образом, путь к каталогу с заданиями — /challenge.

Имя программы‑задания на данном уровне — run, и она находится в каталоге /challenge.
Следовательно, путь к программе задания run/challenge/run.

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

Вам нужно запустить файл run, который находится в каталоге challenge, расположенном в корневом каталоге /. Если Вы корректно вызовете эту программу, она выдаст Вам флаг.

Желаем успехов!

Connect with SSH

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

Файловая система Linux содержит множество каталогов с большим числом файлов.
Вы можете перемещаться между каталогами с помощью команды cd (change directory), передавая ей путь в качестве аргумента, например:

hacker@path:~$ cd /some/new/directory
hacker@path:/some/new/directory$

Эта команда изменяет «текущий рабочий каталог» (current working directory) Вашего процесса (в данном случае — оболочки bash). У каждого процесса есть каталог, в котором он в данный момент «находится». Причины, по которым это важно, станут ясны позднее в рамках данного модуля.

Кстати, теперь можно понять, что означал символ ~ в приглашении командной строки.
Он показывает текущий путь, в котором в данный момент находится оболочка.

В данном задании Вам нужно будет выполнить программу /challenge/run из определённого каталога (само задание подскажет, из какого). Для этого Вам потребуется сначала перейти в указанный каталог с помощью cd, а затем повторно запустить программу‑задание.

Желаем успехов!

Connect with SSH

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

Мы с Вами прошли важный теоретический материал, который составляет основу дальнейшей работы с системой Linux.

Закрепим накопленные знания при помощи целенаправленных повторений и практических действий. В качестве тренировки текущее задание последовательно пять раз проведёт Вас по аналогичному маршруту переходов и вызовов.

Старайтесь не просто механически повторять команды, а осмысленно анализировать, что и почему Вы делаете на каждом этапе.

СОВЕТ:
Если Вы запутались, команда pwd поможет определить «текущий рабочий каталог» (current working directory).

Для старта запустите /challenge/run и последовательно посетите запрашиваемые директории. Желаем успехов!

Connect with SSH

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

Теперь Вы хорошо знакомы с понятием обращения к абсолютным путям и знаете принцип смены каталогов.

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

Разберемся с понятием Относительный путь:

  • Относительный путь — это любой путь, который не начинается от корня (то есть не начинается с символа /).
  • Относительный путь интерпретируется относительно Вашего текущего рабочего каталога (cwd, current working directory).
  • Ваш cwd — это каталог, в котором в данный момент «находится» оболочка, что отражается в приглашении командной строки.

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

Представим, что нам нужно обратиться к файлу по пути /tmp/a/b/my_file.

  • Если текущий каталог — /, то относительный путь к этому файлу будет tmp/a/b/my_file.
  • Если текущий каталог — /tmp, то относительный путь будет a/b/my_file.
  • Если текущий каталог — /tmp/a/b/c, то относительный путь будет ../my_file, где .. обозначает родительский каталог.

Теперь попробуем применить это на практике.
Вам необходимо запустить программу /challenge/run, используя относительный путь, при этом текущим рабочим каталогом должен быть корневой каталог /.
В качестве подсказки: требуемый относительный путь начинается с буквы c.

Желаем успехов!

Connect with SSH

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

Ранее Ваш относительный путь был «голым» (пустым): он напрямую задавал каталог, в который нужно перейти из текущего каталога. В этом испытании мы рассмотрим более явные формы записи относительных путей.

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

  • /challenge
  • /challenge/.
  • /challenge/./././././././././
  • /./././challenge/././

Следующие относительные пути также эквивалентны друг другу:

  • challenge
  • ./challenge
  • ./././challenge
  • challenge/.

ВАЖНО: Если Ваш текущий рабочий каталог — /, приведённые относительные пути будут эквивалентны указанным выше абсолютным путям.

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

Для старта запустите /challenge/run находясь в / с импользованием относительного пути начинающегося с .. Желаем успехов!

Connect with SSH

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

В этом уровне мы ещё немного потренируемся использовать . в путях. В данном задании необходимо запускать run из каталога /challenge. Здесь всё становится немного сложнее.

Linux специально не ищет программы в текущем каталоге, когда Вы указываете «голый» путь (то есть просто имя без каких‑либо символов /).
Рассмотрим пример:

hacker@path:~$ cd /challenge
hacker@path:/challenge$ run

Эта последовательность команд не запустит /challenge/run.
Так устроено в целях безопасности: если бы Linux автоматически искал программы в текущем каталоге при вводе «голых» команд, Вы могли бы случайно выполнить программу из текущего каталога, имя которой совпадает с именем одной из ключевых системных утилит.
В результате приведённые выше команды вызовут ошибку:

bash: run: command not found

Механизмы, стоящие за этим поведением, мы разберём позднее, а в рамках данного задания Вы научитесь явно использовать относительные пути для запуска run в такой ситуации.

Сделать это можно, явно указав, что программу нужно искать в текущем каталоге, — с помощью . так же, как в предыдущих уровнях. Попробуйте сделать это сейчас!

Connect with SSH

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

У каждого пользователя в системе есть домашний каталог, который обычно располагается внутри /home. В лабораторных работах CTF SCHOOL Вы работаете под пользователем hacker, и Ваш домашний каталог — /home/hacker. Именно здесь пользователи, как правило, хранят большую часть своих личных файлов. По мере прохождения заданий именно в этом каталоге будут находиться большинство Ваших решений.

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

hacker@path:~$

Символ ~ в этом приглашении обозначает текущий рабочий каталог, при этом ~ является сокращением для /home/hacker. Bash предоставляет и использует это сокращение, поскольку большую часть времени Вы проводите именно в домашнем каталоге. Поэтому каждый раз, когда bash встречает ~ в начале аргумента, который интерпретируется как путь, он разворачивает его в путь к домашнему каталогу.

Рассмотрим пример:

hacker@path:~$ echo LOOK: ~
LOOK: /home/hacker
hacker@path:~$ cd /
hacker@path:/$ cd ~
hacker@path:~$ cd ~/asdf
hacker@path:~/asdf$ cd ~/asdf
hacker@path:~/asdf$ cd ~
hacker@path:~$ cd /home/hacker/asdf
hacker@path:~/asdf$

Обратите внимание, что развёрнутый ~ даёт абсолютный путь, и замене подлежит только начальный ~. Это означает, что, например, ~/~ будет развёрнуто в /home/hacker/~, а не в /home/hacker/home/hacker.

Небольшой полезный факт: команда cd по умолчанию использует домашний каталог в качестве каталога назначения:

hacker@path:~$ cd /tmp
hacker@path:/tmp$ cd
hacker@path:~$

Теперь Ваша очередь попрактиковаться.

В данном задании программа /challenge/run запишет копию флага в любой файл, путь к которому Вы укажете в качестве аргумента командной строки, при соблюдении следующих условий:

  1. Ваш аргумент должен задавать абсолютный путь.
  2. Указанный путь должен находиться внутри Вашего домашнего каталога.
  3. До развёртывания (подстановки ~) длина аргумента должна составлять не более трёх символов.

Ещё раз обратите внимание: путь необходимо указать в виде аргумента к программе /challenge/run, следующим образом:

hacker@path:~$ /challenge/run ВАШ_ПУТЬ

Желаем удачи!

Connect with SSH

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