GCP - Network Docker Escape

Support HackTricks

Initial State

У обох звітах, де зазначена ця техніка, зловмисники змогли отримати доступ root всередині Docker контейнера, керованого GCP, з доступом до хост-мережі (та можливостями CAP_NET_ADMIN і CAP_NET_RAW).

Attack Explanation

На екземплярі Google Compute Engine регулярна перевірка мережевого трафіку виявляє численні звичайні HTTP запити до метаданих екземпляра за адресою 169.254.169.254. Google Guest Agent, відкритий сервіс, часто робить такі запити.

Цей агент призначений для моніторингу змін у метаданих. Зокрема, метадані включають поле для публічних ключів SSH. Коли новий публічний SSH ключ додається до метаданих, агент автоматично авторизує його у файлі .authorized_key. Він також може створити нового користувача і додати його до sudoers, якщо це необхідно.

Агент моніторить зміни, надсилаючи запит на отримання всіх значень метаданих рекурсивно (GET /computeMetadata/v1/?recursive=true). Цей запит призначений для того, щоб змусити сервер метаданих надіслати відповідь лише у разі зміни метаданих з моменту останнього отримання, що визначається Etag (wait_for_change=true&last_etag=). Крім того, включено параметр тайм-ауту (timeout_sec=). Якщо зміни не відбуваються протягом вказаного тайм-ауту, сервер відповідає незмінними значеннями.

Цей процес дозволяє IMDS (Служба метаданих екземпляра) відповідати через 60 секунд, якщо конфігураційні зміни не відбулися, створюючи потенційне вікно для впровадження фальшивої конфігураційної відповіді до агента-гостя.

Зловмисник може скористатися цим, здійснивши атаку "людина посередині" (MitM), підробляючи відповідь від сервера IMDS і вставляючи новий публічний ключ. Це може дозволити несанкціонований доступ SSH до хоста.

Escape Technique

Хоча ARP підробка є неефективною в мережах Google Compute Engine, модифікована версія rshijack, розроблена Ezequiel, може бути використана для ін'єкції пакетів у комунікацію для вставки SSH користувача.

Ця версія rshijack дозволяє вводити номери ACK і SEQ як аргументи командного рядка, що полегшує підробку відповіді перед реальною відповіддю сервера метаданих. Крім того, використовується невеликий Shell скрипт, щоб повернути спеціально підготовлений корисний вантаж. Цей корисний вантаж викликає Google Guest Agent для створення користувача wouter з вказаним публічним ключем у файлі .authorized_keys.

Скрипт використовує той же ETag, щоб запобігти негайному сповіщенню сервера метаданих про різні значення метаданих, тим самим затримуючи відповідь.

Щоб виконати підробку, необхідні такі кроки:

  1. Моніторинг запитів до сервера метаданих за допомогою tcpdump:

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

Шукайте рядок, подібний до:

<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. Відправте підроблені дані метаданих з правильним ETAG до 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

Цей крок авторизує публічний ключ, що дозволяє SSH-з'єднання з відповідним приватним ключем.

Посилання

Support HackTricks

Last updated