UTS Namespace
Reading time: 4 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
Podstawowe informacje
Namespace UTS (UNIX Time-Sharing System) to funkcja jądra Linux, która zapewnia izolację dwóch identyfikatorów systemowych: nazwy hosta i nazwy domeny NIS (Network Information Service). Ta izolacja pozwala każdemu namespace UTS mieć własną niezależną nazwę hosta i nazwę domeny NIS, co jest szczególnie przydatne w scenariuszach konteneryzacji, gdzie każdy kontener powinien wyglądać jak oddzielny system z własną nazwą hosta.
Jak to działa:
- Gdy nowy namespace UTS jest tworzony, zaczyna od kopii nazwy hosta i nazwy domeny NIS z jego rodzicielskiego namespace. Oznacza to, że w momencie utworzenia nowy namespace dzieli te same identyfikatory co jego rodzic. Jednak wszelkie późniejsze zmiany w nazwie hosta lub nazwie domeny NIS w obrębie namespace nie wpłyną na inne namespace.
- Procesy w obrębie namespace UTS mogą zmieniać nazwę hosta i nazwę domeny NIS za pomocą wywołań systemowych
sethostname()
isetdomainname()
, odpowiednio. Te zmiany są lokalne dla namespace i nie wpływają na inne namespace ani na system gospodarza. - Procesy mogą przemieszczać się między namespace za pomocą wywołania systemowego
setns()
lub tworzyć nowe namespace za pomocą wywołań systemowychunshare()
lubclone()
z flagąCLONE_NEWUTS
. Gdy proces przemieszcza się do nowego namespace lub tworzy jeden, zacznie używać nazwy hosta i nazwy domeny NIS związanej z tym namespace.
Laboratorium:
Tworzenie różnych namespace
CLI
sudo unshare -u [--mount-proc] /bin/bash
Montując nową instancję systemu plików /proc
, używając parametru --mount-proc
, zapewniasz, że nowa przestrzeń montowania ma dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni nazw.
Błąd: bash: fork: Nie można przydzielić pamięci
Gdy unshare
jest wykonywane bez opcji -f
, napotykany jest błąd z powodu sposobu, w jaki Linux obsługuje nowe przestrzenie nazw PID (identyfikator procesu). Kluczowe szczegóły i rozwiązanie są opisane poniżej:
- Wyjaśnienie problemu:
- Jądro Linuxa pozwala procesowi na tworzenie nowych przestrzeni nazw za pomocą wywołania systemowego
unshare
. Jednak proces, który inicjuje tworzenie nowej przestrzeni nazw PID (nazywany "procesem unshare"), nie wchodzi do nowej przestrzeni nazw; tylko jego procesy potomne to robią. - Uruchomienie
%unshare -p /bin/bash%
uruchamia/bin/bash
w tym samym procesie counshare
. W konsekwencji,/bin/bash
i jego procesy potomne znajdują się w oryginalnej przestrzeni nazw PID. - Pierwszy proces potomny
/bin/bash
w nowej przestrzeni nazw staje się PID 1. Gdy ten proces kończy działanie, uruchamia czyszczenie przestrzeni nazw, jeśli nie ma innych procesów, ponieważ PID 1 ma specjalną rolę przyjmowania procesów osieroconych. Jądro Linuxa wyłączy wtedy przydzielanie PID w tej przestrzeni nazw.
- Konsekwencja:
- Zakończenie PID 1 w nowej przestrzeni nazw prowadzi do wyczyszczenia flagi
PIDNS_HASH_ADDING
. Skutkuje to niepowodzeniem funkcjialloc_pid
w przydzielaniu nowego PID podczas tworzenia nowego procesu, co skutkuje błędem "Nie można przydzielić pamięci".
- Rozwiązanie:
- Problem można rozwiązać, używając opcji
-f
zunshare
. Ta opcja sprawia, żeunshare
fork'uje nowy proces po utworzeniu nowej przestrzeni nazw PID. - Wykonanie
%unshare -fp /bin/bash%
zapewnia, że polecenieunshare
samo staje się PID 1 w nowej przestrzeni nazw./bin/bash
i jego procesy potomne są następnie bezpiecznie zawarte w tej nowej przestrzeni nazw, co zapobiega przedwczesnemu zakończeniu PID 1 i umożliwia normalne przydzielanie PID.
Zapewniając, że unshare
działa z flagą -f
, nowa przestrzeń nazw PID jest prawidłowo utrzymywana, co pozwala na działanie /bin/bash
i jego podprocesów bez napotkania błędu przydzielania pamięci.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Sprawdź, w której przestrzeni nazw znajduje się twój proces
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Znajdź wszystkie przestrzenie nazw 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>
Wejdź do przestrzeni nazw UTS
nsenter -u TARGET_PID --pid /bin/bash
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.