Namespace UTS
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di base
Un UTS (UNIX Time-Sharing System) namespace è una funzionalità del kernel Linux che fornisce isolamento di due identificatori di sistema: il hostname e il NIS (Network Information Service) nome di dominio. Questo isolamento permette a ogni UTS namespace di avere il proprio hostname e nome di dominio NIS indipendenti, cosa particolarmente utile negli scenari di containerization dove ogni container dovrebbe apparire come un sistema separato con il proprio hostname.
Come funziona:
- Quando viene creato un nuovo UTS namespace, esso inizia con una copia dell’hostname e del nome di dominio NIS dal suo namespace padre. Questo significa che, alla creazione, il nuovo namespace scondivide gli stessi identificatori del suo namespace padre. Tuttavia, qualsiasi modifica successiva all’hostname o al nome di dominio NIS all’interno del namespace non influenzerà gli altri namespace.
- I processi all’interno di un UTS namespace possono cambiare l’hostname e il nome di dominio NIS usando le system call
sethostname()esetdomainname(), rispettivamente. Queste modifiche sono locali al namespace e non influenzano altri namespace o il sistema host. - I processi possono spostarsi tra namespace usando la system call
setns()o creare nuovi namespace usando le system callunshare()oclone()con il flagCLONE_NEWUTS. Quando un processo si sposta in un nuovo namespace o ne crea uno, inizierà a usare l’hostname e il nome di dominio NIS associati a quel namespace.
Laboratorio:
Creare diversi Namespace
CLI
sudo unshare -u [--mount-proc] /bin/bash
Montando una nuova istanza del filesystem /proc usando il parametro --mount-proc, si assicura che il nuovo mount namespace abbia una vista accurata e isolata delle informazioni sui processi specifiche di quel namespace.
Error: bash: fork: Cannot allocate memory
When unshare is executed without the -f option, an error is encountered due to the way Linux handles new PID (Process ID) namespaces. The key details and the solution are outlined below:
- Spiegazione del problema:
- Il kernel Linux permette a un processo di creare nuovi namespace usando la system call
unshare. Tuttavia, il processo che avvia la creazione di un nuovo PID namespace (indicato come il processo “unshare”) non entra nel nuovo namespace; soltanto i suoi processi figli lo fanno. - Eseguire
%unshare -p /bin/bash%avvia/bin/bashnello stesso processo diunshare. Di conseguenza,/bin/bashe i suoi processi figli rimangono nel PID namespace originale. - Il primo processo figlio di
/bin/bashnel nuovo namespace diventa PID 1. Quando questo processo termina, innesca la pulizia del namespace se non ci sono altri processi, poiché PID 1 ha il ruolo speciale di adottare i processi orfani. Il kernel Linux disabiliterà quindi l’assegnazione di PID in quel namespace.
- Conseguenza:
- L’uscita di PID 1 in un nuovo namespace porta alla rimozione del flag
PIDNS_HASH_ADDING. Questo fa sì che la funzionealloc_pidnon riesca ad allocare un nuovo PID quando viene creato un nuovo processo, producendo l’errore “Cannot allocate memory”.
- Soluzione:
- Il problema può essere risolto usando l’opzione
-fconunshare. Questa opzione fa sì cheunshareesegua un fork di un nuovo processo dopo aver creato il nuovo PID namespace. - Eseguire
%unshare -fp /bin/bash%assicura che il comandounsharestesso diventi PID 1 nel nuovo namespace./bin/bashe i suoi processi figli sono così contenuti in modo sicuro all’interno di questo nuovo namespace, evitando l’uscita prematura di PID 1 e permettendo la normale allocazione dei PID.
Assicurandosi che unshare venga eseguito con il flag -f, il nuovo PID namespace viene mantenuto correttamente, permettendo a /bin/bash e ai suoi sotto-processi di operare senza incontrare l’errore di allocazione memoria.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Controlla in quale namespace si trova il tuo processo
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Trova tutti i namespace UTS
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Entrare in un namespace UTS
nsenter -u TARGET_PID --pid /bin/bash
Abuso della condivisione UTS dell’host
Se un container viene avviato con --uts=host, si unisce al namespace UTS dell’host invece di ottenere uno isolato. Con capability (ad es. --cap-add SYS_ADMIN), il codice nel container può modificare l’hostname/NIS name dell’host tramite sethostname()/setdomainname():
docker run --rm -it --uts=host --cap-add SYS_ADMIN alpine sh -c "hostname hacked-host && exec sh"
# Hostname on the host will immediately change to "hacked-host"
Modificare il nome host può manomettere i log/gli avvisi, confondere la discovery del cluster o rompere le configurazioni TLS/SSH che vincolano il nome host.
Rilevare container che condividono UTS con l’host
docker ps -aq | xargs -r docker inspect --format '{{.Id}} UTSMode={{.HostConfig.UTSMode}}'
# Shows "host" when the container uses the host UTS namespace
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


