Mount Namespace

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Βασικές Πληροφορίες

Ο χώρος ονομάτων mount είναι μια δυνατότητα του πυρήνα Linux που παρέχει απομόνωση των σημείων προσάρτησης του συστήματος αρχείων που βλέπονται από μια ομάδα διεργασιών. Κάθε χώρος ονομάτων mount έχει το δικό του σύνολο σημείων προσάρτησης του συστήματος αρχείων και οι αλλαγές στα σημεία προσάρτησης σε έναν χώρο ονομάτων δεν επηρεάζουν άλλους χώρους ονομάτων. Αυτό σημαίνει ότι οι διεργασίες που εκτελούνται σε διαφορετικούς χώρους ονομάτων mount μπορούν να έχουν διαφορετικές απόψεις της ιεραρχίας του συστήματος αρχείων.

Οι χώροι ονομάτων mount είναι ιδιαίτερα χρήσιμοι στην ενθυλάκωση, όπου κάθε ενθυλακωμένος χώρος θα πρέπει να έχει το δικό του σύστημα αρχείων και διαμόρφωση, απομονωμένο από άλλους ενθυλακωμένους χώρους και το σύστημα του κεντρικού υπολογιστή.

Πώς λειτουργεί:

  1. Όταν δημιουργείται ένας νέος χώρος ονομάτων mount, αρχικοποιείται με ένα αντίγραφο των σημείων προσάρτησης από τον γονικό χώρο ονομάτων του. Αυτό σημαίνει ότι, κατά τη δημιουργία, ο νέος χώρος ονομάτων μοιράζεται την ίδια απεικόνιση του συστήματος αρχείων με τον γονικό του. Ωστόσο, οποιεσδήποτε μεταγενέστερες αλλαγές στα σημεία προσάρτησης εντός του χώρου ονομάτων δεν επηρεάζουν τον γονικό χώρο ονομάτων ή άλλους χώρους ονομάτων.

  2. Όταν μια διεργασία τροποποιεί ένα σημείο προσάρτησης εντός του χώρου ονομάτων της, όπως προσαρτά ή αποσυνδέει ένα σύστημα αρχείων, η αλλαγή είναι τοπική σε αυτόν τον χώρο ονομάτων και δεν επηρεάζει άλλους χώρους ονομάτων. Αυτό επιτρέπει σε κάθε χώρο ονομάτων να έχει τη δική του ανεξάρτητη ιεραρχία συστήματος αρχείων.

  3. Οι διεργασίες μπορούν να μετακινηθούν μεταξύ χώρων ονομάτων χρησιμοποιώντας την κλήση συστήματος setns(), ή να δημιουργήσουν νέους χώρους ονομάτων χρησιμοποιώντας τις κλήσεις συστήματος unshare() ή clone() με τη σημαία CLONE_NEWNS. Όταν μια διεργασία μετακινείται σε έναν νέο χώρο ονομάτων ή δημιουργεί έναν νέο, θα αρχίσει να χρησιμοποιεί τα σημεία προσάρτησης που σχετίζονται με αυτόν τον χώρο ονομάτων.

  4. Οι περιγραφείς αρχείων και οι inodes κοινοποιούνται σε όλους τους χώρους ονομάτων, πράγμα που σημαίνει ότι αν μια διεργασία σε έναν χώρο ονομάτων έχει έναν ανοιχτό περιγραφέα αρχείου που δείχνει σε ένα αρχείο, μπορεί να περάσει αυτόν τον περιγραφέα αρχείου σε μια διεργασία σε άλλο χώρο ονομάτων, και και οι δύο διεργασίες θα έχουν πρόσβαση στο ίδιο αρχείο. Ωστόσο, η διαδρομή του αρχείου μπορεί να μην είναι η ίδια σε και τους δύο χώρους ονομάτων λόγω διαφορών στα σημεία προσάρτησης.

Εργαστήριο:

Δημιουργία διαφορετικών Χώρων Ονομάτων

Εντολή CLI

sudo unshare -m [--mount-proc] /bin/bash

Με την προσάρτηση μιας νέας περίπτωσης του αρχείου /proc εάν χρησιμοποιήσετε την παράμετρο --mount-proc, εξασφαλίζετε ότι ο νέος περιβάλλοντος προσάρτησης έχει μια ακριβή και απομονωμένη προβολή των πληροφοριών διεργασίας που είναι συγκεκριμένες για αυτό το περιβάλλον.

Σφάλμα: bash: fork: Δεν είναι δυνατή η δέσμευση μνήμης

Όταν το unshare εκτελείται χωρίς την επιλογή -f, συναντάται ένα σφάλμα λόγω του τρόπου με τον οποίο το Linux χειρίζεται τα νέα PID (Process ID) namespaces. Τα κύρια στοιχεία και η λύση παρουσιάζονται παρακάτω:

  1. Εξήγηση του προβλήματος:

  • Ο πυρήνας του Linux επιτρέπει σε μια διεργασία να δημιουργήσει νέα namespaces χρησιμοποιώντας την κλήση συστήματος unshare. Ωστόσο, η διεργασία που προκαλεί τη δημιουργία ενός νέου PID namespace (αναφέρεται ως "διεργασία unshare") δεν εισέρχεται στο νέο namespace, μόνο οι διεργασίες παιδιά της.

  • Η εκτέλεση %unshare -p /bin/bash% ξεκινά το /bin/bash στην ίδια διεργασία με το unshare. Ως αποτέλεσμα, το /bin/bash και οι διεργασίες παιδιά του βρίσκονται στο αρχικό PID namespace.

  • Η πρώτη διεργασία παιδί του /bin/bash στο νέο namespace γίνεται PID 1. Όταν αυτή η διεργασία τερματίζει, ενεργοποιείται η εκκαθάριση του namespace αν δεν υπάρχουν άλλες διεργασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διεργασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την εκχώρηση PID σε αυτό το namespace.

  1. Συνέπεια:

  • Η έξοδος του PID 1 σε ένα νέο namespace οδηγεί στην απενεργοποίηση της σημαίας PIDNS_HASH_ADDING. Αυτό έχει ως αποτέλεσμα την αποτυχία της συνάρτησης alloc_pid να δεσμεύσει ένα νέο PID κατά τη δημιουργία μιας νέας διεργασίας, παράγοντας το σφάλμα "Cannot allocate memory".

  1. Λύση:

  • Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή -f με το unshare. Αυτή η επιλογή κάνει το unshare να δημιουργήσει ένα νέο διεργασία μετά τη δημιουργία του νέου PID namespace.

  • Εκτελώντας %unshare -fp /bin/bash% εξασφαλίζεται ότι η εντολή unshare ίδια γίνεται PID 1 στο νέο namespace. Το /bin/bash και οι διεργασίες παιδιά του περιορίζονται στο νέο αυτό namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική εκχώρηση PID.

Εξασφαλίζοντας ότι το unshare εκτελείται με τη σημαία -f, το νέο PID namespace διατηρείται σωστά, επιτρέποντας στο /bin/bash και τις υποδιεργασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα δέσμευσης μνήμης.

docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

Ελέγξτε σε ποιο namespace βρίσκεται η διεργασία σας

To check which namespace your process is in, you can use the following command:

cat /proc/$$/mountinfo | grep "ns"

This command will display the mount namespace information for your process.

ls -l /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 Apr  4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'

Βρείτε όλα τα Mount namespaces

sudo find /proc -maxdepth 3 -type l -name mnt -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name mnt -exec ls -l  {} \; 2>/dev/null | grep <ns-number>

```bash nsenter -m TARGET_PID --pid /bin/bash ``` Επίσης, μπορείτε να **εισέλθετε σε ένα άλλο namespace διεργασίας μόνο αν είστε root**. Και **δεν μπορείτε** να **εισέλθετε** σε άλλο namespace **χωρίς έναν περιγραφέα** που να δείχνει προς αυτό (όπως `/proc/self/ns/mnt`).

Επειδή οι νέες προσαρτήσεις είναι προσβάσιμες μόνο εντός του namespace, είναι δυνατόν ένα namespace να περιέχει ευαίσθητες πληροφορίες που μπορούν να προσπελαστούν μόνο από αυτό.

Προσάρτηση κάτι

# Generate new mount ns
unshare -m /bin/bash
mkdir /tmp/mount_ns_example
mount -t tmpfs tmpfs /tmp/mount_ns_example
mount | grep tmpfs # "tmpfs on /tmp/mount_ns_example"
echo test > /tmp/mount_ns_example/test
ls /tmp/mount_ns_example/test # Exists

# From the host
mount | grep tmpfs # Cannot see "tmpfs on /tmp/mount_ns_example"
ls /tmp/mount_ns_example/test # Doesn't exist

Αναφορές

Last updated