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

181 lines
12 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.

# 2049 - Pentesting NFS Service
{{#include ../banners/hacktricks-training.md}}
## **Grundlegende Informationen**
**NFS** ist ein System, das für **Client/Server** konzipiert ist und es Benutzern ermöglicht, nahtlos auf Dateien über ein Netzwerk zuzugreifen, als ob sich diese Dateien in einem lokalen Verzeichnis befinden würden.
**Standardport**: 2049/TCP/UDP (außer Version 4, es benötigt nur TCP oder UDP).
```
2049/tcp open nfs 2-3 (RPC #100003
```
### Authentifizierung
Ein bemerkenswerter Aspekt dieses Protokolls ist das übliche Fehlen von integrierten **Authentifizierungs**- oder **Autorisierungsmechanismen**. Stattdessen basiert die Autorisierung auf **Dateisysteminformationen**, wobei der Server dafür verantwortlich ist, die **vom Client bereitgestellten Benutzerinformationen** in das erforderliche **Autorisierungsformat** des Dateisystems genau zu übersetzen, hauptsächlich gemäß der **UNIX-Syntax**.
Die Authentifizierung stützt sich häufig auf **UNIX `UID`/`GID`-Identifikatoren und Gruppenmitgliedschaften**. Ein Problem ergibt sich jedoch aufgrund der möglichen Diskrepanz in den **`UID`/`GID`-Zuordnungen** zwischen Clients und Servern, was keinen Raum für zusätzliche Überprüfungen durch den Server lässt. Darüber hinaus werden diese Details vom Client gesendet und vom Server vertraut, sodass ein böswilliger Client möglicherweise **einen anderen Benutzer imitieren kann, indem er privilegierte `uid` und `gid`s sendet.**
**Beachten Sie jedoch, dass es standardmäßig nicht möglich ist, den `UID` 0 (root) mit NFS zu imitieren. Weitere Informationen dazu finden Sie im Abschnitt über Squashing.**
#### Hosts
Für eine bessere (oder einige) Autorisierung können Sie die **Hosts** angeben, die auf den NFS-Share zugreifen können. Dies kann in der Linux-Datei `/etc/exports` erfolgen. Zum Beispiel:
```
/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)
```
As you can see, es ermöglicht die Konfiguration einer spezifischen **IP** oder **Hostname**, um auf den Share zuzugreifen. Nur diese Adresse wird in der Lage sein, auf den Share zuzugreifen.
### Versionen
- **NFSv2**: Diese Version ist bekannt für ihre breite Kompatibilität mit verschiedenen Systemen und markiert ihre Bedeutung mit anfänglichen Operationen, die überwiegend über UDP durchgeführt werden. Als die **älteste** in der Reihe legte sie den Grundstein für zukünftige Entwicklungen.
- **NFSv3**: Eingeführt mit einer Reihe von Verbesserungen, erweiterte NFSv3 seinen Vorgänger, indem es variable Dateigrößen unterstützte und verbesserte Fehlerberichterstattungsmechanismen bot. Trotz seiner Fortschritte hatte es Einschränkungen in der vollständigen Abwärtskompatibilität mit NFSv2-Clients.
- **NFSv4**: Eine wegweisende Version in der NFS-Serie, brachte NFSv4 eine Reihe von Funktionen mit sich, die darauf abzielen, die Dateifreigabe über Netzwerke zu modernisieren. Zu den bemerkenswerten Verbesserungen gehören die Integration von Kerberos für **hohe Sicherheit**, die Fähigkeit, Firewalls zu durchqueren und über das Internet ohne die Notwendigkeit von Portmappern zu arbeiten, Unterstützung für Access Control Lists (ACLs) und die Einführung von zustandsbasierten Operationen. Die Leistungsverbesserungen und die Einführung eines zustandsbehafteten Protokolls heben NFSv4 als einen entscheidenden Fortschritt in der Technologie der Netzwerkdateifreigabe hervor.
- Beachten Sie, dass es sehr seltsam ist, einen Linux-Host zu finden, der NFS mit Kerberos-Authentifizierung unterstützt.
Jede Version von NFS wurde mit dem Ziel entwickelt, die sich entwickelnden Bedürfnisse von Netzwerkumgebungen zu adressieren und schrittweise Sicherheit, Kompatibilität und Leistung zu verbessern.
### Squashing
Wie bereits erwähnt, wird NFS normalerweise dem `uid` und `gid` des Clients vertrauen, um auf die Dateien zuzugreifen (wenn Kerberos nicht verwendet wird). Es gibt jedoch einige Konfigurationen, die auf dem Server eingestellt werden können, um **dieses Verhalten zu ändern**:
- **all_squash**: Es squasht alle Zugriffe, indem jeder Benutzer und jede Gruppe auf **`nobody`** (65534 unsigned / -2 signed) abgebildet wird. Daher ist jeder `nobody` und es werden keine Benutzer verwendet.
- **root_squash/no_all_squash**: Dies ist standardmäßig auf Linux und **squasht nur Zugriffe mit uid 0 (root)**. Daher werden alle `UID` und `GID` vertraut, aber `0` wird auf `nobody` gesquasht (so ist keine Root-Impersonation möglich).
- **no_root_squash**: Diese Konfiguration, wenn aktiviert, squasht nicht einmal den Root-Benutzer. Das bedeutet, dass Sie, wenn Sie ein Verzeichnis mit dieser Konfiguration einhängen, als Root darauf zugreifen können.
### Subtree-Check
Nur verfügbar auf Linux. man(5) exports sagt: "Wenn ein Unterverzeichnis eines Dateisystems exportiert wird, das gesamte Dateisystem jedoch nicht, muss der Server bei jedem NFS-Antrag nicht nur überprüfen, dass die zugegriffene Datei im entsprechenden Dateisystem ist (was einfach ist), sondern auch, dass sie im exportierten Baum ist (was schwieriger ist). Diese Überprüfung wird als Subtree-Check bezeichnet."
In Linux ist die **`subtree_check`-Funktion standardmäßig deaktiviert**.
## Enumeration
### Showmount
Dies kann verwendet werden, um **Informationen von einem NFSv3-Server zu erhalten**, wie die Liste der **Exports**, wer **berechtigt ist, auf** diese Exports zuzugreifen, und welche Clients verbunden sind (was ungenau sein kann, wenn ein Client sich trennt, ohne dem Server Bescheid zu geben).
In **NFSv4 greifen Clients direkt auf die /export** zu und versuchen, von dort auf Exports zuzugreifen, wobei sie fehlschlagen, wenn es ungültig oder aus irgendeinem Grund nicht autorisiert ist.
Wenn Tools wie `showmount` oder Metasploit-Module keine Informationen von einem NFS-Port anzeigen, handelt es sich möglicherweise um einen NFSv4-Server, der Version 3 nicht unterstützt.
```bash
showmount -e <IP>
```
### Nützliche nmap-Skripte
```bash
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share
```
### Nützliche Metasploit-Module
```bash
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
```
### nfs_analyze
Dieses Tool von [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) kann verwendet werden, um viele Daten von einem NFS-Server zu erhalten, wie **Mounts**, unterstützte NFS-Versionen, verbundene IPs und sogar, ob es möglich ist, **aus den Exports** in andere Ordner im FS zu **entkommen** oder **ob `no_root_squash` aktiviert ist**.
## Mounting
Um zu wissen, **welcher Ordner** dem Server **verfügbar** ist, um ihn zu mounten, kannst du ihn fragen mit:
```bash
showmount -e <IP>
```
Dann mounten Sie es mit:
```bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
```
Sie sollten **Version 2** angeben, da sie **keine** **Authentifizierung** oder **Autorisierung** hat.
**Beispiel:**
```bash
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
```
## Angriffe
### Vertrauen auf UID und GID
Natürlich ist das einzige Problem hier, dass es standardmäßig nicht möglich ist, root (`UID` 0) zu impersonieren. Es ist jedoch möglich, jeden anderen Benutzer zu impersonieren oder, wenn `no_root_squash` aktiviert ist, auch root zu impersonieren.
- Wenn Sie einen Ordner einhängen, der **Dateien oder Ordner enthält, die nur von einem bestimmten Benutzer** (durch **UID**) zugänglich sind. Sie können **lokal** einen Benutzer mit dieser **UID** erstellen und mit diesem **Benutzer** werden Sie in der Lage sein, die Datei/den Ordner zu **zugreifen**.
- Das Tool **`fuse_nfs`** von [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) sendet im Grunde immer die benötigte UID und GID, um auf die Dateien zuzugreifen.
### SUID Privilegieneskalation
Überprüfen Sie die Seite:
{{#ref}}
../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
{{#endref}}
### Entkommen von den Exports
In diesem [großartigen Artikel](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) ist es möglich zu sehen, dass es möglich ist, **von den Exports zu entkommen, um auf andere Ordner im FS zuzugreifen**.
Daher, wenn ein Export einen Ordner exportiert, der ein **Unterordner** des **gesamten Dateisystems** ist, ist es möglich, Dateien außerhalb des Exports zuzugreifen, wenn **`subtree_check`** deaktiviert ist. Und es ist **standardmäßig in Linux deaktiviert**.
Zum Beispiel, wenn ein NFS-Server `/srv/` exportiert und `/var/` im selben Dateisystem ist, ist es möglich, Protokolle von `/var/log/` zu lesen oder eine Webshell in `/var/www/` zu speichern.
Darüber hinaus beachten Sie, dass standardmäßig nur der root (0) Benutzer davor geschützt ist, impersoniert zu werden (überprüfen Sie den Squash-Bereich). Wenn jedoch eine Datei **von root besessen wird, die Gruppe jedoch nicht 0 ist, ist es möglich, darauf zuzugreifen**. Zum Beispiel ist die Datei `/etc/shadow` im Besitz von root, aber die Gruppe ist `shadow` (gid 42 auf Debian). Daher ist es standardmäßig möglich, sie zu lesen!
Das Tool **`nfs_analyze`** von [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) wurde entwickelt, um diesen Angriff gegen die Dateisysteme ext4, xfs, btrfs in der Version 3 zu unterstützen (es sollte auch in v4 möglich sein).
### NSFShell
Um einfach aufzulisten, zu mounten und UID und GID zu ändern, um Zugriff auf Dateien zu haben, können Sie [nfsshell](https://github.com/NetDirect/nfsshell) verwenden.
[Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
## Konfigurationsdateien
```
/etc/exports
/etc/lib/nfs/etab
```
## Gefährliche Einstellungen
- **Lese- und Schreibberechtigungen (`rw`):** Diese Einstellung erlaubt sowohl das Lesen als auch das Schreiben im Dateisystem. Es ist wichtig, die Auswirkungen einer so breiten Zugriffsgewährung zu berücksichtigen.
- **Verwendung unsicherer Ports (`insecure`):** Wenn aktiviert, erlaubt dies dem System, Ports über 1024 zu nutzen. Die Sicherheit von Ports in diesem Bereich kann weniger streng sein, was das Risiko erhöht.
- **Sichtbarkeit von verschachtelten Dateisystemen (`nohide`):** Diese Konfiguration macht Verzeichnisse sichtbar, selbst wenn ein anderes Dateisystem unter einem exportierten Verzeichnis gemountet ist. Jedes Verzeichnis benötigt einen eigenen Exporteintrag für eine ordnungsgemäße Verwaltung.
- **Besitz von Root-Dateien (`no_root_squash`):** Mit dieser Einstellung behalten Dateien, die vom Root-Benutzer erstellt werden, ihre ursprüngliche UID/GID von 0, wodurch das Prinzip der minimalen Berechtigung missachtet wird und potenziell übermäßige Berechtigungen gewährt werden.
- **Nicht-Squashing aller Benutzer (`no_all_squash`):** Diese Option stellt sicher, dass die Benutzeridentitäten im gesamten System erhalten bleiben, was zu Berechtigungs- und Zugriffssteuerungsproblemen führen kann, wenn es nicht korrekt behandelt wird.
## Privilegienerhöhung durch NFS-Misconfigurationen
[NFS no_root_squash und no_all_squash Privilegienerhöhung](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md)
## HackTricks Automatische Befehle
```
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}}