2049 - Pentesting NFS Service

Reading time: 9 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Основна інформація

NFS - це система, розроблена для клієнт/сервер, яка дозволяє користувачам безперешкодно отримувати доступ до файлів через мережу, ніби ці файли знаходяться в локальному каталозі.

Порт за замовчуванням: 2049/TCP/UDP (крім версії 4, їй потрібен лише TCP або UDP).

2049/tcp open  nfs     2-3 (RPC #100003

Аутентифікація

Помітним аспектом цього протоколу є його звичайна відсутність вбудованих механізмів аутентифікації або авторизації. Натомість авторизація покладається на інформацію файлової системи, при цьому серверу доручено точно перетворювати інформацію про користувача, надану клієнтом, у необхідний формат авторизації файлової системи, переважно дотримуючись синтаксису UNIX.

Аутентифікація зазвичай покладається на ідентифікатори UID/GID UNIX та членство в групах. Однак виникає проблема через потенційне невідповідність у відображеннях UID/GID між клієнтами та серверами, що не залишає місця для додаткової перевірки з боку сервера. Більше того, ці дані надсилаються клієнтом і довіряються сервером, тому зловмисний клієнт може потенційно вдаватися до іншого користувача, надсилаючи більш привілейовані uid та gid.

Однак зверніть увагу, що за замовчуванням неможливо видавати себе за UID 0 (root) за допомогою NFS. Більше про це в розділі про стиснення.

Хости

Для кращої (або деякої) авторизації ви можете вказати хости, які можуть отримати доступ до NFS-ресурсу. Це можна зробити у файлі Linux /etc/exports. Наприклад:

/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)

Як ви можете бачити, це дозволяє налаштувати конкретну IP або hostname для доступу до спільного ресурсу. Тільки ця адреса зможе отримати доступ до спільного ресурсу.

Версії

  • NFSv2: Цю версію визнано за її широку сумісність з різними системами, що підкреслює її значущість з початковими операціями, переважно через UDP. Будучи найстарішою у серії, вона заклала основу для майбутніх розробок.

  • NFSv3: Введена з рядом покращень, NFSv3 розширила можливості свого попередника, підтримуючи змінні розміри файлів і пропонуючи покращені механізми звітності про помилки. Незважаючи на свої досягнення, вона стикалася з обмеженнями в повній зворотній сумісності з клієнтами NFSv2.

  • NFSv4: Важлива версія в серії NFS, NFSv4 представила набір функцій, розроблених для модернізації обміну файлами через мережі. Помітні покращення включають інтеграцію Kerberos для високої безпеки, можливість проходження через брандмауери та роботи через Інтернет без необхідності в портмапперах, підтримку списків контролю доступу (ACL) та впровадження операцій на основі стану. Її покращення продуктивності та впровадження станового протоколу відрізняють NFSv4 як важливий крок вперед у технологіях обміну файлами в мережі.

  • Зверніть увагу, що дуже дивно знайти хост Linux NFS, що підтримує аутентифікацію kerberos.

Кожна версія NFS була розроблена з наміром задовольнити еволюційні потреби мережевих середовищ, поступово покращуючи безпеку, сумісність і продуктивність.

Стискання

Як згадувалося раніше, NFS зазвичай довіряє uid і gid клієнта для доступу до файлів (якщо не використовується kerberos). Однак є деякі конфігурації, які можна налаштувати на сервері, щоб змінити цю поведінку:

  • all_squash: Він стискає всі доступи, відображаючи кожного користувача та групу на nobody (65534 unsigned / -2 signed). Таким чином, всі є nobody, і жоден користувач не використовується.
  • root_squash/no_all_squash: Це за замовчуванням на Linux і лише стискає доступ з uid 0 (root). Таким чином, будь-який UID і GID довіряються, але 0 стискається до nobody (тому жодна імперсонація root не можлива).
  • no_root_squash: Ця конфігурація, якщо увімкнена, навіть не стискає користувача root. Це означає, що якщо ви змонтуєте каталог з цією конфігурацією, ви зможете отримати до нього доступ як root.

Перевірка підкаталогу

Доступно лише на Linux. man(5) exports говорить: "Якщо підкаталог файлової системи експортується, але вся файлова система не експортується, то щоразу, коли надходить запит NFS, сервер повинен перевірити не лише те, що доступний файл знаходиться в відповідній файловій системі (що легко), але й те, що він знаходиться в експортованому дереві (що складніше). Цю перевірку називають перевіркою підкаталогу."

У Linux функція subtree_check вимкнена за замовчуванням.

Перерахування

Showmount

Це можна використовувати для отримання інформації з сервера NFSv3, наприклад, списку експортів, хто дозволений отримати доступ до цих експорту, і які клієнти підключені (що може бути неточно, якщо клієнт відключається без повідомлення серверу). У клієнтів NFSv4 просто безпосередньо отримують доступ до /export і намагаються отримати доступ до експорту звідти, зазнаючи невдачі, якщо це недійсно або несанкціоновано з будь-якої причини.

Якщо інструменти, такі як showmount або модулі Metasploit, не показують інформацію з порту NFS, це потенційно сервер NFSv4, який не підтримує версію 3.

bash
showmount -e <IP>

Корисні скрипти nmap

bash
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share

Корисні модулі metasploit

bash
scanner/nfs/nfsmount #Scan NFS mounts and list permissions

nfs_analyze

Цей інструмент з https://github.com/hvs-consulting/nfs-security-tooling може бути використаний для отримання великої кількості даних з NFS сервера, таких як монтажі, підтримувані версії NFS, підключені IP-адреси, і навіть чи можливо вийти з експорту в інші папки у файловій системі або чи увімкнено no_root_squash.

Mounting

Щоб дізнатися, яка папка доступна на сервері для монтажу, ви можете запитати її, використовуючи:

bash
showmount -e <IP>

Потім змонтуйте його за допомогою:

bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock

Вам слід вказати використовувати версію 2, оскільки вона не має жодної автентифікації або авторизації.

Приклад:

bash
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock

Атаки

Довіра до UID та GID

Звісно, єдина проблема полягає в тому, що за замовчуванням неможливо видавати себе за root (UID 0). Однак, можливо видавати себе за будь-якого іншого користувача або, якщо увімкнено no_root_squash, ви також можете видавати себе за root.

  • Якщо ви монтуєте папку, яка містить файли або папки, доступні лише деяким користувачам (за UID). Ви можете створити локально користувача з цим UID і, використовуючи цього користувача, ви зможете отримати доступ до файлу/папки.
  • Інструмент fuse_nfs з https://github.com/hvs-consulting/nfs-security-tooling завжди надсилатиме необхідні UID та GID для доступу до файлів.

Підвищення привілеїв SUID

Перевірте сторінку:

NFS no_root_squash/no_all_squash misconfiguration PE

Втеча з експорту

У цій чудовій статті можна побачити, що можливо втекти з експорту, щоб отримати доступ до інших папок у файловій системі.

Отже, якщо експорт експортує папку, яка є підпапкою всіх файлових систем, можливо отримати доступ до файлів поза експортом, якщо subtree_check вимкнено. І за замовчуванням це вимкнено в Linux.

Наприклад, якщо NFS сервер експортує /srv/, а /var/ знаходиться в тій же файловій системі, можливо читати журнали з /var/log/ або зберігати веб-шелл у /var/www/.

Більше того, зверніть увагу, що за замовчуванням лише користувач root (0) захищений від видавання себе (перевірте розділ Squash). Однак, якщо файл належить root, але група не 0, до нього можна отримати доступ. Наприклад, файл /etc/shadow належить root, але група shadow (gid 42 на Debian). Отже, до нього можна отримати доступ за замовчуванням!

Інструмент nfs_analyze з https://github.com/hvs-consulting/nfs-security-tooling створений для підтримки цієї атаки проти файлових систем ext4, xfs, btrfs у версії 3 (також має бути можливим у v4).

NSFShell

Щоб легко перерахувати, монтувати та змінювати UID і GID для доступу до файлів, ви можете використовувати nfsshell.

Гарний туторіал по NFSShell.

Конфігураційні файли

/etc/exports
/etc/lib/nfs/etab

Небезпечні налаштування

  • Читання та запис прав (rw): Це налаштування дозволяє як читати з, так і записувати в файлову систему. Важливо враховувати наслідки надання такого широкого доступу.

  • Використання небезпечних портів (insecure): Коли це увімкнено, система може використовувати порти вище 1024. Безпека портів вище цього діапазону може бути менш суворою, що збільшує ризик.

  • Видимість вкладених файлових систем (nohide): Це налаштування робить каталоги видимими, навіть якщо інша файлова система змонтована нижче експортованого каталогу. Кожен каталог потребує власного запису експорту для належного управління.

  • Власність файлів root (no_root_squash): З цим налаштуванням файли, створені користувачем root, зберігають свій оригінальний UID/GID 0, ігноруючи принцип найменших привілеїв і потенційно надаючи надмірні права.

  • Несквашування всіх користувачів (no_all_squash): Ця опція забезпечує збереження ідентичностей користувачів по всій системі, що може призвести до проблем з правами доступу та контролем, якщо не буде належним чином оброблено.

Підвищення привілеїв за допомогою неправильних налаштувань NFS

NFS no_root_squash та no_all_squash підвищення привілеїв

HackTricks Автоматичні команди

Protocol_Name: NFS    #Protocol Abbreviation if there is one.
Port_Number:  2049     #Comma separated if there is more than one.
Protocol_Description: Network File System         #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for NFS
Note: |
NFS is a system designed for client/server that enables users to seamlessly access files over a network as though these files were located within a local directory.

#apt install nfs-common
showmount 10.10.10.180      ~or~showmount -e 10.10.10.180
should show you available shares (example /home)

mount -t nfs -o ver=2 10.10.10.180:/home /mnt/
cd /mnt
nano into /etc/passwd and change the uid (probably 1000 or 1001) to match the owner of the files if you are not able to get in

https://book.hacktricks.wiki/en/network-services-pentesting/nfs-service-pentesting.html

Entry_2:
Name: Nmap
Description: Nmap with NFS Scripts
Command: nmap --script=nfs-ls.nse,nfs-showmount.nse,nfs-statfs.nse -p 2049 {IP}

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks