Первые трюки


Основы Linux

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

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

~/.bashrc — полезный персональный стартовый скрипт! При запуске bash ищет файл .bashrc в вашем домашнем каталоге и выполняет его перед запуском оболочки. Вы можете настроить свой /home/hacker/.bashrc, добавив туда полезные вещи: установку переменных окружения, настройку конфигурации оболочки и так далее.

Но также ~/.bashrc можно использовать во зло!

Файл .bashrc ничего не подозревающей жертвы — частая цель подобных трюков. Представьте, что вы пробрались за компьютер друга и добавили echo "Здесь были хакеры!" в конец его .bashrc, и при следующем запуске ваш друг увидит строку розыгрыша. То, что вы использовали ради забавы, может использоваться и для куда более коварных целей. Вредоносное программное обеспечение, например, часто нацеливается на стартовые скрипты вроде .bashrc, чтобы закрепиться в системе на будущее.


В этом задании представим, что вы проникли на компьютер пользователя-жертвы! Этого пользователя зовут mokando, его домашний каталог — /home/mokando. Вы, как пользователь hacker, имеете доступ на запись к его .bashrc, а mokando имеет доступ на чтение к /flag.

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

Сможете ли вы получить флаг?

ПОДСКАЗКА:

Как и скрипты, которые вы изучали в модуле Объединение команд, скрипт .bashrc — это обычный shell-скрипт. Если добавить новую строку с командой (например, echo Hello Hackers), эта команда выполнится, так что всё, о чём нужно подумать, — это какая команда позволит вам получить флаг!

В /home/mokando/.bashrc жертвы уже будет много всего: запуск оболочки — дело сложное. Не паникуйте — просто добавьте свою полезную нагрузку в конец при помощи >>!

Connect with SSH

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

На предыдущем уровне Вы использовали ~/.bashrc Mokando, чтобы заставить его выполнять команды за Вас.

На этот раз mokando не хранит флаг в доступном для чтения файле после входа в систему. Вместо этого он запускает команду flag_checker, вручную вводя в неё флаг для проверки.

Ваша задача — воспользоваться сохранившимся доступом на запись к .bashrc mokando, чтобы перехватить этот флаг. Помните, как Вы перехватывали команды в модуле "Системная переменная PATH"? Сможете ли Вы использовать эту возможность, чтобы подменить flag_checker?

ПОДСКАЗКА: Mokando осторожен — он проверяет, что flag_checker выводит приглашение Введите флаг:. Убедитесь, что Ваша подмена тоже выводит это приглашение (например, echo "Введите флаг:").

Помимо вывода этого приглашения, поддельный flag_checker может:

  1. Просто вывести введённые Mokando данные на stdout с помощью cat (например, cat без аргументов)
  2. Считать их в переменную с помощью read и вывести её через echo.

Выбор за Вами!

P.S.: Не забудьте сделать Ваш поддельный flag_checker исполняемым, как Вы узнали в модуле "Права доступа в Linux"!

Connect with SSH

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

Mokando ограничил .bashrc для записи, так как этот пример был теоритическим, но существует более распространённый сценарий — когда пользователи одной системы, чтобы упростить совместную работу, делают свои домашние каталоги доступными для записи всем. В чём здесь проблема?

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

mokando@trick:~$ mkdir /tmp/collab
mokando@trick:~$ chmod a+w /tmp/collab
mokando@trick:~$ echo "Решать ctf.school" > /tmp/collab/todo-list

А затем приходит хакер и делает следующее, даже не будучи владельцем файла todo-list!

hacker@trick:~$ ls -l /tmp/collab/todo-list
-rw-r--r-- 1 mokando mokando 15 Jun  6 13:12 /tmp/collab/todo-list
hacker@trick:~$ rm /tmp/collab/todo-list
rm: remove write-protected regular file '/tmp/collab/todo-list'? y
hacker@trick:~$ echo "Отправить все свои деньги на ..." > /tmp/collab/todo-list
hacker@trick:~$ ls -l /tmp/collab/todo-list
-rw-r--r-- 1 hacker hacker 18 Jun  6 13:12 /tmp/collab/todo-list
hacker@trick:~$

Это может показаться нелогичным: у hacker нет доступа на запись к todo-list, но в итоге он может изменить его содержимое. Но взгляните на это иначе: связь файла с каталогом в конечном счёте хранится в самом каталоге, и пользователи с доступом на запись к этому каталогу могут её изменять. Разумеется, это создаёт угрозы безопасности, когда важные каталоги доступны для записи всем.


В этом задании для удобства mokando открыл доступ к своему домашнему каталогу:

mokando@trick:~$ chmod a+w /home/mokando

Как Вы знаете, в этом каталоге много чувствительных файлов, например .bashrc. Сможете ли Вы повторить предыдущую атаку, имея доступ на запись к /home/mokando вместо /home/mokando/.bashrc?

Connect with SSH

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

Mokando учел ошибки! Больше никакого общего домашнего каталога: несмотря на снижение удобства, Mokando перешёл на использование /tmp/collab. Он сделал этот каталог доступным для записи всем и начал вести в нём список опасных команд, чтобы не забыть!

mokando@trick:~$ mkdir /tmp/collab
mokando@trick:~$ chmod a+w /tmp/collab
mokando@trick:~$ echo "rm -rf /" > /tmp/collab/evil-commands.txt

В этом задании, когда Вы запускаете /challenge/victim, mokando добавит cat /flag в этот список команд:

hacker@trick:~$ /challenge/victim

Имя пользователя: mokando
Password: **********
mokando@trick:~$ echo "cat /flag" >> /tmp/collab/evil-commands.txt
mokando@trick:~$ exit
logout

hacker@trick:~$

Вспомните из предыдущего уровня, что, имея доступ на запись к /tmp/collab, пользователь hacker может заменить файл evil-commands.txt. Также вспомните из модуля "Базовые команды", что файлы могут ссылаться на другие файлы. Что произойдёт, если hacker заменит evil-commands.txt символической ссылкой на некий чувствительный файл, в который mokando может писать? Звучит интересно?

Вы знаете, на какой файл нужно сослаться. Проведите эту атаку и получите /flag (mokando может читать /flag).

ПОДСКАЗКА: Вам нужно будет запустить /challenge/victim дважды: один раз, чтобы записать cat /flag туда, куда нужно, и ещё раз, чтобы это выполнить!


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Опасно ли использовать /tmp???

Несмотря на показанную здесь атаку, /tmp можно использовать безопасно. Этот каталог действительно доступен для записи всем, но у него установлен особый бит прав доступа:

hacker@trick:~$ ls -ld /tmp
drwxrwxrwt 29 root root 1056768 Jun  6 14:06 /tmp
hacker@trick:~$

Этот бит t в конце. t — это sticky-бит (закрепляющий бит). Sticky-бит t означает, что каталог позволяет переименовывать или удалять файлы в нём только их владельцам. Он специально создан, чтобы предотвратить именно такую атаку!

Проблема в этом задании, конечно же, заключалась в том, что mokando не включил sticky-бит для /tmp/collab. Это закрыло бы уязвимость в данном конкретном случае:

mokando@trick:~$ chmod +t /tmp/collab

Разумеется, общие ресурсы, такие как доступные для записи всем каталоги, всё равно опасны. Позже мы рассмотрим множество способов, которыми такие ресурсы могут вызывать проблемы безопасности!

Connect with SSH

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

Вы уже могократно взломали Mokando, но он поумнел и защитил свой домашний каталог! Игра окончена?

Нет! Совсем. нет...

Одна из вещей, о которых люди часто не задумываются, когда на одном компьютере несколько учётных записей, — это то, какие данные утекают через аргументы запускаемых команд. Вспомните: когда Вы выполняете ps aux, Вы получаете:

hacker@trick:~$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hacker         1  0.0  0.0   1128     4 ?        Ss   05:34   0:00 /sbin/docker-init -- /bin/sleep 1h
hacker         7  0.0  0.0   2736   580 ?        S    05:34   0:00 /bin/sleep 1h
hacker       571  0.0  0.0   4600  4032 pts/0    Ss   05:35   0:00 /usr/bin/bash --init-file /usr/lib
hacker      1172  0.0  0.0   5892  2924 pts/0    R+   05:38   0:00 ps aux
hacker@trick:~$

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

Именно это и исследует данное задание. Mokando использует скрипт автоматизации, передавая ему пароль своей учётной записи в качестве аргумента. Mokando также имеет право на чтение /flag. Украдите пароль, войдите в учётную запись Mokando (вспомните команду su из модуля "Пользователи и пароли") и получите этот флаг!

Connect with SSH

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

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

Например, многие файлы в домашнем каталоге типичного пользователя по умолчанию доступны для чтения всем, хотя в них часто хранится чувствительная информация. Верите или нет, но Ваш .bashrc доступен для чтения всем, если Вы явно не измените это!

hacker@trick:~$ ls -l ~/.bashrc
-rw-r--r-- 1 hacker hacker 148 Jun  7 05:56 /home/hacker/.bashrc
hacker@trick:~$

Вы можете подумать: "Ну хотя бы он не доступен для записи всем по умолчанию"! Но даже доступность для чтения может нанести вред. Поскольку .bashrc обрабатывается оболочкой при запуске, именно туда люди обычно помещают инициализацию переменных окружения, которые хотят настроить. Чаще всего это безобидные вещи вроде PATH, но иногда там хранят API-ключи для удобного доступа. Например, в этом задании:

mokando@trick:~$ echo "FLAG_GETTER_API_KEY=sk-XXXYYYZZZ" > ~/.bashrc

После этого Mokando может легко обращаться к своему API-ключу. На этом уровне пользователи могут воспользоваться действительным API-ключом, чтобы получить флаг:

mokando@trick:~$ flag_getter --key $FLAG_GETTER_API_KEY
Верный API-ключ! Показать ключ (y/n)? y
ctf.school{XXX}
mokando@trick:~$

Естественно, Mokando хранит свой ключ в .bashrc. Сможете ли Вы украсть ключ и получить флаг?

Connect with SSH

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