Методы проникновения в линуксовые системы (часть 2): NFS
В этой статье мы рассмотрим сценарий атаки на небезопасные NFS экспорты и конфигурации флага setuid для получения шелла в Линуксе с правами суперпользователя.
Статья будет полезна как начинающим пентестерам, так и тем, кто желает освежить знания по NFS. Это вторая из пяти частей серии, где будут затронуты методы первоначального проникновения и повышения локальных привилегий в Линуксе, используемые во время настоящих сетевых пентестов.
Что такое NFS
NFS (Network File System; Сетевая файловая система) представляет собой протокол, не использующий шифрования, для передачи файлов между системами. В чем же проблема? Примерно в половине случаев во время пентестов внутренних сетей мы находим NFS-сервера с небезопасными настройками, когда доступен неавторизированный доступ к конфиденциальной информации, что в некоторых случаях позволяет получить полноценный шелл в системе. Уровень доступа во многом зависит от конфигурации NFS.
Для удаленного доступа к директориям, совместно используемым через NFS-экспорты, требуется два условия: права доступа для монтирования и для файлов.
- Права доступа для монтирования могут быть ограничены по имени хоста или IP-адресу в файле /etc/exports, однако во многих случаях никакие ограничения не используются. Важно отметить, что IP-адрес и имена хостов легко сымитировать (если вы знаете, что имитировать).
- Файловый доступ также можно настроить через экспорты в /etc/exports, когда указываем пометки на чтение/запись. Затем доступ к файлам ограничивается по UID подключающегося пользователя, который легко подделать. Однако нужно отметить, что что есть методы защиты от этой угрозы, как, например, опция «root squashing», которая может быть активирована там же /etc/exports с целью запрета доступа с UID равным 0, соответствующего пользователю root.
Основная проблема NFS
Если возможно смонтировать NFS-экспорты, обычно UID можно подделать на клиенте для обхода ограничений, связанных с правами доступа к файлам, настроенными для каталога, доступного через NFS-экспорт. Кроме того, доступ может быть разрешен случайно, если UID файла и UID подключающегося пользователя совпадают.
Ниже показана схема возникновения непреднамеренного доступа:
- На сервере «Server 1» есть пользователь с именем «User1» (UID=1111).
- Пользователь User1 создает файл с именем «secret» и делает доступным только хозяину и пользователю root при помощи команды «chmod 600 secret».
- Затем на сервере «Server 1» создается NFS-экспорт с правами на чтение/запись без всяких ограничений по IP-адресу, который связан с каталогом, где находится файл «secret» пользователя User1.
- В другой клиентской системе с Линуксом есть пользователь «User2», у которого UID=1111. Когда пользователь «User2» смонтирует NFS-экспорт, находящийся на сервере «Server 1», то сможет читать секретный файл, поскольку имеет тот же UID, что и UID у владельца (user1) файла secret.
Ниже показана наглядная иллюстрация этого сценария.
Поиск NFS-серверов
NFS работает на UDP/TCP портах 111 и 2049 соответственно. Поиск открытых NFS-портов можно выполнить при помощи утилит навроде nmap.
nmap -sS -pT:2049,111,U:2049,111 192.168.1.0/24 -oA nfs_scan grep -i "open" nfs_scan.gnmap
Текущие поддерживаемые версии NFS также можно определить при помощи nmap или rpcinfo, что пригодится нам в дальнейшем, поскольку мы хотим использовать версию 3 или ниже с целью просмотра и имитации UID хозяев файлов. В случае если опция «root squashing» включена, может быть требование для доступа к файлам.
Получение перечня поддерживаемых версий NFS при помощи Nmap:
nmap -sV -p111,2049 192.168.1.171
Получение перечня поддерживаемых версий NFS при помощи rpcinfo:
apt-get install nfs-client rpcinfo -p 192.168.1.171
Ниже приводится видео, где показан процесс обнаружения NFS-сервера.
http://blog.netspi.com/wp-content/uploads/2020/03/NFS_ATTACK_DEMO_1.mp4
Перечень NFS-экспортов
Пришла очередь получить перечень доступных NFS-экспортов на удаленном сервере при помощи Metasploit или showmount.
Пример с Metasploit:
root@kali:~# msfconsole msf > use auxiliary/scanner/nfs/nfsmount msf auxiliary(nfsmount) > set rhosts 192.168.1.171 msf auxiliary(nfsmount) > run
Пример с showmount:
apt-get install samba showmount -e 192.168.1.171
Монтирование NFS-экспортов
Переходим к монтированию доступных NFS-экспортов, работая от имени root. Не забудьте указать флаг «-o vers=3», чтобы быть уверенным, что вы можете просматривать UID’ы владельцев файлов. Ниже показаны опции для монтирования экспорта:
mkdir demo mount -o vers=3 192.168.1.171:/home demo mount -o vers=3 192.168.1.222:/home demo -o nolock
или
mount -t nfs -o vers=3 192.168.1.171:/home demo
или
mount -t nfs4 -o proto=tcp,port=2049 192.168.1.171:/home demo
Просмотр UID’ов у каталогов и файлов в NFS-экспортах
Если у вас полный доступ ко всему, тогда функция «root squashing» возможно отключена. Однако если вы получаете сообщения об отказе в доступе, то нужно сымитировать UID владельца файла и перемонтировать NFS-экспорт для получения доступа (в этой статье эта техника не рассматривается).
Просмотр UID’ов на подключенном диске:
ls -an
Просмотр UID’ов при помощи nmap:
nmap --script=nfs-ls 192.168.1.171 -p 111
Поиск паролей и секретных ключей (получение непривилегированного доступа)
Предположим, что мы смогли получить доступ к NFS с правами root или другого пользователя. Пришло время поискать пароли и ключи для доступа к удаленному серверу. Секретные ключи обычно находятся в директориях /home/<user>/.ssh, а пароли, как правило, разбросаны повсюду.
Ищем файлы, в имени которых есть слово «password»:
cd demo find ./ -name "*password*" cat ./test/password.txt
Ищем секретные ключи в директориях .ssh:
mount 192.168.1.222:/ demo2/ cd demo2 find ./ -name "id_rsa" cat ./root/.ssh/id_rsa
Ниже показано короткое видео, с демонстрацией процесса монтирования и поиска файлов:
http://blog.netspi.com/wp-content/uploads/2020/03/NFS_ATTACK_DEMO_2.mp4
Эксплуатация бинарных файлов с флагом Setuid (получение прав суперпользователя)
Как только у нас появился интерактивный шелл под именем пользователя с минимальными привилегиями (test), дальше есть множество путей по расширению полномочий. Однако в этот раз мы сосредоточимся на бинарных файлах с флагом setuid, который дает возможность запуска с правами владельца. Схожим образом, бинарные файлы с флагом setguid позволяют выполнение с правами группы, связанной с файлом. С точки зрения администратора у этой возможности есть как плюсы, так и минусы.
- Хорошая новость: бинарные файлы с флагом setuid могут использоваться для безопасного запуска привилегированных команд, как, например, passwd.
- Плохая новость: бинарные файлы с флагом setuid могут использоваться для расширения привилегий, если этими файлами владеет root, и позволено прямое выполнение произвольных команд или косвенное выполнение произвольных команд через плагины/модули.
Ниже показаны команды для поиска бинарных файлов с флагами setuid и setguid.
Поиск бинарных файлов с флагом setuid:
find / -perm -u=s -type f 2>/dev/null
Поиск бинарных файлов с флагом setguid:
find / -perm -g=s -type f 2>/dev/null
Ниже показан пример, который вы можете встретить во время пентеста.
Повторимся еще раз. Обычно наша цель – заставить бинарный файл выполнять произвольный код с правами root. В реальной жизни потребуется небольшое исследование или реверс-инжиниринг бинарных файлов с флагом setuid с целью разработки наилучшего способа для решения вышеупомянутой задачи. В нашем случае бинарный файл /home/test/exec позволяет напрямую выполнять команды операционной системы с правами суперпользователя. Исходный код примера можно скачать по ссылке https://github.com/nullbind/Other-Projects/blob/master/random/exec.c.
Ниже показаны примеры команд и скриншот с результатами выполнения:
cd /home/test/ ./exec whoami
Как видно из рисунка выше, можно выполнять произвольные команды с правами суперпользователя без каких-либо проблем. Ниже показано видео, где демонстрируется использование файлов с флагом setuid.
http://blog.netspi.com/wp-content/uploads/2020/03/NFS_ATTACK_DEMO_3.mp4
Заключение
В этой статье был продемонстрирован один из способов получения шелла с правами суперпользователя в удаленной системе с Линуксом при помощи уязвимого NFS-экспорта и небезопасного бинарного файла с флагом setuid. Хотя существует множество методов решения одной задачи, я считаю, что мораль истории такова: все типы совместно используемых сетевых ресурсов должны быть сконфигурированы с минимально возможными привилегиями с целью предотвращения неправомерного доступа к данным и системам. Надеюсь, эта статья окажется полезной для начинающих пентестеров и специалистов по безопасности, которые пытаются оценить потенциальные риски, связанные с небезопасной конфигурацией NFS-серверов.