GCP - Network Docker Escape

Support HackTricks

Initial State

W obu opisach, w których ta technika jest określona, napastnicy uzyskali dostęp root wewnątrz kontenera Docker zarządzanego przez GCP z dostępem do sieci hosta (i możliwościami CAP_NET_ADMIN oraz CAP_NET_RAW).

Attack Explanation

Na instancji Google Compute Engine regularna inspekcja ruchu sieciowego ujawnia liczne zwykłe żądania HTTP do metadanych instancji pod adresem 169.254.169.254. Google Guest Agent, usługa open-source, często wysyła takie żądania.

Ten agent jest zaprojektowany do monitorowania zmian w metadanych. W szczególności metadane zawierają pole dla kluczy publicznych SSH. Gdy nowy publiczny klucz SSH jest dodawany do metadanych, agent automatycznie autoryzuje go w pliku .authorized_key. Może również utworzyć nowego użytkownika i dodać go do sudoers, jeśli zajdzie taka potrzeba.

Agent monitoruje zmiany, wysyłając żądanie do pobrania wszystkich wartości metadanych rekurencyjnie (GET /computeMetadata/v1/?recursive=true). To żądanie ma na celu skłonienie serwera metadanych do wysłania odpowiedzi tylko wtedy, gdy nastąpiła jakakolwiek zmiana w metadanych od ostatniego pobrania, identyfikowana przez Etag (wait_for_change=true&last_etag=). Dodatkowo, zawarty jest parametr timeout (timeout_sec=). Jeśli w określonym czasie nie nastąpi zmiana, serwer odpowiada niezmienionymi wartościami.

Ten proces pozwala IMDS (Instance Metadata Service) odpowiedzieć po 60 sekundach, jeśli nie wystąpiła zmiana konfiguracji, tworząc potencjalne okno do wstrzyknięcia fałszywej odpowiedzi konfiguracyjnej do agenta gościa.

Napastnik mógłby to wykorzystać, przeprowadzając atak Man-in-the-Middle (MitM), fałszując odpowiedź z serwera IMDS i wstawiając nowy klucz publiczny. To mogłoby umożliwić nieautoryzowany dostęp SSH do hosta.

Escape Technique

Podczas gdy fałszowanie ARP jest nieskuteczne w sieciach Google Compute Engine, zmodyfikowana wersja rshijack opracowana przez Ezequiela może być użyta do wstrzykiwania pakietów w komunikacji, aby wstrzyknąć użytkownika SSH.

Ta wersja rshijack pozwala na wprowadzenie numerów ACK i SEQ jako argumentów wiersza poleceń, co ułatwia fałszowanie odpowiedzi przed rzeczywistą odpowiedzią serwera metadanych. Dodatkowo, używany jest mały skrypt Shell, aby zwrócić specjalnie przygotowany ładunek. Ten ładunek wyzwala Google Guest Agent do utworzenia użytkownika wouter z określonym kluczem publicznym w pliku .authorized_keys.

Skrypt używa tego samego ETag, aby zapobiec natychmiastowemu powiadomieniu serwera metadanych agenta gościa Google o różnych wartościach metadanych, opóźniając tym samym odpowiedź.

Aby wykonać fałszowanie, konieczne są następujące kroki:

  1. Monitoruj żądania do serwera metadanych używając tcpdump:

tcpdump -S -i eth0 'host 169.254.169.254 and port 80' &

Szukaj linii podobnej do:

<TIME> IP <LOCAL_IP>.<PORT> > 169.254.169.254.80: Flags [P.], seq <NUM>:<TARGET_ACK>, ack <TARGET_SEQ>, win <NUM>, length <NUM>: HTTP: GET /computeMetadata/v1/?timeout_sec=<SECONDS>&last_etag=<ETAG>&alt=json&recursive=True&wait_for_change=True HTTP/1.1
  1. Wyślij fałszywe dane metadanych z poprawnym ETAG do rshijack:

fakeData.sh <ETAG> | rshijack -q eth0 169.254.169.254:80 <LOCAL_IP>:<PORT> <TARGET_SEQ> <TARGET_ACK>; ssh -i id_rsa -o StrictHostKeyChecking=no wouter@localhost

Ten krok autoryzuje klucz publiczny, umożliwiając połączenie SSH z odpowiadającym mu kluczem prywatnym.

Odniesienia

Wsparcie HackTricks

Last updated