IPC Namespace

Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Informazioni di base

Uno spazio dei nomi IPC (Inter-Process Communication) è una funzionalità del kernel Linux che fornisce isolamento degli oggetti IPC di System V, come code di messaggi, segmenti di memoria condivisa e semafori. Questo isolamento garantisce che i processi in diversi spazi dei nomi IPC non possano accedere direttamente o modificare gli oggetti IPC degli altri, fornendo uno strato aggiuntivo di sicurezza e privacy tra i gruppi di processi.

Come funziona:

  1. Quando viene creato un nuovo spazio dei nomi IPC, inizia con un insieme completamente isolato di oggetti IPC di System V. Ciò significa che i processi in esecuzione nel nuovo spazio dei nomi IPC non possono accedere o interferire con gli oggetti IPC in altri spazi dei nomi o nel sistema host per impostazione predefinita.

  2. Gli oggetti IPC creati all'interno di uno spazio dei nomi sono visibili e accessibili solo ai processi all'interno di quel namespace. Ogni oggetto IPC è identificato da una chiave univoca all'interno del suo spazio dei nomi. Sebbene la chiave possa essere identica in diversi spazi dei nomi, gli oggetti stessi sono isolati e non possono essere accessibili tra spazi dei nomi.

  3. I processi possono spostarsi tra gli spazi dei nomi utilizzando la chiamata di sistema setns() o creare nuovi spazi dei nomi utilizzando le chiamate di sistema unshare() o clone() con il flag CLONE_NEWIPC. Quando un processo si sposta in un nuovo spazio dei nomi o ne crea uno, inizierà a utilizzare gli oggetti IPC associati a quel namespace.

Laboratorio:

Creare spazi dei nomi diversi

CLI

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

Montando una nuova istanza del filesystem /proc utilizzando il parametro --mount-proc, si garantisce che il nuovo namespace di montaggio abbia una visione accurata e isolata delle informazioni specifiche dei processi in quel namespace.

Errore: bash: fork: Impossibile allocare memoria

Quando unshare viene eseguito senza l'opzione -f, si verifica un errore a causa del modo in cui Linux gestisce i nuovi namespace PID (Process ID). Di seguito sono riportati i dettagli chiave e la soluzione:

  1. Spiegazione del problema:

  • Il kernel Linux consente a un processo di creare nuovi namespace utilizzando la chiamata di sistema unshare. Tuttavia, il processo che avvia la creazione di un nuovo namespace PID (chiamato "unshare" process) non entra nel nuovo namespace; solo i suoi processi figlio lo fanno.

  • L'esecuzione di %unshare -p /bin/bash% avvia /bin/bash nello stesso processo di unshare. Di conseguenza, /bin/bash e i suoi processi figlio si trovano nel namespace PID originale.

  • Il primo processo figlio di /bin/bash nel nuovo namespace diventa PID 1. Quando questo processo termina, viene avviata la pulizia del namespace se non ci sono altri processi, poiché il PID 1 ha il ruolo speciale di adottare i processi orfani. Il kernel Linux disabiliterà quindi l'allocazione di PID in quel namespace.

  1. Conseguenza:

  • L'uscita del PID 1 in un nuovo namespace porta alla pulizia del flag PIDNS_HASH_ADDING. Ciò comporta il fallimento della funzione alloc_pid nell'allocazione di un nuovo PID durante la creazione di un nuovo processo, producendo l'errore "Impossibile allocare memoria".

  1. Soluzione:

  • Il problema può essere risolto utilizzando l'opzione -f con unshare. Questa opzione fa sì che unshare crei un nuovo processo dopo aver creato il nuovo namespace PID.

  • Eseguendo %unshare -fp /bin/bash% si garantisce che il comando unshare stesso diventi PID 1 nel nuovo namespace. /bin/bash e i suoi processi figlio sono quindi contenuti in modo sicuro all'interno di questo nuovo namespace, evitando l'uscita prematura del PID 1 e consentendo un'allocazione normale dei PID.

Assicurandosi che unshare venga eseguito con l'opzione -f, il nuovo namespace PID viene mantenuto correttamente, consentendo a /bin/bash e ai suoi sottoprocessi di funzionare senza incontrare l'errore di allocazione della memoria.

Docker

docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

Verifica in quale namespace si trova il tuo processo

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

Per verificare in quale namespace si trova il tuo processo, puoi utilizzare il seguente comando:

$ ls -l /proc/<PID>/ns/ipc

Replace <PID> with the process ID of your target process. This command will display the inode number of the IPC namespace associated with the process.

Sostituisci <PID> con l'ID del processo di destinazione. Questo comando visualizzerà il numero di inode dello spazio dei nomi IPC associato al processo.

ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr  4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'

Trova tutti i namespace IPC

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

```bash nsenter -i TARGET_PID --pid /bin/bash ``` Inoltre, puoi **entrare in un altro namespace di processo solo se sei root**. E **non puoi** **entrare** in un altro namespace senza un descrittore che punti ad esso (come `/proc/self/ns/net`).

Creare un oggetto IPC

# Container
sudo unshare -i /bin/bash
ipcmk -M 100
Shared memory id: 0
ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x2fba9021 0          root       644        100        0

# From the host
ipcs -m # Nothing is seen

Riferimenti

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated