UTS prostor imena
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
UTS (UNIX Time-Sharing System) namespace je funkcionalnost Linux kernela koja obezbeđuje isolation of two system identifiers: hostname i NIS (Network Information Service) domain name. Ova izolacija omogućava svakom UTS namespace-u da ima own independent hostname and NIS domain name, što je naročito korisno u scenarijima containerization-a gde svaki kontejner treba da se pojavi kao poseban sistem sa sopstvenim hostname-om.
Kako to radi:
- Kada se kreira novi UTS namespace, on počinje sa copy of the hostname and NIS domain name from its parent namespace. To znači da novo namespace prilikom kreiranja shares the same identifiers as its parent. Međutim, sve kasnije izmene hostname-a ili NIS domain name-a unutar tog namespace-a neće uticati na druge namespace-ove.
- Procesi unutar UTS namespace-a can change the hostname and NIS domain name koristeći
sethostname()isetdomainname()sistemske pozive, respektivno. Te izmene su lokalne za taj namespace i ne utiču na druge namespace-ove niti na host sistem. - Procesi mogu da se premeste između namespace-ova koristeći
setns()sistemski poziv ili da kreiraju nove namespace-ove koristećiunshare()iliclone()sistemske pozive saCLONE_NEWUTSflagom. Kada se proces premesti u novi namespace ili ga kreira, počinje da koristi hostname i NIS domain name povezane sa tim namespace-om.
Vežba:
Kreiranje različitih namespace-ova
CLI
sudo unshare -u [--mount-proc] /bin/bash
By mounting a new instance of the /proc filesystem if you use the param --mount-proc, you ensure that the new mount namespace has an accurate and isolated view of the process information specific to that namespace.
Error: bash: fork: Cannot allocate memory
Kada se unshare izvrši bez opcije -f, javlja se greška zbog načina na koji Linux rukuje novim PID (Process ID) namespace-ovima. Ključni detalji i rešenje su navedeni u nastavku:
- Objašnjenje problema:
- Linux kernel omogućava procesu da kreira nove namespace-ove koristeći sistemski poziv
unshare. Međutim, proces koji inicira kreiranje novog PID namespace-a (nazivan “unshare” proces) ne ulazi u novi namespace; u njega ulaze samo njegovi podprocesi. - Pokretanje
%unshare -p /bin/bash%pokreće/bin/bashu istom procesu kaounshare. Kao posledica,/bin/bashi njegovi podprocesi su u originalnom PID namespace-u. - Prvi podproces
/bin/bashu novom namespace-u postaje PID 1. Kada ovaj proces izađe, pokreće čišćenje namespace-a ako nema drugih procesa, jer PID 1 ima specijalnu ulogu usvajanja napuštenih (orphan) procesa. Linux kernel će potom onemogućiti dodelu PID-ova u tom namespace-u.
- Posledica:
- Izlazak PID 1 u novom namespace-u dovodi do čišćenja flag-a
PIDNS_HASH_ADDING. To rezultira time da funkcijaalloc_pidne uspe da dodeli novi PID prilikom kreiranja novog procesa, što proizvodi grešku “Cannot allocate memory”.
- Rešenje:
- Problem se može rešiti korišćenjem opcije
-fsaunshare. Ova opcija teraunshareda izvrši fork novog procesa nakon kreiranja novog PID namespace-a. - Izvršavanje
%unshare -fp /bin/bash%osigurava da samunsharepostane PID 1 u novom namespace-u./bin/bashi njegovi podprocesi se tada bezbedno nalaze unutar tog namespace-a, sprečavajući prevremen izlazak PID 1 i omogućavajući normalnu dodelu PID-ova.
Time što se unshare pokreće sa -f flagom, novi PID namespace se pravilno održava, što omogućava /bin/bash i njegovim podprocesima da rade bez suočavanja sa greškom “Cannot allocate memory”.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Proverite u kojem se namespace-u nalazi vaš proces
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Pronađite sve UTS namespaces
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>
Uđite u UTS namespace
nsenter -u TARGET_PID --pid /bin/bash
Zloupotreba deljenja host UTS namespace-a
Ako se kontejner pokrene sa --uts=host, pridružiće se host UTS namespace-u umesto da dobije sopstveni izolovani. Sa privilegijama kao što su --cap-add SYS_ADMIN, kod u kontejneru može promeniti hostname/NIS ime hosta putem 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"
Promena imena hosta može da izmeni logove/upozorenja, zbuni otkrivanje klastera ili pokvari TLS/SSH konfiguracije koje fiksiraju ime hosta.
Otkrivanje kontejnera koji dele UTS sa hostom
docker ps -aq | xargs -r docker inspect --format '{{.Id}} UTSMode={{.HostConfig.UTSMode}}'
# Shows "host" when the container uses the host UTS namespace
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


