Network Namespace
Reading time: 5 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Basic Information
Namespace ya mtandao ni kipengele cha kernel ya Linux kinachotoa kutengwa kwa stack ya mtandao, ikiruhusu kila namespace ya mtandao kuwa na usanidi wake wa mtandao huru, interfaces, anwani za IP, meza za routing, na sheria za firewall. Kutengwa hiki ni muhimu katika hali mbalimbali, kama vile containerization, ambapo kila container inapaswa kuwa na usanidi wake wa mtandao, huru kutoka kwa containers nyingine na mfumo wa mwenyeji.
How it works:
- Wakati namespace mpya ya mtandao inaundwa, inaanza na stack ya mtandao iliyotengwa kabisa, bila interfaces za mtandao isipokuwa kwa interface ya loopback (lo). Hii inamaanisha kwamba michakato inayofanya kazi katika namespace mpya ya mtandao haiwezi kuwasiliana na michakato katika namespaces nyingine au mfumo wa mwenyeji kwa default.
- Interfaces za mtandao za virtual, kama vile veth pairs, zinaweza kuundwa na kuhamishwa kati ya namespaces za mtandao. Hii inaruhusu kuanzisha muunganisho wa mtandao kati ya namespaces au kati ya namespace na mfumo wa mwenyeji. Kwa mfano, mwisho mmoja wa veth pair unaweza kuwekwa katika namespace ya mtandao ya container, na mwisho mwingine unaweza kuunganishwa na bridge au interface nyingine ya mtandao katika namespace ya mwenyeji, ikitoa muunganisho wa mtandao kwa container.
- Interfaces za mtandao ndani ya namespace zinaweza kuwa na anwani zao za IP, meza za routing, na sheria za firewall, huru kutoka kwa namespaces nyingine. Hii inaruhusu michakato katika namespaces tofauti kuwa na usanidi tofauti wa mtandao na kufanya kazi kana kwamba zinafanya kazi kwenye mifumo tofauti ya mtandao.
- Michakato inaweza kuhamishwa kati ya namespaces kwa kutumia wito wa mfumo wa
setns()
, au kuunda namespaces mpya kwa kutumia wito wa mfumo waunshare()
auclone()
na bendera yaCLONE_NEWNET
. Wakati mchakato unahamia kwenye namespace mpya au kuunda moja, utaanza kutumia usanidi wa mtandao na interfaces zinazohusiana na namespace hiyo.
Lab:
Create different Namespaces
CLI
sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a
Kwa kuunganisha mfano mpya wa mfumo wa faili /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.
Hitilafu: bash: fork: Haiwezekani kugawa kumbukumbu
Wakati unshare
inatekelezwa bila chaguo la -f
, hitilafu inakutana 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 watoto wake tu wanaingia. - Kuendesha
%unshare -p /bin/bash%
kunaanzisha/bin/bash
katika mchakato sawa naunshare
. Kwa hivyo,/bin/bash
na watoto wake wako katika nafasi ya awali 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 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 yaalloc_pid
kushindwa kugawa PID mpya wakati wa kuunda mchakato mpya, ikitoa hitilafu ya "Haiwezekani kugawa kumbukumbu".
- Suluhisho:
- Tatizo linaweza kutatuliwa kwa kutumia chaguo la
-f
pamoja naunshare
. Chaguo hili linafanyaunshare
kuunda mchakato mpya baada ya kuunda nafasi mpya ya PID. - Kutekeleza
%unshare -fp /bin/bash%
kunahakikisha kwamba amri yaunshare
yenyewe inakuwa PID 1 katika nafasi mpya./bin/bash
na watoto wake wanakuwa salama ndani ya nafasi hii mpya, kuzuia kuondoka mapema kwa PID 1 na kuruhusu ugawaji wa kawaida wa PID.
Kwa kuhakikisha kwamba unshare
inatekelezwa na bendera ya -f
, nafasi mpya ya PID inatunzwa kwa usahihi, ikiruhusu /bin/bash
na michakato yake ya chini kufanya kazi bila kukutana na hitilafu ya ugawaji wa kumbukumbu.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a
Angalia ni namespace ipi mchakato wako uko ndani
ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
Pata majina yote ya Network namespaces
sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:"
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name net -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Ingia ndani ya Network namespace
nsenter -n TARGET_PID --pid /bin/bash
Pia, unaweza tu kuingia katika nafasi nyingine ya mchakato ikiwa wewe ni root. Na huwezi kuingia katika nafasi nyingine bila desktupu inayorejelea hiyo (kama /proc/self/ns/net
).
Marejeo
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.