Права доступа в Linux


Основы Linux

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

В Linux каждый файл обладает определёнными правами доступа, или режимом файла. Просмотреть права доступа к файлу или каталогу можно с помощью команды ls -l. Давайте создадим несколько файлов и изучим их права доступа:

hacker@perm:~$ mkdir ctf_directory
hacker@perm:~$ touch school_file
hacker@perm:~$ ls -l
total 4
-rw-r--r-- 1 hacker hacker    0 May 22 13:42 school_file
drwxr-xr-x 2 hacker hacker 4096 May 22 13:42 ctf_directory
hacker@perm:~$

Здесь много информации, и большую её часть мы разберём в этом модуле! Пока что рассмотрим вывод на высоком уровне:

Тип файла

Первый символ каждой строки обозначает тип файла. Для ctf_directory символ d указывает, что это каталог; для school_file символ - означает обычный файл. Существуют и другие типы — с некоторыми из них Вы познакомились ранее (например FIFO), а с какими-то столкнётесь позже в ходе обучения.

Права доступа

Следующие девять символов — это непосредственно права доступа к файлу или каталогу, разделённые на три группы по три символа: первая тройка задаёт права пользователя-владельца файла (далее «владелец»), вторая — права группы-владельца файла (далее «группа»), третья — права всех остальных (например, других пользователей и групп).

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

Информация о владельце

Два столбца отображают пользователя, владеющего файлом (в данном случае пользователь hacker), и группу, владеющую файлом (в данном случае также группа hacker). Именно с этим Вам и предстоит поработать.

В этом модуле Вы будете практиковаться в работе с правами доступа. Начнём!

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

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

Две наиболее важные учётные записи:

  1. Ваша собственная учётная запись. На ctf.school это пользователь hacker — вне зависимости от Вашего настоящего имени пользователя.
  2. root - это административная учётная запись и, в большинстве задач по безопасности, конечная цель. Если Вам удалось захватить root, считайте, что цель взлома практически достигнута!

К чему это всё?

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

hacker@perm:~$ ls -l /flag
-r-------- 1 root root 53 Jul  4 04:47 /flag
hacker@perm:~$ cat /flag
cat: /flag: Permission denied
hacker@perm:~$

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

root@perm:~# cat /flag
ctf.school{demo_flag}
root@perm:~#

Примечательно, что владельца файлов можно менять! Это делается с помощью команды chown (change owner — «сменить владельца»):

chown [username] [file]

Как правило, chown может вызывать только пользователь root. Давайте снова представим, что мы root (это никогда не надоедает!), и рассмотрим типичное использование chown:

root@perm:~# mkdir ctf_directory
root@perm:~# touch school_file
root@perm:~# ls -l
total 4
-rw-r--r-- 1 root root    0 May 22 13:42 school_file
drwxr-xr-x 2 root root 4096 May 22 13:42 ctf_directory
root@perm:~# chown hacker school_file
root@perm:~# ls -l
total 4
-rw-r--r-- 1 hacker root    0 May 22 13:42 school_file
drwxr-xr-x 2 root   root 4096 May 22 13:42 ctf_directory
root@perm:~#

Владелец school_file изменился на пользователя hacker, и теперь hacker может делать с этим файлом всё то, что раньше мог делать только root! Если бы это был файл /flag, пользователь hacker смог бы его прочитать!


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

Специально для этого задания (и только для него) Вам открыта возможность использовать chown без ограничений от имени пользователя hacker (обычно для этого требуются права root). Используйте эту возможность с и прочтите /flag!

Connect with SSH

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

Совместное использование — это здорово, и в Linux оно заложено в самой архитектуре системы. Каждый файл имеет как пользователя-владельца, так и группу-владельца. Группа может объединять нескольких пользователей, а пользователь может быть членом нескольких групп.

Посмотреть, в каких группах Вы состоите, можно с помощью команды id:

hacker@perm:~$ id
uid=1000(hacker) gid=1000(hacker) groups=1000(hacker)
hacker@perm:~$

Здесь пользователь hacker состоит только в группе hacker. Группы чаще всего используются для управления доступом к различным системным ресурсам. У обычного пользователя типичного десктопного дистрибутива Linux бывает очень много групп. Например, вот что можно увидеть на машине mokando:

mokando@kali:~$ id
uid=501(mokando) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),
44(video),46(plugdev),100(users),106(netdev),114(bluetooth),117(lpadmin),120(scanner),995(docker)
mokando@kali:~$

Все эти группы дают mokando возможность администрировать систему, воспроизводить звук, выводить изображение, использовать Bluetooth и так далее. Нередко такое разграничение доступа реализуется через групповое владение объектами файловой системы. Например, графический вывод осуществляется через специальный файл /dev/fb0:

mokando@kali:~$ ls -l /dev/fb0
crw-rw---- 1 root video 29, 0 Jun 30 23:42 /dev/fb0
mokando@kali:~$

Это специальный файл устройства (тип c означает «символьное устройство»): взаимодействие с ним изменяет состояние дисплея (а не данные на диске, как в случае обычного файла!). Учётная запись mokando может работать с этим файлом, поскольку его группой-владельцем является video, а mokando входит в группу video.

С файлом /flag в задании всё обстоит иначе. Рассмотрим следующий пример:

hacker@perm:~$ id
uid=1000(hacker) gid=1000(hacker) groups=1000(hacker)
hacker@perm:~$ ls -l /flag
-r--r----- 1 root root 53 Jul  4 04:47 /flag
hacker@perm:~$ cat /flag
cat: /flag: Permission denied
hacker@perm:~$

Файл флага принадлежит пользователю root и группе root, а пользователь hacker не является ни root, ни членом группы root, поэтому доступ к файлу закрыт. К счастью, группу-владельца файла можно изменить с помощью команды chgrp (change group — «сменить группу»). Для этого, как правило, требуются права root (если только Вы не являетесь одновременно владельцем файла и членом новой группы), поэтому давайте рассмотрим пример от имени root:

root@perm:~# mkdir ctf_directory
root@perm:~# touch school_file
root@perm:~# ls -l
total 4
-rw-r--r-- 1 root root    0 May 22 13:42 school_file
drwxr-xr-x 2 root root 4096 May 22 13:42 ctf_directory
root@perm:~# chgrp hacker school_file
root@perm:~# ls -l
total 4
-rw-r--r-- 1 root hacker    0 May 22 13:42 school_file
drwxr-xr-x 2 root root   4096 May 22 13:42 ctf_directory
root@perm:~#

Попробуйте повторить на практике.


На этом уровне флаг доступен для чтения группе, которой принадлежит файл, однако сейчас это группа root. К счастью, я также открыл Вам возможность вызывать chgrp от имени пользователя hacker! Смените группу-владельца /flag и прочитайте флаг!

Connect with SSH

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

На предыдущих уровнях Вы могли заметить, что пользователь hacker входит в группу hacker, а пользователь mokando — в группу mokando. В Linux существует соглашение, по которому у каждого пользователя есть собственная группа, однако это не является обязательным требованием. Например, во многих компьютерных классах всех пользователей объединяют в одну общую группу users.

Суть в том, что раньше Вы использовали группу hacker, но на этом уровне это не сработает. Вам по-прежнему разрешено использовать chgrp, однако имя группы, в которую входит Ваш пользователь, будет случайным. Вам нужно выяснить его с помощью команды id, а затем использовать chgrp для доступа к /flag!

Connect with SSH

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

Итак, Вы хорошо разобрались с владением файлами. Теперь поговорим о другой стороне медали: правах доступа к файлам. Вспомним наш пример:

hacker@perm:~$ mkdir ctf_directory
hacker@perm:~$ touch school_file
hacker@perm:~$ ls -l
total 4
-rw-r--r-- 1 hacker hacker    0 May 22 13:42 school_file
drwxr-xr-x 2 hacker hacker 4096 May 22 13:42 ctf_directory
hacker@perm:~$

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

Каждый символ в группе из трёх обозначает отдельный вид права доступа:

r — пользователь/группа/остальные могут читать файл 
    (или просматривать содержимое каталога)
w — пользователь/группа/остальные могут изменять файл 
    (или создавать/удалять файлы в каталоге)
x — пользователь/группа/остальные могут выполнять файл как программу 
    (или переходить в каталог, например с помощью `cd`)
- — нет прав

Для school_file строка прав доступа rw-r--r-- расшифровывается следующим образом:

  • r: пользователь-владелец (пользователь hacker) может читать файл
  • w: пользователь-владелец (пользователь hacker) может записывать в файл
  • -: пользователь-владелец (пользователь hacker) не может выполнять файл
  • r: пользователи группы-владельца (группа hacker) могут читать файл
  • -: пользователи группы-владельца (группа hacker) не могут записывать в файл
  • -: пользователи группы-владельца (группа hacker) не могут выполнять файл
  • r: все остальные пользователи могут читать файл
  • -: все остальные пользователи не могут записывать в файл
  • -: все остальные пользователи не могут выполнять файл

Теперь посмотрим на стандартные права доступа к /flag:

hacker@perm:~$ ls -l /flag
-r-------- 1 root root 53 Jul  4 04:47 /flag
hacker@perm:~$

Здесь установлен только один бит: право на чтение (r) для пользователя-владельца (в данном случае root). Члены группы-владельца (группа root) и все остальные пользователи не имеют никакого доступа к файлу.

Возможно, Вы задаётесь вопросом: как же работали задания с chgrp, если у группы не было доступа к файлу? Дело в том, что в тех заданиях права доступа были выставлены иначе:

hacker@perm:~$ ls -l /flag
-r--r----- 1 root root 53 Jul  4 04:47 /flag
hacker@perm:~$

Группа имела доступ! Именно поэтому смена группы через chgrp позволяла прочитать файл.

Права доступа к файлам, как и владельца, можно изменять. Для этого служит команда chmod (change mode — «сменить режим»). Базовый синтаксис chmod:

chmod [OPTIONS] MODE FILE

Режим MODE можно задать двумя способами: как изменение существующих прав доступа или как полную их замену. Сначала мы рассмотрим первый способ: изменение существующих прав. chmod позволяет тонко настраивать права доступа с помощью формата КТО+/-ЧТО, где КТО — пользователь, группа или остальные, а ЧТО — чтение, запись или выполнение.

Например, чтобы добавить (+) право чтения (read) для пользователя-владельца (user), нужно указать режим u+r. Запись (w) и выполнение (x) для группы (g) и остальных (o) (или для всех сразу, a) задаются аналогичным образом. Ещё примеры:

  • u+r — как показано выше, добавляет право чтения для пользователя
  • g+wx — добавляет права записи и выполнения для группы
  • o-wснимает право записи для остальных пользователей
  • a-rwx — снимает все права для пользователя, группы и всех остальных

Таким образом:

root@perm:~# mkdir ctf_directory
root@perm:~# touch school_file
root@perm:~# ls -l
total 4
-rw-r--r-- 1 root root    0 May 22 13:42 school_file
drwxr-xr-x 2 root root 4096 May 22 13:42 ctf_directory
root@perm:~# chmod go-rwx *
root@perm:~# ls -l
total 4
-rw------- 1 hacker root    0 May 22 13:42 school_file
drwx------ 2 root   root 4096 May 22 13:42 ctf_directory
root@perm:~#

Закрепим знания практикой.


В этом задании Вам нужно изменить права доступа к файлу /flag, чтобы его можно было прочитать. Как правило, для изменения прав доступа требуется быть владельцем файла, однако в этом уровне команда chmod всемогущая: Вы можете менять права доступа к любому файлу, даже от имени пользователя hacker. Это огромные полномочия!

Файл /flag принадлежит root, и Вы не можете это изменить, но Вы можете сделать его доступным для чтения. Вперёд!

Connect with SSH

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

До сих пор Вы в основном работали с правами на чтение. Это логично, поскольку Вы делали файл /flag доступным для чтения. На этом уровне мы изучим права на выполнение.

Когда Вы запускаете программу, например /challenge/run, Linux выполнит её только при наличии у Вас права на выполнение этого файла. Рассмотрим пример:

hacker@perm:~$ ls -l /challenge/run
-rwxr-xr-x 1 root root    0 May 22 13:42 /challenge/run
hacker@perm:~$ /challenge/run
Успешный запуск!
hacker@perm:~$

В данном случае /challenge/run запускается, потому что пользователь hacker имеет право на его выполнение. Поскольку файл принадлежит пользователю и группе root, это требует установки бита выполнения в правах «для остальных». Если убрать эти права, запуск завершится ошибкой!

hacker@perm:~$ chmod o-x /challenge/run
hacker@perm:~$ ls -l /challenge/run
-rwxr-xr-- 1 root root    0 May 22 13:42 /challenge/run
hacker@perm:~$ /challenge/run
bash: /challenge/run: Permission denied
hacker@perm:~$

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

Connect with SSH

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

Думаете, что научились пользоваться chmod? Давайте это проверим!

Это задание несколько раз подряд попросит Вас изменить права доступа к файлу /challenge/ctf строго определённым образом. Если Вы укажете неверные права — игра сбросится, и Вы сможете попробовать снова. Если Вы восемь раз подряд правильно установите права доступа, задание позволит Вам выполнить chmod для /flag, чтобы сделать его доступным для чтения.

Запустите /challenge/run, чтобы начать испытание!

Connect with SSH

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

Помимо добавления и снятия прав доступа, как на предыдущем уровне, chmod также умеет устанавливать права полностью, заменяя старые. Для этого используется символ = вместо - или +. Например:

  • u=rw устанавливает права чтения и записи для пользователя и снимает право выполнения
  • o=x устанавливает только право выполнения для остальных, снимая чтение и запись
  • a=rwx устанавливает права чтения, записи и выполнения для пользователя, группы и всех остальных!

Но что если нужно задать права для пользователя и для группы по-разному? Допустим, Вы хотите установить rw для пользователя-владельца и только r для группы-владельца? Для этого можно объединить несколько режимов в одном вызове chmod, разделив их запятой ,!

  • chmod u=rw,g=r /challenge/ctf — установит права чтения и записи для пользователя, и только чтение для группы
  • chmod a=r,u=rw /challenge/ctf — установит права чтения и записи для пользователя, и только чтение для группы и всех остальных

Кроме того, можно обнулить права с помощью -:

  • chmod u=rw,g=r,o=- /challenge/ctf — установит права чтения и записи для пользователя, только чтение для группы и полное отсутствие прав для всех остальных

Обратите внимание: символ - после = имеет иной смысл, чем если бы он стоял сразу после u, g или o (в последнем случае он снял бы конкретные биты, а не все права сразу).


Текущие задание расширяет предыдущее испытание: здесь потребуются более радикальные изменения прав доступа, для которых понадобятся = и объединение через ,.

Удачи!

Connect with SSH

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

Как Вы уже изучили в предыдущем модуле, существует немало ситуаций, когда непривилегированным пользователям необходим доступ к определённым системным задачам. Системный администратор не может постоянно вводить пароль всякий раз, когда пользователь хочет выполнить действие, требующее прав root или sudo. Решение есть - бит прав доступа «Set User ID» (SUID), позволяет пользователю запускать программу от имени владельца соответствующего файла.

Именно этот механизм используется для того, чтобы программы заданий могли читать флаг, а за пределами ctf.school он применяется в системных утилитах администрирования — su, sudo и других. Права файла с установленным битом SUID выглядят так:

hacker@perm:~$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 232416 Dec 1 11:45 /usr/bin/sudo
hacker@perm:~$

Символ s на месте бита выполнения означает, что программа запускается с SUID. Это значит, что независимо от того, какой пользователь запускает программу (при наличии права на выполнение), она будет выполняться от имени пользователя-владельца файла (в данном случае root). Как владелец файла, Вы можете установить бит SUID с помощью chmod:

chmod u+s [program]

Однако будьте осторожны! Установка бита SUID на исполняемый файл, принадлежащий root, может дать злоумышленникам возможность стать root.


Сейчас Вам предлагается установить бит SUID на программу /challenge/getroot, чтобы получить оболочку root и самостоятельно прочитать флаг командой cat!

Connect with SSH

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