Базовые команды


Основы Linux

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

Итак, без лишних предисловий — приступим к изучению базовых команд.

Одной из ключевых команд в Linux является cat.

Команда cat чаще всего используется для вывода содержимого файлов, например:

hacker@cmd:~$ cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback

При передаче нескольких файлов в качестве аргументов cat будет их конcatенировать (отсюда и название), последовательно выводя содержимое каждого файла:

hacker@cmd:~$ cat myfile
Это мой файл!
hacker@cmd:~$ cat yourfile
Это твой файл!
hacker@cmd:~$ cat myfile yourfile
Это мой файл!
Это твой файл!
hacker@cmd:~$ cat myfile yourfile myfile
Это мой файл!
Это твой файл!
Это мой файл!

Наконец, если запустить cat без аргументов, команда будет читать данные из терминала (стандартного ввода) и выводить их обратно на экран. Мы подробно рассмотрим это поведение в следующих заданиях.

В рамках текущего задания Вам нужно прочитать flag в из домашней директории ~. Выполните команду cat и укажите флаг в качестве параметра команды.

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

Connect with SSH

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

В прошлом задании Вы использовали команду cat flag, чтобы прочитать флаг из Вашего домашнего каталога.

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

hacker@cmd:~$ cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback

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


ВАЖНО:
Файл /flag — это место, где флаг хранится всегда, однако, в отличие от этого задания, обычно у Вас не достаточно прав для его отображения.

Connect with SSH

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

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

В данном задании флаг будет помещён в некоторый «замысловатый» каталог, а смена каталогов с помощью cd будет запрещена, так что вариант cat flag использовать не получится.

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

Connect with SSH

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

Иногда файлы, содержимое которых Вы хотите просмотреть с помощью cat, оказываются слишком объёмными. К счастью, существует команда grep, которая позволяет искать нужный фрагмент текста внутри таких файлов. В этом задании Вы познакомитесь с её базовым использованием.

Существует множество способов работы с grep, и здесь мы рассмотрим один из них:

hacker@cmd:~$ grep СТРОКА_ПОИСКА /путь/к/файлу

В таком виде команда grep ищет в указанном файле строки, содержащие СТРОКА_ПОИСКА, и выводит их в терминал.

В рамках данного задания в файл /challenge/data.txt было записано сто тысяч строк текста. Используйте grep, чтобы найти в нём флаг.

ПОДСКАЗКА:
Флаг всегда начинается с подстроки ctf.school.

Connect with SSH

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

Когда нужно найти отличия между похожими файлами, пытаться «на глаз» вычитать различия — далеко не самый эффективный подход. В таких ситуациях незаменимой становится команда diff.

Команда diff построчно сравнивает два файла и показывает, чем именно они отличаются.

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

hacker@cmd:~$ cat file1
hello
world
hacker@cmd:~$ cat file2
hello
universe
hacker@cmd:~$ diff file1 file2
2c2
< world
***
> universe

Вывод сообщает, что изменилась строка 2 (2c2), причём в первом файле (<) на этой строке было слово world, а во втором (>) — universe.

Если во втором файле появились новые строки, вывод может выглядеть так:

hacker@cmd:~$ cat old
ctf
hacker@cmd:~$ cat new
ctf
school
hacker@cmd:~$ diff old new
1a2
> school

Здесь 1a2 означает: «после строки 1 первого файла добавлена строка 2 второго файла».


Задание на данный урок - научится использовать команду diff на практике. В каталоге /challenge находятся два файла:

  • /challenge/fake_only.txt — содержит 100 поддельных флагов;
  • /challenge/fake_and_real.txt — содержит те же 100 поддельных флагов и один настоящий флаг.

Используйте diff, чтобы найти различия между этими файлами и таким образом получить настоящий флаг.

Connect with SSH

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

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

Команда ls выводит список файлов во всех каталогах, переданных ей в качестве аргументов, а при отсутствии аргументов — в текущем каталоге.

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

hacker@cmd:~$ ls /challenge
run
hacker@cmd:~$ ls
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos
hacker@cmd:~$ ls /home/hacker
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos
hacker@cmd:~$

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

Connect with SSH

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

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

Вы можете создать новый пустой файл, «коснувшись» его командой touch:

hacker@cmd:~$ cd /tmp
hacker@cmd:/tmp$ ls
hacker@cmd:/tmp$ touch pwnfile
hacker@cmd:/tmp$ ls
pwnfile
hacker@cmd:/tmp$

Да, вот так просто!


В этом задании Вам необходимо создать два файла: /tmp/ctf и /tmp/school, а затем запустить /challenge/run, чтобы получить флаг.

Connect with SSH

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

Файлы повсюду вокруг Вас. В какой‑то момент файлов станет слишком много. В этом задании мы научимся наводить порядок и убирать лишнее!

В Linux файлы удаляют с помощью команды rm (remove), вот так:

hacker@cmd:~$ touch CTF
hacker@cmd:~$ touch SCHOOL
hacker@cmd:~$ ls
CTF     SCHOOL
hacker@cmd:~$ rm CTF
hacker@cmd:~$ ls
SCHOOL
hacker@cmd:~$

Давайте потренируемся...

В этом уроке в Вашем домашнем каталоге будет создан файл delete_me! Удалите его, а затем запустите /challenge/run. Скрипт убедится, что Вы всё удалили как нужно и после этого выдаст Вам флаг.

Connect with SSH

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

Файлы можно не только создавать и удалять — их также можно перемещать с помощью команды mv. Синтаксис использования этой команды предельно прост - mv ИСТОЧНИК НАЗНАЧЕНИЕ.

Вот пример использования команды:

hacker@cmd:~$ ls
my-file
hacker@cmd:~$ cat my-file
CTF SCHOOL!
hacker@cmd:~$ mv my-file your-file
hacker@cmd:~$ ls
your-file
hacker@cmd:~$ cat your-file
CTF SCHOOL!
hacker@cmd:~$

В этом задании от Вас требуется переместить файл /flag в /tmp/hack-the-planet (сделайте это). Когда закончите, запустите /challenge/run — эта программа проверит, всё ли сделано правильно, и выдаст Вам флаг.

ВАЖНО: Возможность переместить или удалить файл в Linux не дают доступа к его прочтению.

Connect with SSH

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

Часто бывают ситуации когда Вам нужно сохранить исходный файл, одновременно создав его копию. В этом случае можно воспользоваться командой cp (copy).
Синтаксис её использования совпадает с mv, но при этом исходный файл остаётся на месте, а создаётся его копия - cp ИСТОЧНИК НАЗНАЧЕНИЕ.

Вот пример использования команды cp:

hacker@cmd:~$ ls
my-file
hacker@cmd:~$ cat my-file
CTF SCHOOL!
hacker@cmd:~$ cp my-file your-file
hacker@cmd:~$ ls
my-file    your-file
hacker@cmd:~$ cat your-file
CTF SCHOOL!
hacker@cmd:~$

В данном задании от Вас требуется скопировать файл /flag в /tmp/hack-the-planet (сделайте это). Когда закончите, запустите /challenge/run — эта программа проверит, что всё в порядке, и выдаст Вам флаг.

Connect with SSH

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

По умолчанию ls показывает НЕ ВСЕ файлы. В Linux существует соглашение, согласно которому файлы, имя которых начинается с точки (.), не отображаются в стандартном выводе ls и в ряде других случаев.

Чтобы увидеть такие файлы через ls, нужно вызывать его с ключом -a (показать все -all), вот так:

hacker@cmd:~$ touch pwn
hacker@cmd:~$ touch .college
hacker@cmd:~$ ls
pwn
hacker@cmd:~$ ls -a
.college    pwn
hacker@cmd:~$

Теперь очередь за Вами! Найдите флаг, спрятанный в каталоге / в виде файла, имя которого начинается с точкой.

Connect with SSH

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

Суммируя Ваши знания о командах cd, ls и cat, мы готовы сыграть в небольшую игру!

Мы начнём в корневом каталоге /. Обычно там можно увидеть примерно следующее:

hacker@dojo:~$ cd /
hacker@dojo:/$ ls
bin   challenge  etc   home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  dev        flag  lib   lib64  media   opt  root  sbin  sys  usr

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

В этом задании мы спрятали флаг внутри образа! Здесь Вы будете использовать ls и cat, чтобы идти по «хлебным крошкам» и в итоге найти его по подсказкам.

Вот как это будет устроено:

  1. Ваша первая подсказка находится в /. Перейдите туда.
  2. Осмотритесь с помощью ls. Там будет файл с названием вроде HINT, CLUE или чем‑то похожим. Все символы в верхнем регистре.
  3. Прочитайте этот файл с помощью cat, чтобы увидеть подсказку.
  4. В зависимости от содержания подсказки перейдите в следующий каталог (или не переходите, если так указано).
  5. Следуйте по цепочке подсказок, пока не доберётесь до флага!

Удачи!

Connect with SSH

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

Мы уже умеем создавать файлы. Время научиться создовать каталоги. Каталоги создаются с помощью команды mkdir(make directory). После создания Вы можете складывать файлы внутрь каталогов.

Вот пример использования команды:

hacker@cmd:~$ cd /tmp
hacker@cmd:/tmp$ ls
hacker@cmd:/tmp$ mkdir my_directory
hacker@cmd:/tmp$ ls
my_directory
hacker@cmd:/tmp$ cd my_directory
hacker@cmd:/tmp/my_directory$ touch my_file
hacker@cmd:/tmp/my_directory$ ls
my_file
hacker@cmd:/tmp/my_directory$ ls /tmp/my_directory/my_file
/tmp/my_directory/my_file
hacker@cmd:/tmp/my_directory$

В этом задании создайте каталог /tmp/ctf и поместите в него файл school.
Затем запустите /challenge/run, который проверит Ваше решение и выдаст Вам флаг.

Connect with SSH

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

На данном этапе Вы умеете выводить списки файлов, читать их и создавать. Но как ИСКАТЬ файлы в Linux? Для поиска изучим команду find.

Команда find принимает необязательные аргументы, задающие критерии поиска и область поиска. Если критерий не указан, find будет считать совпадением любой файл. Если не указана область поиска, find использует в качестве неё текущий каталог (.).

Например, вот так будет выглядеть запуск find без параметров:

hacker@cmd:~$ mkdir my_directory
hacker@cmd:~$ mkdir my_directory/my_subdirectory
hacker@cmd:~$ touch my_directory/my_file
hacker@cmd:~$ touch my_directory/my_subdirectory/my_subfile
hacker@cmd:~$ find
.
./my_directory
./my_directory/my_subdirectory
./my_directory/my_subdirectory/my_subfile
./my_directory/my_file
hacker@cmd:~$

А вот пример с явным указанием области поиска:

hacker@cmd:~$ find my_directory/my_subdirectory
my_directory/my_subdirectory
my_directory/my_subdirectory/my_subfile
hacker@cmd:~$

Разумеется, мы можем указывать критерии. Например, здесь мы используем ключ -name для фильтра по имени:

hacker@dojo:~$ find -name my_subfile
./my_directory/my_subdirectory/my_subfile
hacker@dojo:~$ find -name my_subdirectory
./my_directory/my_subdirectory
hacker@dojo:~$

Вы можете искать по всей файловой системе задав область поиска /:

hacker@dojo:~$ find / -name hacker
/home/hacker
hacker@dojo:~$

ВАЖНО:
У команды find обширный список ключенй, позволяющих очень точно настроить параметры поиска. При необходимости весь список доступных ключей можно узнать через команду man (сокращение от manual - справка). Требуется передать команде man имя той утилиты о которой нужно получить справку в качестве параметра и она выведет справку на доступном языке (обычно Английский).


Теперь очередь за Вами. Мы спрятали флаг в случайном каталоге файловой системы. Имя файла по‑прежнему flag. Найдите его!

Несколько замечаний:

  • Во‑первых, в системе есть и другие файлы с именем flag. Не пугайтесь, если первый найденный файл не будет содержать настоящий флаг.
  • Во‑вторых, в файловой системе есть множество мест, недоступных обычному пользователю. Это приведёт к тому, что find будет выводить сообщения об ошибках, но их можно игнорировать — флаг мы в таких местах прятать не будем.
  • Наконец, выполнение find может занять какое‑то время; проявите терпение.

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

Connect with SSH

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

Если Вы пользуетесь Linux (или вообще компьютерами) достаточно долго и для реальных задач, Вы рано или поздно столкнётесь с такой ситуацией: нужно, чтобы два разных приложения обращались к одним и тем же данным, но при этом каждая программа ожидает увидеть эти данные в своём, «собственном» месте. К счастью, в Linux есть решение этой проблемы — ссылки (links).

Ссылки бывают двух видов: жёсткие (hard) и мягкие (soft, или символические).

Разницу между ними удобно пояснить на такой аналогии:

  • Жёсткая ссылка — это когда к Вашей квартире ведут несколько разных адресов, но все они указывают прямо на одно и то же место (например, Кв. 2 и Дверь 2).
  • Мягкая (символическая) ссылка — это когда Вы переехали, а почта автоматически перенаправляет Ваши письма со старого адреса на новый.

В файловой системе файл — это, по сути, адрес, по которому хранится его содержимое.

  • Жёсткая ссылка — это альтернативный адрес, указывающий на те же самые данные: доступ через жёсткую ссылку и через исходное имя файла полностью идентичен и сразу приводит к нужному содержимому.
  • Символическая (soft) ссылка, напротив, содержит имя исходного файла. Когда Вы обращаетесь к символической ссылке, Linux понимает, что это именно ссылка, считывает первоначальное имя и затем (обычно автоматически) обращается уже к этому файлу.

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

Жёсткие ссылки по описанию кажутся проще (можно уложился в одно предложение, тогда как для soft‑ссылок понадобится минимум два), но у них есть свои недостатки и особенности реализации, из‑за которых гораздо более распространённым вариантом стали именно мягкие/символические ссылки.

В этом задании мы познакомимся с символическими ссылками (также называемыми symlink). Символические ссылки создаются командой ln с аргументом -s (soft), например:

hacker@cmd:~$ cat /tmp/myfile
Это мой файл!
hacker@cmd:~$ ln -s /tmp/myfile /home/hacker/ourfile
hacker@cmd:~$ cat ~/ourfile
Это мой файл!
hacker@cmd:~$

Вы видите, что при обращении к symlink Вы получаете содержимое исходного файла. Здесь также показано использование ln -s: обратите внимание, что путь к исходному файлу указывается ПЕРЕД путём к создаваемой ссылке!

Определить, что перед Вами именно символическая ссылка, можно несколькими способами. Например, команда file, которая принимает имя файла и сообщает его тип, умеет распознавать symlink:

hacker@cmd:~$ file /tmp/myfile
/tmp/myfile: ASCII text
hacker@cmd:~$ file ~/ourfile
/home/hacker/ourfile: symbolic link to /tmp/myfile
hacker@cmd:~$

Теперь попробуйте сами!

В этом задании флаг, как обычно, находится в /flag, но программа /challenge/run вместо этого читает /home/hacker/not-the-flag. Воспользуйтесь символической ссылкой и обманите её, чтобы она выдала Вам настоящий флаг!

Connect with SSH

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