mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
181 lines
19 KiB
Markdown
181 lines
19 KiB
Markdown
# 2049 - Pentesting NFS Service
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## **Βασικές Πληροφορίες**
|
||
|
||
**NFS** είναι ένα σύστημα σχεδιασμένο για **client/server** που επιτρέπει στους χρήστες να έχουν απρόσκοπτη πρόσβαση σε αρχεία μέσω ενός δικτύου, σαν να βρίσκονταν αυτά τα αρχεία σε τοπικό κατάλογο.
|
||
|
||
**Προεπιλεγμένη θύρα**: 2049/TCP/UDP (εκτός από την έκδοση 4, χρειάζεται μόνο TCP ή UDP).
|
||
```
|
||
2049/tcp open nfs 2-3 (RPC #100003
|
||
```
|
||
### Authentication
|
||
|
||
Ένα αξιοσημείωτο χαρακτηριστικό αυτού του πρωτοκόλλου είναι η συνήθης έλλειψη ενσωματωμένων **μηχανισμών αυθεντικοποίησης** ή **εξουσιοδότησης**. Αντίθετα, η εξουσιοδότηση βασίζεται σε **πληροφορίες συστήματος αρχείων**, με τον διακομιστή να έχει την ευθύνη να μεταφράσει με ακρίβεια τις **παρεχόμενες από τον πελάτη πληροφορίες χρήστη** στη απαιτούμενη **μορφή εξουσιοδότησης** του συστήματος αρχείων, ακολουθώντας κυρίως τη **σύνταξη UNIX**.
|
||
|
||
Η αυθεντικοποίηση συνήθως βασίζεται σε **αναγνωριστικά `UID`/`GID` UNIX και μέλη ομάδων**. Ωστόσο, προκύπτει μια πρόκληση λόγω της πιθανής ασυμφωνίας στις **χαρτογραφήσεις `UID`/`GID`** μεταξύ πελατών και διακομιστών, αφήνοντας κανένα περιθώριο για επιπλέον επαλήθευση από τον διακομιστή. Επιπλέον, αυτές οι λεπτομέρειες αποστέλλονται από τον πελάτη και εμπιστεύονται από τον διακομιστή, οπότε ένας κακόβουλος πελάτης θα μπορούσε δυνητικά να **παριστάνει έναν άλλο χρήστη στέλνοντας πιο προνομιούχους `uid` και `gid`.
|
||
|
||
**Ωστόσο, σημειώστε ότι από προεπιλογή δεν είναι δυνατή η μίμηση του `UID` 0 (root) χρησιμοποιώντας NFS. Περισσότερα για αυτό στην ενότητα squashing.**
|
||
|
||
#### Hosts
|
||
|
||
Για καλύτερη (ή κάποια) εξουσιοδότηση, μπορείτε να καθορίσετε τους **διακομιστές** που μπορούν να έχουν πρόσβαση στο NFS share. Αυτό μπορεί να γίνει στο αρχείο Linux `/etc/exports`. Για παράδειγμα:
|
||
```
|
||
/PATH/TO/EXPORT CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
|
||
/media/disk/share 192.168.2.123(rw,sec=krb5p:krb5i)
|
||
```
|
||
Όπως μπορείτε να δείτε, επιτρέπει τη ρύθμιση μιας συγκεκριμένης **IP** ή **hostname** για την πρόσβαση στο share. Μόνο αυτή η διεύθυνση θα μπορεί να έχει πρόσβαση στο share.
|
||
|
||
### Εκδόσεις
|
||
|
||
- **NFSv2**: Αυτή η έκδοση αναγνωρίζεται για την ευρεία συμβατότητά της με διάφορα συστήματα, επισημαίνοντας τη σημασία της με τις αρχικές λειτουργίες κυρίως μέσω UDP. Όντας η **παλαιότερη** στη σειρά, έθεσε τα θεμέλια για μελλοντικές εξελίξεις.
|
||
|
||
- **NFSv3**: Εισήχθη με μια σειρά βελτιώσεων, το NFSv3 επεκτάθηκε σε σχέση με τον προκάτοχό του υποστηρίζοντας μεταβλητά μεγέθη αρχείων και προσφέροντας βελτιωμένους μηχανισμούς αναφοράς σφαλμάτων. Παρά τις προόδους του, αντιμετώπισε περιορισμούς στην πλήρη οπισθοδρόμηση συμβατότητας με πελάτες NFSv2.
|
||
|
||
- **NFSv4**: Μια ορόσημο έκδοση στη σειρά NFS, το NFSv4 παρουσίασε μια σειρά χαρακτηριστικών σχεδιασμένων να εκσυγχρονίσουν την κοινή χρήση αρχείων μέσω δικτύων. Σημαντικές βελτιώσεις περιλαμβάνουν την ενσωμάτωση του Kerberos για **υψηλή ασφάλεια**, τη δυνατότητα διέλευσης τειχών προστασίας και λειτουργίας μέσω του Διαδικτύου χωρίς την ανάγκη για portmappers, υποστήριξη για Access Control Lists (ACLs) και την εισαγωγή λειτουργιών βασισμένων σε κατάσταση. Οι βελτιώσεις στην απόδοση και η υιοθέτηση ενός πρωτοκόλλου με κατάσταση διακρίνουν το NFSv4 ως μια καθοριστική πρόοδο στις τεχνολογίες κοινής χρήσης δικτυακών αρχείων.
|
||
- Σημειώστε ότι είναι πολύ περίεργο να βρείτε έναν Linux host NFS που να υποστηρίζει την αυθεντικοποίηση kerberos.
|
||
|
||
Κάθε έκδοση του NFS έχει αναπτυχθεί με σκοπό να καλύψει τις εξελισσόμενες ανάγκες των δικτυακών περιβαλλόντων, προοδευτικά ενισχύοντας την ασφάλεια, τη συμβατότητα και την απόδοση.
|
||
|
||
### Squashing
|
||
|
||
Όπως αναφέρθηκε προηγουμένως, το 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**, όπως η λίστα των **exports**, ποιος είναι **επιτρεπτός να έχει πρόσβαση** σε αυτές τις εξαγωγές και ποιοι πελάτες είναι συνδεδεμένοι (που μπορεί να είναι ανακριβές αν ένας πελάτης αποσυνδεθεί χωρίς να ενημερώσει τον διακομιστή).
|
||
Στους **NFSv4 οι πελάτες απλά έχουν άμεση πρόσβαση στο /export** και προσπαθούν να αποκτήσουν πρόσβαση σε εξαγωγές από εκεί, αποτυγχάνοντας αν είναι μη έγκυρες ή μη εξουσιοδοτημένες για οποιονδήποτε λόγο.
|
||
|
||
Αν εργαλεία όπως το `showmount` ή τα modules του 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
|
||
```
|
||
### Χρήσιμα modules του 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 server όπως **mounts**, υποστηριζόμενες εκδόσεις NFS, συνδεδεμένες IPs, και ακόμη και αν είναι δυνατό να **ξεφύγεις από τις εξαγωγές** σε άλλους φακέλους στο FS ή **αν είναι ενεργοποιημένο το `no_root_squash`**.
|
||
|
||
## Mounting
|
||
|
||
Για να μάθετε **ποιος φάκελος** είναι **διαθέσιμος** από τον server για να τον κάνετε mount, μπορείτε να ρωτήσετε χρησιμοποιώντας:
|
||
```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/) είναι δυνατόν να δείτε ότι είναι δυνατόν να **διαφύγετε από τις εξαγωγές για να έχετε πρόσβαση σε άλλους φακέλους στο FS**.
|
||
|
||
Επομένως, αν μια εξαγωγή εξάγει έναν φάκελο που είναι **υποφάκελος** του **ολόκληρου συστήματος αρχείων**, είναι δυνατόν να έχετε πρόσβαση σε αρχεία εκτός της εξαγωγής αν το **`subtree_check`** είναι απενεργοποιημένο. Και είναι **απενεργοποιημένο από προεπιλογή στο Linux**.
|
||
|
||
Για παράδειγμα, αν ένας NFS server εξάγει το `/srv/` και το `/var/` είναι στο ίδιο σύστημα αρχείων, είναι δυνατόν να διαβάσετε τα logs από το `/var/log/` ή να αποθηκεύσετε ένα webshell στο `/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).
|
||
|
||
[Ωραίο tutorial για το NFSShell.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
|
||
|
||
## Αρχεία ρυθμίσεων
|
||
```
|
||
/etc/exports
|
||
/etc/lib/nfs/etab
|
||
```
|
||
## Επικίνδυνες ρυθμίσεις
|
||
|
||
- **Δικαιώματα Ανάγνωσης και Εγγραφής (`rw`):** Αυτή η ρύθμιση επιτρέπει τόσο την ανάγνωση όσο και την εγγραφή στο σύστημα αρχείων. Είναι σημαντικό να εξεταστούν οι επιπτώσεις της παροχής τέτοιας ευρείας πρόσβασης.
|
||
|
||
- **Χρήση Ανασφαλών Θυρών (`insecure`):** Όταν είναι ενεργοποιημένο, αυτό επιτρέπει στο σύστημα να χρησιμοποιεί θύρες πάνω από το 1024. Η ασφάλεια των θυρών πάνω από αυτό το εύρος μπορεί να είναι λιγότερο αυστηρή, αυξάνοντας τον κίνδυνο.
|
||
|
||
- **Ορατότητα Ενσωματωμένων Συστήματων Αρχείων (`nohide`):** Αυτή η ρύθμιση καθιστά τους καταλόγους ορατούς ακόμη και αν ένα άλλο σύστημα αρχείων είναι τοποθετημένο κάτω από έναν εξαγόμενο κατάλογο. Κάθε κατάλογος απαιτεί τη δική του καταχώρηση εξαγωγής για σωστή διαχείριση.
|
||
|
||
- **Ιδιοκτησία Αρχείων Ρίζας (`no_root_squash`):** Με αυτή τη ρύθμιση, τα αρχεία που δημιουργούνται από τον χρήστη ρίζας διατηρούν το αρχικό τους 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}}
|