Network Namespace

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

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

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

Ένα namespace δικτύου είναι μια δυνατότητα του πυρήνα του Linux που παρέχει απομόνωση του δικτύου, επιτρέποντας σε κάθε namespace δικτύου να έχει τη δική του ανεξάρτητη διαμόρφωση δικτύου, διεπαφές, διευθύνσεις IP, πίνακες δρομολόγησης και κανόνες της προστασίας της πρόσβασης. Αυτή η απομόνωση είναι χρήσιμη σε διάφορα σενάρια, όπως η ενσωμάτωση σε εμπορευματοκιβώτια, όπου κάθε εμπορευματοκιβώτιο θα πρέπει να έχει τη δική του διαμόρφωση δικτύου, ανεξάρτητα από άλλα εμπορευματοκιβώτια και το σύστημα του κεντρικού υπολογιστή.

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

  1. Όταν δημιουργείται ένα νέο namespace δικτύου, ξεκινά με ένα πλήρως απομονωμένο στοίβα δικτύου, χωρίς διεπαφές δικτύου εκτός από τη διεπαφή loopback (lo). Αυτό σημαίνει ότι οι διεργασίες που εκτελούνται στο νέο namespace δικτύου δεν μπορούν να επικοινωνήσουν με διεργασίες σε άλλα namespaces ή το σύστημα του κεντρικού υπολογιστή από προεπιλογή.

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

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

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

Εργαστήριο:

Δημιουργία διαφορετικών Namespaces

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

sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a

Με την προσάρτηση μιας νέας περίπτωσης του συστήματος αρχείων /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
# Run ifconfig or ip -a

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

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

ls -l /proc/$$/ns/net

This command will display the network namespace of your process. The $$ represents the process ID of the current shell.

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

Βρείτε όλα τα δίκτυα namespaces

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

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

Αναφορές

Last updated