GCP - Network Docker Escape

Support HackTricks

Initial State

この技術が指定されている両方のレポートで、攻撃者はGCPによって管理されているDockerコンテナ内でrootアクセスを取得することに成功しました。ホストネットワークへのアクセス(および**CAP_NET_ADMINCAP_NET_RAW**の権限)があります。

Attack Explanation

Google Compute Engineインスタンスでは、ネットワークトラフィックの定期的な検査により、メタデータインスタンスへの多数の平文HTTPリクエストが明らかになります。オープンソースサービスである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アクセスが可能になります。

Escape Technique

ARPスプーフィングはGoogle Compute Engineネットワークでは効果がありませんが、rshijackの修正版Ezequielによって開発され、SSHユーザーを注入するためのパケット注入に使用できます。

このrshijackのバージョンは、ACKおよびSEQ番号をコマンドライン引数として入力できるため、実際のメタデータサーバーの応答の前に応答を偽装することが容易になります。さらに、小さなシェルスクリプトが使用され、特別に作成されたペイロードを返します。このペイロードは、Google Guest Agentに対して、.authorized_keysファイルに指定された公開鍵を持つユーザーwouter作成するようにトリガーします。

スクリプトは同じ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