Network Namespace
Reading time: 6 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
Informations de base
Un espace de noms rĂ©seau est une fonctionnalitĂ© du noyau Linux qui fournit une isolation de la pile rĂ©seau, permettant Ă chaque espace de noms rĂ©seau d'avoir sa propre configuration rĂ©seau indĂ©pendante, interfaces, adresses IP, tables de routage et rĂšgles de pare-feu. Cette isolation est utile dans divers scĂ©narios, tels que la conteneurisation, oĂč chaque conteneur doit avoir sa propre configuration rĂ©seau, indĂ©pendante des autres conteneurs et du systĂšme hĂŽte.
Comment ça fonctionne :
- Lorsqu'un nouvel espace de noms réseau est créé, il commence avec une pile réseau complÚtement isolée, avec aucune interface réseau sauf pour l'interface de boucle (lo). Cela signifie que les processus s'exécutant dans le nouvel espace de noms réseau ne peuvent pas communiquer avec des processus dans d'autres espaces de noms ou le systÚme hÎte par défaut.
- Des interfaces rĂ©seau virtuelles, telles que des paires veth, peuvent ĂȘtre crĂ©Ă©es et dĂ©placĂ©es entre les espaces de noms rĂ©seau. Cela permet d'Ă©tablir une connectivitĂ© rĂ©seau entre les espaces de noms ou entre un espace de noms et le systĂšme hĂŽte. Par exemple, une extrĂ©mitĂ© d'une paire veth peut ĂȘtre placĂ©e dans l'espace de noms rĂ©seau d'un conteneur, et l'autre extrĂ©mitĂ© peut ĂȘtre connectĂ©e Ă un pont ou une autre interface rĂ©seau dans l'espace de noms hĂŽte, fournissant une connectivitĂ© rĂ©seau au conteneur.
- Les interfaces réseau au sein d'un espace de noms peuvent avoir leurs propres adresses IP, tables de routage et rÚgles de pare-feu, indépendamment des autres espaces de noms. Cela permet aux processus dans différents espaces de noms réseau d'avoir différentes configurations réseau et de fonctionner comme s'ils s'exécutaient sur des systÚmes réseau séparés.
- Les processus peuvent se déplacer entre les espaces de noms en utilisant l'appel systÚme
setns()
, ou créer de nouveaux espaces de noms en utilisant les appels systÚmeunshare()
ouclone()
avec le drapeauCLONE_NEWNET
. Lorsqu'un processus se déplace vers un nouvel espace de noms ou en crée un, il commencera à utiliser la configuration réseau et les interfaces associées à cet espace de noms.
Laboratoire :
Créer différents espaces de noms
CLI
sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a
En montant une nouvelle instance du systĂšme de fichiers /proc
si vous utilisez le paramĂštre --mount-proc
, vous vous assurez que le nouveau namespace de montage a une vue précise et isolée des informations de processus spécifiques à ce namespace.
Erreur : bash : fork : Impossible d'allouer de la mémoire
Lorsque unshare
est exécuté sans l'option -f
, une erreur est rencontrée en raison de la façon dont Linux gÚre les nouveaux namespaces PID (Process ID). Les détails clés et la solution sont décrits ci-dessous :
- Explication du problĂšme :
- Le noyau Linux permet à un processus de créer de nouveaux namespaces en utilisant l'appel systÚme
unshare
. Cependant, le processus qui initie la création d'un nouveau namespace PID (appelé le processus "unshare") n'entre pas dans le nouveau namespace ; seuls ses processus enfants le font. - L'exécution de
%unshare -p /bin/bash%
démarre/bin/bash
dans le mĂȘme processus queunshare
. Par conséquent,/bin/bash
et ses processus enfants se trouvent dans l'espace de noms PID d'origine. - Le premier processus enfant de
/bin/bash
dans le nouveau namespace devient PID 1. Lorsque ce processus se termine, il déclenche le nettoyage du namespace s'il n'y a pas d'autres processus, car PID 1 a le rÎle spécial d'adopter les processus orphelins. Le noyau Linux désactivera alors l'allocation de PID dans ce namespace.
- Conséquence :
- La sortie de PID 1 dans un nouveau namespace entraĂźne le nettoyage du drapeau
PIDNS_HASH_ADDING
. Cela entraĂźne l'Ă©chec de la fonctionalloc_pid
à allouer un nouveau PID lors de la création d'un nouveau processus, produisant l'erreur "Impossible d'allouer de la mémoire".
- Solution :
- Le problĂšme peut ĂȘtre rĂ©solu en utilisant l'option
-f
avecunshare
. Cette option permet Ăunshare
de forker un nouveau processus aprÚs avoir créé le nouveau namespace PID. - L'exécution de
%unshare -fp /bin/bash%
garantit que la commandeunshare
elle-mĂȘme devient PID 1 dans le nouveau namespace./bin/bash
et ses processus enfants sont alors en toute sĂ©curitĂ© contenus dans ce nouveau namespace, empĂȘchant la sortie prĂ©maturĂ©e de PID 1 et permettant une allocation normale de PID.
En veillant Ă ce que unshare
s'exécute avec le drapeau -f
, le nouveau namespace PID est correctement maintenu, permettant Ă /bin/bash
et à ses sous-processus de fonctionner sans rencontrer l'erreur d'allocation de mémoire.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a
VĂ©rifiez dans quel espace de noms se trouve votre processus
ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
Trouver tous les espaces de noms réseau
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>
Entrer dans un espace de noms réseau
nsenter -n TARGET_PID --pid /bin/bash
Aussi, vous ne pouvez entrer dans un autre espace de noms de processus que si vous ĂȘtes root. Et vous ne pouvez pas entrer dans un autre espace de noms sans un descripteur pointant vers celui-ci (comme /proc/self/ns/net
).
Références
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.