Network Namespace

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Informations de base

Un espace de noms réseau est une fonctionnalité du noyau Linux qui permet l'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épendamment des autres conteneurs et du système hôte.

Comment cela fonctionne :

  1. Lorsqu'un nouvel espace de noms réseau est créé, il démarre avec une pile réseau complètement isolée, sans interfaces réseau à l'exception de l'interface de bouclage (lo). Cela signifie que les processus s'exécutant dans le nouvel espace de noms réseau ne peuvent pas communiquer avec les 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 des configurations réseau différentes et de fonctionner comme s'ils s'exécutaient sur des systèmes réseau distincts.

  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 en utilisant 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 manière dont Linux gère les nouveaux espaces de noms 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 espaces de noms en utilisant l'appel système unshare. Cependant, le processus qui initie la création d'un nouveau namespace PID (appelé 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 le namespace PID d'origine.

  • Le premier processus enfant de /bin/bash dans le nouveau namespace devient le PID 1. Lorsque ce processus se termine, il déclenche la suppression du namespace s'il n'y a pas d'autres processus, car le PID 1 a le rôle spécial d'adopter les processus orphelins. Le noyau Linux désactive alors l'allocation de PID dans ce namespace.

  1. Conséquence :

  • La sortie du PID 1 dans un nouveau namespace entraîne la suppression du drapeau PIDNS_HASH_ADDING. Cela provoque l'échec de la fonction alloc_pid pour 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 fait en sorte que unshare fork un nouveau processus après la création du nouveau namespace PID.

  • L'exécution de %unshare -fp /bin/bash% garantit que la commande unshare elle-même devient le 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 du PID 1 et permettant une allocation normale des 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érifier 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 nom 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

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Dernière mise à jour