GCP - Network Docker Escape

htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

初期状態

この技術が指定されている両方のライトアップで、攻撃者はGCPによって管理されているDockerコンテナ内でrootアクセスを取得し、ホストネットワーク(および機能**CAP_NET_ADMINCAP_NET_RAW**)にアクセスしました。

攻撃

通常のGoogle Compute Engineインスタンスでネットワークトラフィックを調査すると、多くの平文HTTPリクエストが**169.254.169.254メタデータ**インスタンスに向けられているのが見られます。このようなリクエストを行うサービスの一つがオープンソースのGoogle Guest Agentです。リクエスト例:

このエージェントはメタデータの変更を監視します。 メタデータ内には、承認されたSSH公開キーのフィールドがあります。 したがって、メタデータに新しい公開SSHキーが表示されると、エージェントはユーザーの.authorized_keyファイルでそれを承認し、必要に応じて新しいユーザーを作成し、sudoersに追加します。

Google Guest Agentが変更を監視する方法は、再帰的にすべてのメタデータ値を取得する呼び出しを通じて行われます(GET /computeMetadata/v1/?recursive=true)、メタデータサーバーに対して、最後に取得したメタデータ値に対して変更がある場合のみ応答を送信するよう指示します。これはEtagによって識別されます(wait_for_change=true&last_etag=)。

このリクエストにはタイムアウトも含まれています(timeout_sec=)。指定された時間内に変更が発生しない場合、メタデータサーバーは変更されていない値で応答します。

これにより、IMDSはその間隔で設定変更がなかった場合、60秒後応答し、ゲストエージェントに対してIMDSから偽の設定応答を注入するためのウィンドウを許可します。

したがって、攻撃者がMitM攻撃を実行することに成功した場合、IMDSサーバーからの応答を偽装し、新しいユーザーがSSHを介してホストにアクセスするための新しい公開キーを挿入することができます。

エスケープ

ARPスプーフィングはGoogle Compute Engineネットワークでは機能しませんが、EzequielはSSHユーザーを注入するための通信にパケットを注入するために使用できるrshijack変更版を生成しました。

この変更版のrshijackでは、ACKとSEQの番号をコマンドライン引数として渡すことができ、時間を節約し、実際のメタデータ応答が来る前に応答を偽装することができます。 さらに、Google Guest Agentが.authorized_keysファイルに自分の公開キーを持つユーザーwouter作成するようにトリガーする特別に作成されたペイロードを返す小さなShellスクリプトがあります。 このスクリプトはETagをパラメータとして受け取ります。同じETagを保持することで、メタデータサーバーは次の応答でGoogle Guest Agentにメタデータ値が異なることをすぐには伝えず、代わりにtimeout_secで指定された秒数を待ちます。 スプーフィングを実現するには、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

その値が表示されたら、正しい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を介してプライベート鍵で接続することを許可します。

参考文献

AWSのハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)をチェック!

HackTricksをサポートする他の方法:

最終更新