mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
181 lines
17 KiB
Markdown
181 lines
17 KiB
Markdown
# 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}}
|