UTS Namespace
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Informaci贸n B谩sica
Un namespace UTS (UNIX Time-Sharing System) es una caracter铆stica del n煤cleo de Linux que proporciona aislamiento de dos identificadores del sistema: el nombre de host y el nombre de dominio NIS (Network Information Service). Este aislamiento permite que cada namespace UTS tenga su propio nombre de host y nombre de dominio NIS independientes, lo cual es particularmente 煤til en escenarios de contenedorizaci贸n donde cada contenedor debe aparecer como un sistema separado con su propio nombre de host.
C贸mo funciona:
- Cuando se crea un nuevo namespace UTS, comienza con una copia del nombre de host y del nombre de dominio NIS de su namespace padre. Esto significa que, al momento de la creaci贸n, el nuevo namespace comparte los mismos identificadores que su padre. Sin embargo, cualquier cambio posterior en el nombre de host o en el nombre de dominio NIS dentro del namespace no afectar谩 a otros namespaces.
- Los procesos dentro de un namespace UTS pueden cambiar el nombre de host y el nombre de dominio NIS utilizando las llamadas al sistema
sethostname()
ysetdomainname()
, respectivamente. Estos cambios son locales al namespace y no afectan a otros namespaces o al sistema host. - Los procesos pueden moverse entre namespaces utilizando la llamada al sistema
setns()
o crear nuevos namespaces utilizando las llamadas al sistemaunshare()
oclone()
con la banderaCLONE_NEWUTS
. Cuando un proceso se mueve a un nuevo namespace o crea uno, comenzar谩 a usar el nombre de host y el nombre de dominio NIS asociados con ese namespace.
Laboratorio:
Crear diferentes Namespaces
CLI
sudo unshare -u [--mount-proc] /bin/bash
Al montar una nueva instancia del sistema de archivos /proc
si usas el par谩metro --mount-proc
, aseguras que el nuevo espacio de montaje tenga una vista precisa y aislada de la informaci贸n del proceso espec铆fica de ese espacio de nombres.
Error: bash: fork: Cannot allocate memory
Cuando se ejecuta unshare
sin la opci贸n -f
, se encuentra un error debido a la forma en que Linux maneja los nuevos espacios de nombres de PID (ID de Proceso). Los detalles clave y la soluci贸n se describen a continuaci贸n:
- Explicaci贸n del Problema:
- El n煤cleo de Linux permite a un proceso crear nuevos espacios de nombres utilizando la llamada al sistema
unshare
. Sin embargo, el proceso que inicia la creaci贸n de un nuevo espacio de nombres de PID (denominado proceso "unshare") no entra en el nuevo espacio de nombres; solo lo hacen sus procesos hijos. - Ejecutar
%unshare -p /bin/bash%
inicia/bin/bash
en el mismo proceso queunshare
. En consecuencia,/bin/bash
y sus procesos hijos est谩n en el espacio de nombres de PID original. - El primer proceso hijo de
/bin/bash
en el nuevo espacio de nombres se convierte en PID 1. Cuando este proceso sale, desencadena la limpieza del espacio de nombres si no hay otros procesos, ya que PID 1 tiene el papel especial de adoptar procesos hu茅rfanos. El n煤cleo de Linux deshabilitar谩 entonces la asignaci贸n de PID en ese espacio de nombres.
- Consecuencia:
- La salida de PID 1 en un nuevo espacio de nombres lleva a la limpieza de la bandera
PIDNS_HASH_ADDING
. Esto resulta en que la funci贸nalloc_pid
falle al intentar asignar un nuevo PID al crear un nuevo proceso, produciendo el error "Cannot allocate memory".
- Soluci贸n:
- El problema se puede resolver utilizando la opci贸n
-f
conunshare
. Esta opci贸n hace queunshare
cree un nuevo proceso despu茅s de crear el nuevo espacio de nombres de PID. - Ejecutar
%unshare -fp /bin/bash%
asegura que el comandounshare
en s铆 se convierta en PID 1 en el nuevo espacio de nombres./bin/bash
y sus procesos hijos est谩n entonces contenidos de manera segura dentro de este nuevo espacio de nombres, previniendo la salida prematura de PID 1 y permitiendo la asignaci贸n normal de PID.
Al asegurarte de que unshare
se ejecute con la bandera -f
, el nuevo espacio de nombres de PID se mantiene correctamente, permitiendo que /bin/bash
y sus subprocesos operen sin encontrar el error de asignaci贸n de memoria.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Verifica en qu茅 namespace est谩 tu proceso
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Encontrar todos los namespaces 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>
Entrar dentro de un namespace UTS
nsenter -u TARGET_PID --pid /bin/bash
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.