GCP - Network Docker Escape

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Stan początkowy

W obu opisach, gdzie ta technika jest określona, atakujący zdołali uzyskać dostęp root wewnątrz kontenera Docker zarządzanego przez GCP z dostępem do sieci hosta (oraz uprawnieniami CAP_NET_ADMIN i CAP_NET_RAW).

Wyjaśnienie ataku

Na instancji Google Compute Engine regularne sprawdzanie ruchu sieciowego ujawnia liczne zwykłe żądania HTTP do instancji metadanych pod adresem 169.254.169.254. Google Guest Agent, otwarte źródło usługi, często wykonuje takie żądania.

Ten agent jest zaprojektowany do monitorowania zmian w metadanych. Warto zauważyć, że metadane obejmują pole dla kluczy publicznych SSH. Gdy do metadanych dodawany jest nowy klucz publiczny SSH, agent automatycznie autoryzuje go w pliku .authorized_key. Może również utworzyć nowego użytkownika i dodać go do sudoers, jeśli jest to konieczne.

Agent monitoruje zmiany, wysyłając żądanie pobrania wszystkich wartości metadanych rekurencyjnie (GET /computeMetadata/v1/?recursive=true). To żądanie ma na celu spowodowanie, że serwer metadanych wyśle odpowiedź tylko wtedy, gdy wystąpiła zmiana w metadanych od ostatniego pobrania, zidentyfikowana za pomocą Etag (wait_for_change=true&last_etag=). Dodatkowo, dołączany jest parametr timeout (timeout_sec=). Jeśli w określonym czasie nie wystąpi żadna zmiana, serwer odpowiada niezmienionymi wartościami.

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

Atakujący mógłby wykorzystać to, wykonując atak Man-in-the-Middle (MitM), podszywając się pod odpowiedź serwera IMDS i wstawiając nowy klucz publiczny. Może to umożliwić nieautoryzowany dostęp SSH do hosta.

Technika ucieczki

Podczas gdy ARP spoofing jest nieskuteczny w sieciach Google Compute Engine, zmodyfikowana wersja rshijack opracowana przez Ezequiela może być użyta do wstrzykiwania pakietów w komunikację w celu wstrzyknięcia użytkownika SSH.

Ta wersja rshijack umożliwia wprowadzenie numerów ACK i SEQ jako argumentów wiersza poleceń, ułatwiając podszywanie się pod odpowiedź przed rzeczywistą odpowiedzią serwera metadanych. Dodatkowo, używany jest mały skrypt Shell, który zwraca specjalnie spreparowany payload. Ten payload powoduje, że Google Guest Agent tworzy użytkownika wouter z określonym kluczem publicznym w pliku .authorized_keys.

Skrypt używa tego samego ETag, aby uniemożliwić serwerowi metadanych natychmiastowe powiadomienie Google Guest Agent o innych wartościach metadanych, opóźniając tym samym odpowiedź.

Aby przeprowadzić podszywanie, konieczne są następujące kroki:

  1. Monitoruj żądania do serwera metadanych za pomocą tcpdump:

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

Znajdź linię podobną 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.

Referencje

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated