Network Namespace

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) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

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 :

  1. 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.
  2. 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.
  3. 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.
  4. 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ème unshare() ou clone() avec le drapeau CLONE_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 :

  1. 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 que unshare. 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.
  1. 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 fonction alloc_pid à allouer un nouveau PID lors de la création d’un nouveau processus, produisant l’erreur “Impossible d’allouer de la mémoire”.
  1. Solution :
  • Le problème peut être résolu en utilisant l’option -f avec unshare. 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 commande unshare 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) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks