Time Namespace

Lernen Sie das Hacken von AWS von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

Der Zeit-Namespace in Linux ermöglicht pro-Namespace-Offsets zu den System-Monoton- und Boot-Zeituhren. Er wird häufig in Linux-Containern verwendet, um das Datum/ die Uhrzeit innerhalb eines Containers zu ändern und die Uhren nach dem Wiederherstellen aus einem Checkpoint oder Snapshot anzupassen.

Labor:

Erstellen Sie verschiedene Namespaces

CLI

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

Durch das Einbinden einer neuen Instanz des /proc-Dateisystems mit dem Parameter --mount-proc stellen Sie sicher, dass der neue Mount-Namespace eine genaue und isolierte Ansicht der prozessspezifischen Informationen für diesen Namespace hat.

Fehler: bash: fork: Kann keinen Speicher zuweisen

Wenn unshare ohne die Option -f ausgeführt wird, tritt ein Fehler aufgrund der Art und Weise auf, wie Linux neue PID (Process ID)-Namespaces behandelt. Die wichtigsten Details und die Lösung sind wie folgt:

  1. Problem Erklärung:

  • Der Linux-Kernel ermöglicht es einem Prozess, neue Namespaces mit dem Systemaufruf unshare zu 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.

  • Die Ausführung von %unshare -p /bin/bash% startet /bin/bash im selben Prozess wie unshare. Folglich befinden sich /bin/bash und seine Kindprozesse im ursprünglichen PID-Namespace.

  • Der erste Kindprozess von /bin/bash im neuen Namespace wird PID 1. Wenn dieser Prozess beendet wird, löst er die Bereinigung des Namespaces aus, wenn keine anderen Prozesse vorhanden sind, da PID 1 die besondere Rolle hat, verwaiste Prozesse zu übernehmen. Der Linux-Kernel deaktiviert dann die PID-Zuweisung in diesem Namespace.

  1. Konsequenz:

  • Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des PIDNS_HASH_ADDING-Flags. Dadurch schlägt die Funktion alloc_pid beim Erstellen eines neuen Prozesses fehl, da kein neuer PID zugewiesen werden kann, was den Fehler "Kann keinen Speicher zuweisen" verursacht.

  1. Lösung:

  • Das Problem kann behoben werden, indem die Option -f zusammen mit unshare verwendet wird. Diese Option bewirkt, dass unshare nach der Erstellung des neuen PID-Namespaces einen neuen Prozess forkt.

  • Die Ausführung von %unshare -fp /bin/bash% stellt sicher, dass der unshare-Befehl selbst PID 1 im neuen Namespace wird. /bin/bash und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, was das vorzeitige Beenden von PID 1 verhindert und eine normale PID-Zuweisung ermöglicht.

Durch die Gewährleistung, dass unshare mit der -f-Flag ausgeführt wird, wird der neue PID-Namespace korrekt beibehalten, sodass /bin/bash und seine Unterprozesse ohne den Speicherzuweisungsfehler ausgeführt werden können.

Docker

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

Überprüfen Sie, in welchem Namespace sich Ihr Prozess befindet

Um festzustellen, in welchem Namespace sich Ihr Prozess befindet, können Sie den Befehl lsns verwenden. Dieser Befehl listet alle Namespaces auf, die auf Ihrem System vorhanden sind, sowie die Prozesse, die in jedem Namespace ausgeführt werden.

lsns

Die Ausgabe zeigt die verschiedenen Namespaces und die zugehörigen Prozesse an. Sie können den Namespace-Typ anhand der Spalte "Type" identifizieren. Der Namespace-Typ für die Zeit ist time.

        NS TYPE   NPROCS   PID USER             COMMAND
4026531835 cgroup       1  1234 root             /usr/bin/dockerd
4026531836 pid          1  1234 root             /usr/bin/dockerd
4026531837 user         1  1234 root             /usr/bin/dockerd
4026531838 uts          1  1234 root             /usr/bin/dockerd
4026531839 ipc          1  1234 root             /usr/bin/dockerd
4026531840 mnt          1  1234 root             /usr/bin/dockerd
4026531841 net          1  1234 root             /usr/bin/dockerd
4026531842 time         1  1234 root             /usr/bin/dockerd

In diesem Beispiel befindet sich der Prozess mit der PID 1234 im Zeit-Namespace.

ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr  4 21:16 /proc/self/ns/time -> 'time:[4026531834]'

Alle Time-Namespaces finden

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

```bash nsenter -T TARGET_PID --pid /bin/bash ``` Außerdem können Sie nur in einen anderen Prozess-Namespace eintreten, wenn Sie root sind. Und Sie können nicht in einen anderen Namespace eintreten, ohne einen darauf verweisenden Deskriptor (wie z.B. `/proc/self/ns/net`) zu haben.

Referenzen

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated