GCP - Network Docker Escape

Підтримайте HackTricks

Початковий стан

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

Пояснення атаки

На екземплярі 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 секунд, якщо не відбулася жодна зміна конфігурації, створюючи потенційне вікно для впровадження фальшивої відповіді конфігурації для гостьового агента.

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

Техніка втечі

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

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

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

Для виконання підробки необхідно виконати наступні кроки:

  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 з відповідним приватним ключем.

Посилання

Підтримайте HackTricks

Last updated