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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основна інформація
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.
showmount -e <IP>
Корисні скрипти nmap
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share
Корисні модулі metasploit
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
Щоб дізнатися, яка папка доступна на сервері для монтажу, ви можете запитати її, використовуючи:
showmount -e <IP>
Потім змонтуйте його за допомогою:
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
Вам слід вказати використовувати версію 2, оскільки вона не має жодної автентифікації або авторизації.
Приклад:
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.
Конфігураційні файли
/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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.