hacktricks/src/network-services-pentesting/nfs-service-pentesting.md

181 lines
17 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 <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](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](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}}