June 29, 2021

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

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

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

Что такое NFS

NFS (Network File System; Сетевая файловая система) представляет собой протокол, не использующий шифрования, для передачи файлов между системами. В чем же проблема? Примерно в половине случаев во время пентестов внутренних сетей мы находим NFS-сервера с небезопасными настройками, когда доступен неавторизированный доступ к конфиденциальной информации, что в некоторых случаях позволяет получить полноценный шелл в системе. Уровень доступа во многом зависит от конфигурации NFS.

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

  1. Права доступа для монтирования могут быть ограничены по имени хоста или IP-адресу в файле /etc/exports, однако во многих случаях никакие ограничения не используются. Важно отметить, что IP-адрес и имена хостов легко сымитировать (если вы знаете, что имитировать).
  2. Файловый доступ также можно настроить через экспорты в /etc/exports, когда указываем пометки на чтение/запись. Затем доступ к файлам ограничивается по UID подключающегося пользователя, который легко подделать. Однако нужно отметить, что что есть методы защиты от этой угрозы, как, например, опция «root squashing», которая может быть активирована там же /etc/exports с целью запрета доступа с UID равным 0, соответствующего пользователю root.

Основная проблема NFS

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

Ниже показана схема возникновения непреднамеренного доступа:

  1. На сервере «Server 1» есть пользователь с именем «User1» (UID=1111).
  2. Пользователь User1 создает файл с именем «secret» и делает доступным только хозяину и пользователю root при помощи команды «chmod 600 secret».
  3. Затем на сервере «Server 1» создается NFS-экспорт с правами на чтение/запись без всяких ограничений по IP-адресу, который связан с каталогом, где находится файл «secret» пользователя User1.
  4. В другой клиентской системе с Линуксом есть пользователь «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-портов

Текущие поддерживаемые версии 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

Ниже приводится видео, где показан процесс обнаружения 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
Получение перечня доступных NFS-экспортов при помощи Metasploit

Пример с showmount:

apt-get install samba
showmount -e 192.168.1.171
Получение перечня доступных NFS-экспортов при помощи showmount

Монтирование 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
Монтирование NFS-экспортов

Просмотр UID’ов у каталогов и файлов в NFS-экспортах

Если у вас полный доступ ко всему, тогда функция «root squashing» возможно отключена. Однако если вы получаете сообщения об отказе в доступе, то нужно сымитировать UID владельца файла и перемонтировать NFS-экспорт для получения доступа (в этой статье эта техника не рассматривается).

Просмотр UID’ов на подключенном диске:

ls -an
Просмотр UID’ов непосредственно на подключенном диске

Просмотр UID’ов при помощи nmap:

nmap --script=nfs-ls 192.168.1.171 -p 111
Просмотр UID’ов при помощи nmap

Поиск паролей и секретных ключей (получение непривилегированного доступа)

Предположим, что мы смогли получить доступ к NFS с правами root или другого пользователя. Пришло время поискать пароли и ключи для доступа к удаленному серверу. Секретные ключи обычно находятся в директориях /home/<user>/.ssh, а пароли, как правило, разбросаны повсюду.

Ищем файлы, в имени которых есть слово «password»:

cd demo
find ./ -name "*password*"
cat ./test/password.txt
Поиск файлов, имя которых содержит слово «password»

Ищем секретные ключи в директориях .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

Ниже показан пример, который вы можете встретить во время пентеста.

Перечень файлов с флагом setuid

Повторимся еще раз. Обычно наша цель – заставить бинарный файл выполнять произвольный код с правами 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-серверов.