UTS Namespace

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

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

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

Ένα UTS (UNIX Time-Sharing System) περιβάλλον είναι μια δυνατότητα του πυρήνα του Linux που παρέχει απομόνωση δύο αναγνωριστικών συστήματος: του ονόματος κεντρικού υπολογιστή και του ονόματος τομέα NIS (Network Information Service). Αυτή η απομόνωση επιτρέπει σε κάθε UTS περιβάλλον να έχει το δικό του ανεξάρτητο όνομα κεντρικού υπολογιστή και όνομα τομέα NIS, το οποίο είναι ιδιαίτερα χρήσιμο σε περιπτώσεις ενθυλάκωσης όπου κάθε ενθυλακωμένος χώρος θα πρέπει να εμφανίζεται ως ένα ξεχωριστό σύστημα με το δικό του όνομα κεντρικού υπολογιστή.

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

  1. Όταν δημιουργείται ένα νέο UTS περιβάλλον, ξεκινά με ένα αντίγραφο του ονόματος κεντρικού υπολογιστή και του ονόματος τομέα NIS από το γονικό περιβάλλον. Αυτό σημαίνει ότι, κατά τη δημιουργία, το νέο περιβάλλον μοιράζεται τα ίδια αναγνωριστικά με το γονικό περιβάλλον. Ωστόσο, οποιεσδήποτε μεταγενέστερες αλλαγές στο όνομα κεντρικού υπολογιστή ή στον τομέα NIS εντός του περιβάλλοντος δεν επηρεάζουν άλλα περιβάλλοντα.

  2. Οι διεργασίες εντός ενός UTS περιβάλλοντος μπορούν να αλλάξουν το όνομα κεντρικού υπολογιστή και τον τομέα NIS χρησιμοποιώντας τις κλήσεις συστήματος sethostname() και setdomainname() αντίστοιχα. Αυτές οι αλλαγές είναι τοπικές για το περιβάλλον και δεν επηρεάζουν άλλα περιβάλλοντα ή το σύστημα του κεντρικού υπολογιστή.

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

Εργαστήριο:

Δημιουργία διαφορετικών Περιβαλλόντων

Εντολική γραμμή

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

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

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

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

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

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

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

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

  1. Συνέπεια:

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

  1. Λύση:

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

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

Εξασφαλίζοντας ότι το unshare εκτελείται με τη σημαία -f, ο νέος χώρος ονομάτων PID διατηρείται σωστά, επιτρέποντας στο /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/$$/ns/uts

This will display the inode number of the UTS (Unix Timesharing System) namespace associated with your process.

ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr  4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'

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

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

Εισέρχονται μέσα σε ένα UTS namespace

nsenter -u TARGET_PID --pid /bin/bash

Επίσης, μπορείτε να εισέλθετε σε ένα άλλο namespace διεργασίας μόνο αν είστε root. Και δεν μπορείτε να εισέλθετε σε άλλο namespace χωρίς έναν περιγραφέα που να δείχνει προς αυτό (όπως /proc/self/ns/uts).

Αλλαγή ονόματος κεντρικού υπολογιστή

unshare -u /bin/bash
hostname newhostname # Hostname won't be changed inside the host UTS ns

Αναφορές

Last updated