User Namespace

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic Information

'n gebruiker naamruimte is 'n Linux-kernfunksie wat isolasie van gebruiker- en groep-ID-kaartings verskaf, wat elke gebruiker naamruimte toelaat om sy eie stel van gebruiker- en groep-ID's te hê. Hierdie isolasie stel prosesse wat in verskillende gebruiker naamruimtes loop in staat om verskillende voorregte en eienaarskap te hê, selfs al deel hulle dieselfde gebruiker- en groep-ID's numeries.

Gebruiker naamruimtes is veral nuttig in houers, waar elke houer sy eie onafhanklike stel van gebruiker- en groep-ID's moet hê, wat beter sekuriteit en isolasie tussen houers en die gasheerstelsel moontlik maak.

How it works:

  1. Wanneer 'n nuwe gebruiker naamruimte geskep word, begin dit met 'n leë stel van gebruiker- en groep-ID-kaartings. Dit beteken dat enige proses wat in die nuwe gebruiker naamruimte loop, aanvanklik geen voorregte buite die naamruimte sal hê.

  2. ID-kaartings kan gevestig word tussen die gebruiker- en groep-ID's in die nuwe naamruimte en dié in die ouer (of gasheer) naamruimte. Dit laat prosesse in die nuwe naamruimte toe om voorregte en eienaarskap te hê wat ooreenstem met gebruiker- en groep-ID's in die ouer naamruimte. Die ID-kaartings kan egter beperk word tot spesifieke reekse en substelle van ID's, wat fynbeheer oor die voorregte wat aan prosesse in die nuwe naamruimte toegeken word, moontlik maak.

  3. Binne 'n gebruiker naamruimte kan prosesse volle wortelvoorregte (UID 0) hê vir operasies binne die naamruimte, terwyl hulle steeds beperkte voorregte buite die naamruimte het. Dit laat houers toe om met wortelagtige vermoëns binne hul eie naamruimte te loop sonder om volle wortelvoorregte op die gasheerstelsel te hê.

  4. Prosesse kan tussen naamruimtes beweeg deur die setns() stelselskakel of nuwe naamruimtes skep deur die unshare() of clone() stelselskakels met die CLONE_NEWUSER vlag. Wanneer 'n proses na 'n nuwe naamruimte beweeg of een skep, sal dit begin om die gebruiker- en groep-ID-kaartings wat met daardie naamruimte geassosieer is, te gebruik.

Lab:

Create different Namespaces

CLI

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

Deur 'n nuwe instansie van die /proc lêerstelsel te monteer as jy die parameter --mount-proc gebruik, verseker jy dat die nuwe monteernaamruimte 'n akkurate en geïsoleerde siening van die prosesinligting spesifiek vir daardie naamruimte het.

Fout: bash: fork: Kan nie geheue toewys nie

Wanneer unshare sonder die -f opsie uitgevoer word, word 'n fout ondervind weens die manier waarop Linux nuwe PID (Proses ID) naamruimtes hanteer. Die sleutelbesonderhede en die oplossing word hieronder uiteengesit:

  1. Probleemverklaring:

  • Die Linux-kern laat 'n proses toe om nuwe naamruimtes te skep met die unshare stelselaanroep. Die proses wat die skepping van 'n nuwe PID naamruimte inisieer (genoem die "unshare" proses) gaan egter nie in die nuwe naamruimte in nie; slegs sy kindproses gaan.

  • Om %unshare -p /bin/bash% te loop, begin /bin/bash in dieselfde proses as unshare. Gevolglik is /bin/bash en sy kindproses in die oorspronklike PID naamruimte.

  • Die eerste kindproses van /bin/bash in die nuwe naamruimte word PID 1. Wanneer hierdie proses verlaat, aktiveer dit die opruiming van die naamruimte as daar geen ander prosesse is nie, aangesien PID 1 die spesiale rol het om weeskindprosesse aan te neem. Die Linux-kern sal dan PID-toewysing in daardie naamruimte deaktiveer.

  1. Gevolg:

  • Die uitgang van PID 1 in 'n nuwe naamruimte lei tot die opruiming van die PIDNS_HASH_ADDING vlag. Dit lei tot die alloc_pid funksie wat misluk om 'n nuwe PID toe te wys wanneer 'n nuwe proses geskep word, wat die "Kan nie geheue toewys nie" fout veroorsaak.

  1. Oplossing:

  • Die probleem kan opgelos word deur die -f opsie saam met unshare te gebruik. Hierdie opsie maak dat unshare 'n nuwe proses fork nadat die nuwe PID naamruimte geskep is.

  • Om %unshare -fp /bin/bash% uit te voer, verseker dat die unshare opdrag self PID 1 in die nuwe naamruimte word. /bin/bash en sy kindproses is dan veilig binne hierdie nuwe naamruimte, wat die voortydige uitgang van PID 1 voorkom en normale PID-toewysing toelaat.

Deur te verseker dat unshare met die -f vlag loop, word die nuwe PID naamruimte korrek gehandhaaf, wat toelaat dat /bin/bash en sy sub-prosesse kan werk sonder om die geheue toewysing fout te ondervind.

Docker

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

Om die gebruikersnaamruimte te gebruik, moet die Docker-daemon begin word met --userns-remap=default (In ubuntu 14.04 kan dit gedoen word deur /etc/default/docker te wysig en dan sudo service docker restart uit te voer)

Kontroleer in watter naamruimte jou proses is

ls -l /proc/self/ns/user
lrwxrwxrwx 1 root root 0 Apr  4 20:57 /proc/self/ns/user -> 'user:[4026531837]'

Dit is moontlik om die gebruikerskaart vanaf die docker-container te kontroleer met:

cat /proc/self/uid_map
0          0 4294967295  --> Root is root in host
0     231072      65536  --> Root is 231072 userid in host

Of van die gasheer met:

cat /proc/<pid>/uid_map

Vind alle gebruikersname ruimtes

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

Gaan binne 'n Gebruiker-namespace in

nsenter -U TARGET_PID --pid /bin/bash

Ook, jy kan slegs in 'n ander prosesnaamruimte ingaan as jy root is. En jy kan nie ingaan in 'n ander naamruimte sonder 'n beskrywer wat daarna verwys nie (soos /proc/self/ns/user).

Skep nuwe Gebruiker naamruimte (met kaarte)

unshare -U [--map-user=<uid>|<name>] [--map-group=<gid>|<name>] [--map-root-user] [--map-current-user]
# Container
sudo unshare -U /bin/bash
nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody

# From the host
ps -ef | grep bash # The user inside the host is still root, not nobody
root       27756   27755  0 21:11 pts/10   00:00:00 /bin/bash

Herwinning van Vermoëns

In die geval van gebruikersname ruimtes, wanneer 'n nuwe gebruikersnaam ruimte geskep word, word die proses wat in die ruimte ingaan 'n volle stel vermoëns binne daardie ruimte toegestaan. Hierdie vermoëns stel die proses in staat om bevoorregte operasies uit te voer soos montering van lêerstelsels, die skep van toestelle, of die verandering van eienaarskap van lêers, maar slegs binne die konteks van sy gebruikersnaam ruimte.

Byvoorbeeld, wanneer jy die CAP_SYS_ADMIN vermoë binne 'n gebruikersnaam ruimte het, kan jy operasies uitvoer wat tipies hierdie vermoë vereis, soos om lêerstelsels te monteer, maar slegs binne die konteks van jou gebruikersnaam ruimte. Enige operasies wat jy met hierdie vermoë uitvoer, sal nie die gasheerstelsel of ander naam ruimtes beïnvloed nie.

Daarom, selfs al sal die verkryging van 'n nuwe proses binne 'n nuwe gebruikersnaam ruimte jou al die vermoëns teruggee (CapEff: 000001ffffffffff), kan jy eintlik slegs diegene wat met die ruimte verband hou gebruik (montering byvoorbeeld) maar nie elkeen nie. So, dit op sigself is nie genoeg om uit 'n Docker houer te ontsnap nie.

# There are the syscalls that are filtered after changing User namespace with:
unshare -UmCpf  bash

Probando: 0x067 . . . Error
Probando: 0x070 . . . Error
Probando: 0x074 . . . Error
Probando: 0x09b . . . Error
Probando: 0x0a3 . . . Error
Probando: 0x0a4 . . . Error
Probando: 0x0a7 . . . Error
Probando: 0x0a8 . . . Error
Probando: 0x0aa . . . Error
Probando: 0x0ab . . . Error
Probando: 0x0af . . . Error
Probando: 0x0b0 . . . Error
Probando: 0x0f6 . . . Error
Probando: 0x12c . . . Error
Probando: 0x130 . . . Error
Probando: 0x139 . . . Error
Probando: 0x140 . . . Error
Probando: 0x141 . . . Error

<div data-gb-custom-block data-tag="hint" data-style='success'>

Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)

<details>

<summary>Support HackTricks</summary>

* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>

</div>

hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

Last updated