GCP - Network Docker Escape
Ausgangszustand
In beiden Beschreibungen, in denen diese Technik spezifiziert ist, gelang es den Angreifern, Root-Zugriff innerhalb eines von GCP verwalteten Docker-Containers mit Zugriff auf das Host-Netzwerk (und den Fähigkeiten CAP_NET_ADMIN
und CAP_NET_RAW
) zu erlangen.
Angriffserklärung
Auf einer Google Compute Engine-Instanz zeigt die regelmäßige Überprüfung des Netzwerkverkehrs zahlreiche einfache HTTP-Anfragen an die Metadateninstanz unter 169.254.169.254
. Der Google Guest Agent, ein Open-Source-Dienst, stellt häufig solche Anfragen.
Dieser Agent ist darauf ausgelegt, Änderungen in den Metadaten zu überwachen. Insbesondere umfassen die Metadaten ein Feld für SSH-Public Keys. Wenn ein neuer öffentlicher SSH-Schlüssel zu den Metadaten hinzugefügt wird, autorisiert der Agent ihn automatisch in der Datei .authorized_key
. Er kann auch einen neuen Benutzer erstellen und ihn bei Bedarf den sudoers hinzufügen.
Der Agent überwacht Änderungen, indem er eine Anfrage sendet, um alle Metadatenwerte rekursiv abzurufen (GET /computeMetadata/v1/?recursive=true
). Diese Anfrage ist so konzipiert, dass der Metadatenserver nur dann eine Antwort sendet, wenn sich seit dem letzten Abruf eine Änderung in den Metadaten ergeben hat, die durch ein Etag identifiziert wird (wait_for_change=true&last_etag=
). Zusätzlich wird ein Timeout-Parameter (timeout_sec=
) hinzugefügt. Wenn innerhalb des angegebenen Timeouts keine Änderung erfolgt, antwortet der Server mit den unveränderten Werten.
Dieser Prozess ermöglicht es dem IMDS (Instance Metadata Service), nach 60 Sekunden zu antworten, wenn keine Konfigurationsänderung aufgetreten ist, was ein potenzielles Fenster für das Einschleusen einer gefälschten Konfigurationsantwort an den Gast-Agenten schafft.
Ein Angreifer könnte dies ausnutzen, indem er einen Man-in-the-Middle (MitM)-Angriff durchführt, die Antwort vom IMDS-Server fälscht und einen neuen öffentlichen Schlüssel einschleust. Dies könnte unbefugten SSH-Zugriff auf den Host ermöglichen.
Fluchttechnik
Während ARP-Spoofing in Google Compute Engine-Netzwerken unwirksam ist, kann eine modifizierte Version von rshijack entwickelt von Ezequiel für die Paketeinspritzung in der Kommunikation verwendet werden, um den SSH-Benutzer einzuschleusen.
Diese Version von rshijack ermöglicht die Eingabe der ACK- und SEQ-Nummern als Befehlszeilenargumente, was das Fälschen einer Antwort vor der tatsächlichen Antwort des Metadatenservers erleichtert. Darüber hinaus wird ein kleines Shell-Skript verwendet, um eine speziell gestaltete Nutzlast zurückzugeben. Diese Nutzlast löst aus, dass der Google Guest Agent einen Benutzer wouter
mit einem spezifizierten öffentlichen Schlüssel in der Datei .authorized_keys
erstellt.
Das Skript verwendet dasselbe ETag, um zu verhindern, dass der Metadatenserver den Google Guest Agent sofort über unterschiedliche Metadatenwerte informiert, wodurch die Antwort verzögert wird.
Um das Fälschen auszuführen, sind die folgenden Schritte erforderlich:
Überwachen Sie die Anfragen an den Metadatenserver mit tcpdump:
Schauen Sie nach einer ähnlichen Zeile wie:
Senden Sie die gefälschten Metadaten mit dem korrekten ETAG an rshijack:
Diese Schritt autorisiert den öffentlichen Schlüssel und ermöglicht die SSH-Verbindung mit dem entsprechenden privaten Schlüssel.
Referenzen
Last updated