User namespace ni kipengele cha kernel ya Linux ambacho kinatoa kutengwa kwa ramani za ID za mtumiaji na kundi, kuruhusu kila user namespace kuwa na seti yake ya kipekee ya ID za mtumiaji na kundi. Kutengwa huku kunaruhusu michakato inayofanya kazi katika user namespaces tofauti kuwa na mamlaka na umiliki tofauti, hata kama zinashiriki ID za mtumiaji na kundi kwa nambari.
User namespaces ni muhimu sana katika uundaji wa kontena, ambapo kila kontena linapaswa kuwa na seti yake huru ya ID za mtumiaji na kundi, kuruhusu usalama bora na kutengwa kati ya kontena na mfumo wa mwenyeji.
How it works:
Wakati user namespace mpya inaundwa, inaanza na seti tupu ya ramani za ID za mtumiaji na kundi. Hii inamaanisha kwamba mchakato wowote unaofanya kazi katika user namespace mpya utakuwa na mamlaka hakuna nje ya namespace.
Ramani za ID zinaweza kuanzishwa kati ya ID za mtumiaji na kundi katika namespace mpya na zile katika namespace ya mzazi (au mwenyeji). Hii inawaruhusu michakato katika namespace mpya kuwa na mamlaka na umiliki yanayolingana na ID za mtumiaji na kundi katika namespace ya mzazi. Hata hivyo, ramani za ID zinaweza kuwekewa mipaka kwa anuwai maalum na sehemu za IDs, kuruhusu udhibiti wa kina juu ya mamlaka zinazotolewa kwa michakato katika namespace mpya.
Ndani ya user namespace, michakato inaweza kuwa na mamlaka kamili ya root (UID 0) kwa shughuli ndani ya namespace, wakati bado ikiwa na mamlaka ndogo nje ya namespace. Hii inaruhusu kontena kuendesha kwa uwezo kama root ndani ya namespace yao bila kuwa na mamlaka kamili ya root kwenye mfumo wa mwenyeji.
Michakato inaweza kuhamia kati ya namespaces kwa kutumia wito wa mfumo wa setns() au kuunda namespaces mpya kwa kutumia wito wa mfumo wa unshare() au clone() na bendera ya CLONE_NEWUSER. Wakati mchakato unahamia kwenye namespace mpya au kuunda moja, utaanza kutumia ramani za ID za mtumiaji na kundi zinazohusiana na namespace hiyo.
Lab:
Create different Namespaces
CLI
sudounshare-U [--mount-proc] /bin/bash
Kwa kuunganisha mfano mpya wa mfumo wa /proc ikiwa unatumia param --mount-proc, unahakikisha kwamba nafasi mpya ya kuunganisha ina mtazamo sahihi na wa kutengwa wa taarifa za mchakato maalum kwa nafasi hiyo.
Kosa: bash: fork: Haiwezekani kugawa kumbukumbu
Wakati unshare inatekelezwa bila chaguo la -f, kosa linakutana kutokana na jinsi Linux inavyoshughulikia nafasi mpya za PID (Kitambulisho cha Mchakato). Maelezo muhimu na suluhisho yameelezwa hapa chini:
Maelezo ya Tatizo:
Kernel ya Linux inaruhusu mchakato kuunda nafasi mpya kwa kutumia wito wa mfumo wa unshare. Hata hivyo, mchakato unaoanzisha uundaji wa nafasi mpya ya PID (inayojulikana kama mchakato wa "unshare") hauingii katika nafasi mpya; ni mchakato wake wa watoto pekee ndio wanaingia.
Kuendesha %unshare -p /bin/bash% kunaanzisha /bin/bash katika mchakato sawa na unshare. Kwa hivyo, /bin/bash na mchakato wake wa watoto wako katika nafasi ya asili ya PID.
Mchakato wa kwanza wa mtoto wa /bin/bash katika nafasi mpya unakuwa PID 1. Wakati mchakato huu unapoondoka, unachochea usafishaji wa nafasi hiyo ikiwa hakuna mchakato mwingine, kwani PID 1 ina jukumu maalum la kupokea mchakato wa yatima. Kernel ya Linux itazima kisha ugawaji wa PID katika nafasi hiyo.
Matokeo:
Kuondoka kwa PID 1 katika nafasi mpya kunasababisha kusafishwa kwa bendera ya PIDNS_HASH_ADDING. Hii inasababisha kazi ya alloc_pid kushindwa kugawa PID mpya wakati wa kuunda mchakato mpya, ikitoa kosa la "Haiwezekani kugawa kumbukumbu".
Suluhisho:
Tatizo linaweza kutatuliwa kwa kutumia chaguo la -f pamoja na unshare. Chaguo hili linafanya unshare kuunda mchakato mpya baada ya kuunda nafasi mpya ya PID.
Kutekeleza %unshare -fp /bin/bash% kunahakikisha kwamba amri ya unshare yenyewe inakuwa PID 1 katika nafasi mpya. /bin/bash na mchakato wake wa watoto kisha vinashikiliwa salama ndani ya nafasi hii mpya, kuzuia kuondoka mapema kwa PID 1 na kuruhusu ugawaji wa PID wa kawaida.
Kwa kuhakikisha kwamba unshare inatekelezwa na bendera ya -f, nafasi mpya ya PID inatunzwa ipasavyo, ikiruhusu /bin/bash na mchakato wake wa chini kufanya kazi bila kukutana na kosa la ugawaji wa kumbukumbu.
Ili kutumia user namespace, Docker daemon inahitaji kuanzishwa na --userns-remap=default(Katika ubuntu 14.04, hii inaweza kufanywa kwa kubadilisha /etc/default/docker na kisha kutekeleza sudo service docker restart)
sudofind/proc-maxdepth3-typel-nameuser-execreadlink{} \; 2>/dev/null|sort-u# Find the processes with an specific namespacesudofind/proc-maxdepth3-typel-nameuser-execls-l{} \; 2>/dev/null|grep<ns-number>
Ingia ndani ya User namespace
nsenter-UTARGET_PID--pid/bin/bash
Pia, unaweza tu kuingia katika namespace ya mchakato mwingine ikiwa wewe ni root. Na huwezi kuingia katika namespace nyingine bila deskteta inayorejelea hiyo (kama /proc/self/ns/user).
# Containersudounshare-U/bin/bashnobody@ip-172-31-28-169:/home/ubuntu$#Check how the user is nobody# From the hostps-ef|grepbash# The user inside the host is still root, not nobodyroot2775627755021:11pts/1000:00:00/bin/bash
Kupata Uwezo Tena
Katika kesi ya majina ya watumiaji, wakati jina jipya la mtumiaji linaundwa, mchakato unaoingia kwenye jina hilo unapata seti kamili ya uwezo ndani ya jina hilo. Uwezo huu unaruhusu mchakato kufanya operesheni zenye mamlaka kama kuunganishasistimu za faili, kuunda vifaa, au kubadilisha umiliki wa faili, lakini tu ndani ya muktadha wa jina lake la mtumiaji.
Kwa mfano, unapokuwa na uwezo wa CAP_SYS_ADMIN ndani ya jina la mtumiaji, unaweza kufanya operesheni ambazo kawaida zinahitaji uwezo huu, kama kuunganisha sistimu za faili, lakini tu ndani ya muktadha wa jina lako la mtumiaji. Operesheni zozote unazofanya kwa uwezo huu hazitaathiri mfumo wa mwenyeji au majina mengine.
Hivyo, hata kama kupata mchakato mpya ndani ya jina jipya la Mtumiaji kutakupa uwezo wote tena (CapEff: 000001ffffffffff), kwa kweli unaweza kutumia tu zile zinazohusiana na jina hilo (kuunganisha kwa mfano) lakini si kila mmoja. Hivyo, hii peke yake haitoshi kutoroka kutoka kwa kontena la Docker.
# There are the syscalls that are filtered after changing User namespace with:unshare-UmCpfbashProbando:0x067...ErrorProbando:0x070...ErrorProbando:0x074...ErrorProbando:0x09b...ErrorProbando:0x0a3...ErrorProbando:0x0a4...ErrorProbando:0x0a7...ErrorProbando:0x0a8...ErrorProbando:0x0aa...ErrorProbando:0x0ab...ErrorProbando:0x0af...ErrorProbando:0x0b0...ErrorProbando:0x0f6...ErrorProbando:0x12c...ErrorProbando:0x130...ErrorProbando:0x139...ErrorProbando:0x140...ErrorProbando: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>