# 2049 - Pentesting NFS Service {{#include ../banners/hacktricks-training.md}} ## **Основна інформація** **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 ``` ### Корисні скрипти 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](https://github.com/hvs-consulting/nfs-security-tooling) може бути використаний для отримання великої кількості даних з NFS сервера, таких як **монтажі**, підтримувані версії NFS, підключені IP-адреси, і навіть чи можливо **вийти з експорту** в інші папки у файловій системі або **чи увімкнено `no_root_squash`**. ## Mounting Щоб дізнатися, **яка папка** доступна на сервері для монтажу, ви можете запитати її, використовуючи: ```bash showmount -e ``` Потім змонтуйте його за допомогою: ```bash mount -t nfs [-o vers=2] : -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](https://github.com/hvs-consulting/nfs-security-tooling) завжди надсилатиме необхідні UID та GID для доступу до файлів. ### Підвищення привілеїв SUID Перевірте сторінку: {{#ref}} ../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md {{#endref}} ### Втеча з експорту У цій [чудовій статті](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) можна побачити, що можливо **втекти з експорту, щоб отримати доступ до інших папок у файловій системі**. Отже, якщо експорт експортує папку, яка є **підпапкою** **всіх файлових систем**, можливо отримати доступ до файлів поза експортом, якщо **`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](https://github.com/hvs-consulting/nfs-security-tooling) створений для підтримки цієї атаки проти файлових систем ext4, xfs, btrfs у версії 3 (також має бути можливим у v4). ### NSFShell Щоб легко перерахувати, монтувати та змінювати UID і GID для доступу до файлів, ви можете використовувати [nfsshell](https://github.com/NetDirect/nfsshell). [Гарний туторіал по NFSShell.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/) ## Конфігураційні файли ``` /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 підвищення привілеїв](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md) ## 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} ``` {{#include ../banners/hacktricks-training.md}}