UTS Namespace
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Grundlegende Informationen
Ein UTS (UNIX Time-Sharing System) Namespace ist eine Funktion des Linux-Kernels, die iIsolierung von zwei Systemkennungen bereitstellt: die hostname und der NIS (Network Information Service) Domainname. Diese Isolierung ermöglicht es jedem UTS Namespace, sein eigenes unabhängiges hostname- und NIS-Domainname zu haben, was besonders in Containerisierungsszenarien nützlich ist, in denen jeder Container als separates System mit eigenem hostname erscheinen soll.
Funktionsweise:
- Wenn ein neuer UTS Namespace erstellt wird, beginnt er mit einer Kopie des hostname- und NIS-Domainnamens aus dem übergeordneten Namespace. Das bedeutet, dass das neue Namespace bei der Erstellung die gleichen Kennungen wie sein übergeordnetes Namespace teilt. Änderungen am hostname oder NIS-Domainnamen innerhalb des Namespace wirken sich jedoch nicht auf andere Namespaces aus.
- Prozesse innerhalb eines UTS Namespace können den hostname und den NIS-Domainnamen ändern mit den Systemaufrufen
sethostname()bzw.setdomainname(). Diese Änderungen sind lokal für das Namespace und wirken sich nicht auf andere Namespaces oder das Host-System aus. - Prozesse können zwischen Namespaces wechseln mit dem Systemaufruf
setns()oder neue Namespaces erstellen mitunshare()oderclone()unter Verwendung des FlagsCLONE_NEWUTS. Wenn ein Prozess in ein neues Namespace wechselt oder eines erstellt, verwendet er den hostname und den NIS-Domainnamen, die mit diesem Namespace verknüpft sind.
Labor:
Verschiedene Namespaces erstellen
CLI
sudo unshare -u [--mount-proc] /bin/bash
Indem Sie eine neue Instanz des /proc-Dateisystems mounten, wenn Sie den Parameter --mount-proc verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine exakte und isolierte Ansicht der prozessspezifischen Informationen für diesen Namespace hat.
Error: bash: fork: Cannot allocate memory
Wenn unshare ohne die Option -f ausgeführt wird, tritt aufgrund der Art und Weise, wie Linux mit neuen PID (Process ID)-Namespaces umgeht, ein Fehler auf. Die wichtigsten Details und die Lösung sind unten aufgeführt:
- Problemerklärung:
- Der Linux-Kernel erlaubt einem Prozess, neue Namespaces mittels des Systemaufrufs
unsharezu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namespaces initiiert (als “unshare”-Prozess bezeichnet), tritt jedoch nicht in den neuen Namespace ein; nur seine Kindprozesse tun dies. - Das Ausführen von %unshare -p /bin/bash% startet
/bin/bashim selben Prozess wieunshare. Folglich befinden sich/bin/bashund seine Kindprozesse im ursprünglichen PID-Namespace. - Der erste Kindprozess von
/bin/bashim neuen Namespace wird PID 1. Wenn dieser Prozess beendet wird, löst das die Aufräumarbeiten für den Namespace aus, falls keine weiteren Prozesse vorhanden sind, da PID 1 die spezielle Rolle hat, Waisenprozesse aufzunehmen. Der Linux-Kernel deaktiviert dann die PID-Vergabe in diesem Namespace.
- Konsequenz:
- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des Flags
PIDNS_HASH_ADDING. Dadurch schlägt die Funktionalloc_pidfehl, wenn sie versucht, einer neu erstellten Prozess eine PID zuzuweisen, und erzeugt den Fehler “Cannot allocate memory”.
- Lösung:
- Das Problem lässt sich durch Verwendung der Option
-fmitunsharelösen. Diese Option veranlasstunshare, nach der Erstellung des neuen PID-Namespaces einen neuen Prozess zu forken. - Das Ausführen von %unshare -fp /bin/bash% stellt sicher, dass der
unshare-Befehl selbst PID 1 im neuen Namespace wird./bin/bashund seine Kindprozesse sind dann sicher in diesem neuen Namespace eingeschlossen, wodurch ein vorzeitiges Beenden von PID 1 verhindert und die normale PID-Zuweisung ermöglicht wird.
Indem sichergestellt wird, dass unshare mit der Option -f ausgeführt wird, bleibt der neue PID-Namespace korrekt erhalten, sodass /bin/bash und seine Subprozesse ohne Auftreten des Speicherzuweisungsfehlers arbeiten können.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Prüfe, in welchem Namespace sich dein Prozess befindet
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Finde alle 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>
In einen UTS-Namespace eintreten
nsenter -u TARGET_PID --pid /bin/bash
Ausnutzung der Host-UTS-Freigabe
Wenn ein Container mit --uts=host gestartet wird, tritt er dem UTS-Namespace des Hosts bei, anstatt einen isolierten zu erhalten. Mit capabilities wie --cap-add SYS_ADMIN kann Code im Container den Host-Hostname/NIS-Namen über sethostname()/setdomainname() ändern:
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"
Das Ändern des Hostnamens kann Logs oder Alerts manipulieren, die Clustererkennung verwirren oder TLS-/SSH-Konfigurationen, die auf den Hostnamen vertrauen, außer Funktion setzen.
Container erkennen, die den UTS-Namespace mit dem Host teilen
docker ps -aq | xargs -r docker inspect --format '{{.Id}} UTSMode={{.HostConfig.UTSMode}}'
# Shows "host" when the container uses the host UTS namespace
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.


