Пользователи и пароли


Основы Linux

Думали ли Вы, hacker, что являетесь единственным пользователем в системе? Внутри типичной системы Linux существует МНОЖЕСТВО пользователей! Полный список пользователей системы Linux хранится в файле /etc/passwd (название историческое — пароли там уже давно не хранятся). Вот пример из контейнера:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:101:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
mysql:x:104:105:MySQL Server,,,:/nonexistent:/bin/false
messagebus:x:105:106::/nonexistent:/usr/sbin/nologin
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
hacker:x:1000:1000::/home/hacker:/bin/bash

Пользователей здесь немало, и информации о них тоже, давайте разбираться.

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

В самом низу Вы можете увидеть пользователя hacker. Это Вы!

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

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

В этом модуле мы рассмотрим различные манипуляции с пользователями и изучим штатные способы смены пользователя для администрирования системы.

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

В этом задании мы рассмотрим более старую из них — su (команда substitute user, то есть «сменить пользователя»). Сегодня она практически не используется для повышения привилегий до root, однако это элегантная утилита из более цивилизованных времён, с которой мы начнём знакомство.

su — это бинарный файл с битом SUID (подробно о битах мы поговорим уже в следующем модуле):

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

Благодаря установленному биту SUID утилита su запускается от имени root. Работая с правами root, она может запустить оболочку от root! Разумеется, su не предоставляет привилегии кому попало: прежде чем разрешить пользователю повысить права до root, она проверяет, знает ли пользователь пароль root:

hacker@user:~$ su
Password: 
su: Authentication failure
hacker@user:~$

Именно необходимость знать пароль root и обусловила устаревание su. На современных системах паролей root практически не бывает, а для предоставления прав администратора применяются другие механизмы (с ними мы познакомимся позже).

Но В ЭТОМ задании (и только в нём) пароль root существует. Он равен ctf-school-secret, и Вы должны передать его команде su, чтобы стать root. Сделайте это и прочитайте флаг!

ПРИМЕЧАНИЕ:

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

Connect with SSH

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

Без аргументов su запускает оболочку root (после аутентификации по паролю root). Однако Вы можете передать имя пользователя в качестве аргумента, чтобы переключиться именно на этого пользователя, а не на root.

Например:

hacker@user:~$ su some-user
Password:
some-user@user:~$

Попробуйте смену пользователя на практике.


В этом задании Вам необходимо переключиться на пользователя mokando, а затем запустить /challenge/run. Пароль mokando — dont-hack-me.

Удачи!

Connect with SSH

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

Когда Вы вводите пароль для su, команда хеширует его и сравнивает результат с сохранённым значением для данного пользователя. Раньше пароли хранились в /etc/passwd, но поскольку этот файл доступен для чтения всем пользователям, хранить там пароли небезопасно — их перенесли в /etc/shadow. Вот пример файла /etc/shadow из предыдущего уровня:

root:$6$s74oZg/4.RnUvwo2$hRmCHZ9rxX56BbjnXcxa0MdOsW2moiW8qcAl/Aoc7NEuXl2DmJXPi3gLp7hmyloQvRhjXJ.wjqJ7PprVKLDtg/:19921:0:99999:7:::
daemon:*:19873:0:99999:7:::
bin:*:19873:0:99999:7:::
sys:*:19873:0:99999:7:::
sync:*:19873:0:99999:7:::
games:*:19873:0:99999:7:::
man:*:19873:0:99999:7:::
lp:*:19873:0:99999:7:::
mail:*:19873:0:99999:7:::
news:*:19873:0:99999:7:::
uucp:*:19873:0:99999:7:::
proxy:*:19873:0:99999:7:::
www-data:*:19873:0:99999:7:::
backup:*:19873:0:99999:7:::
list:*:19873:0:99999:7:::
irc:*:19873:0:99999:7:::
gnats:*:19873:0:99999:7:::
nobody:*:19873:0:99999:7:::
_apt:*:19873:0:99999:7:::
systemd-timesync:*:19901:0:99999:7:::
systemd-network:*:19901:0:99999:7:::
systemd-resolve:*:19901:0:99999:7:::
mysql:!:19901:0:99999:7:::
messagebus:*:19901:0:99999:7:::
sshd:*:19901:0:99999:7:::
hacker::19916:0:99999:7:::
mokando:$6$bEFkpM0w/6J0n979$47ksu/JE5QK6hSeB7mmuvJyY05wVypMhMMnEPTIddNUb5R9KXgNTYRTm75VOu1oRLGLbAql3ylkVa5ExuPov1.:19921:0:99999:7:::

В каждой строке поля разделены символом :: первое поле — имя пользователя, второе — пароль. Значение * или ! означает, что вход по паролю для этой учётной записи отключён; пустое поле означает отсутствие пароля (нередко встречающаяся ошибка конфигурации, которая в некоторых случаях позволяет выполнить su без пароля); длинная строка, как у mokando — $6$bEFkpM0w/6J0n979$47ksu/JE5QK6hSeB7mmuvJyY05wVypMhMMnEPTIddNUb5R9KXgNTYRTm75VOu1oRLGLbAql3ylkVa5ExuPov1. — это результат одностороннего шифрования (хеширования) пароля mokando с предыдущего уровня (в данном случае dont-hack-me). Остальные поля файла несут другую информацию; подробнее о них можно прочитать здесь.

Когда Вы вводите пароль в su, команда хеширует его и сравнивает результат с сохранённым значением. Если они совпадают, su открывает Вам доступ к учётной записи пользователя. Но что делать, если пароль неизвестен?

Если у Вас есть хеш пароля, его можно подменить. Несмотря на то что /etc/shadow по умолчанию доступен для чтения только root, утечки случаются. Например: резервные копии нередко хранятся в незашифрованном виде с недостаточным контролем доступа на файловых серверах, что уже стало причиной бесчисленных утечек данных.

Если злоумышленник получает доступ к утёкшему файлу /etc/shadow, он может приступить к взлому паролей. Для этого используется знаменитая утилита John the Ripper, например так:

hacker@user:~$ john ./my-leaked-shadow-file
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Will run 32 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password1337      (mokando)
1g 0:00:00:22 3/3 0.04528g/s 10509p/s 10509c/s 10509C/s lykys..lank
Use the "--show" option to display all of the cracked passwords reliably
Session completed
hacker@user:~$

Здесь John the Ripper подобрал хеш пароля mokando и восстановил его исходное значение — password1337.


В задании смоделирована описанная выше ситуация: Вам предоставляется утёкший файл /etc/shadow (хранится в /challenge/shadow-leak). Проанализируйте его утилитой John the Ripper (это может занять несколько минут), переключитесь на пользователя mokando с помощью su и запустите /challenge/run, чтобы получить флаг!

Connect with SSH

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

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

Чтобы решить эти проблемы, в последние десятилетия мир перешёл от администрирования через su к администрированию через sudo (Интересный факт: изначально sudo расшифровывалось как superuser do — «выполнить от имени суперпользователя», но впоследствии получило значение «su do»; поскольку su означает «substitute user», нынешняя расшифровка sudo — «substitute user, do», то есть «выполнить от имени другого пользователя»). В отличие от su, которая по умолчанию запускает оболочку от имени указанного пользователя, sudo по умолчанию выполняет команду от имени root:

hacker@user:~$ whoami
hacker
hacker@user:~$ sudo whoami
root
hacker@user:~$

Или, в более практичном контексте — для получения флагов:

hacker@user:~$ grep hacker /etc/shadow
grep: /etc/shadow: Permission denied
hacker@user:~$ sudo grep hacker /etc/shadow
hacker:$6$Xro.e7qB3Q2Jl2sA$j6xffIgWn9xIxWUeFzvwPf.nOH2NTWNJCU5XVkPuONjIC7jL467SR4bXjpVJx4b/bkbl7kyhNquWtkNlulFoy.:19921:0:99999:7:::
hacker@user:~$

В отличие от su, которая полагается на аутентификацию по паролю, sudo проверяет политики, чтобы определить, имеет ли пользователь право выполнять команды от имени root. Эти политики задаются в файле /etc/sudoers; их детальное изучение выходит за рамки нашего курса, однако существует немало материалов для тех, кто хочет разобраться глубже!

Итак, мир перешёл на sudo, оставив su позади (по крайней мере в контексте системного администрирования). Примечательно, что привилегированный режим самого ctf school работает именно так: Вам предоставляется доступ sudo для повышения привилегий.


В текущем задании Вам будет предоставлен доступ sudo, с помощью которого Вы должны прочитать флаг. Удачи!

Connect with SSH

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