GCP - Network Docker Escape
初期状態
この技術が指定されている両方のライトアップで、攻撃者はGCPによって管理されているDockerコンテナ内でrootアクセスを取得し、ホストネットワーク(および機能**CAP_NET_ADMIN
とCAP_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' &
このような行を待ちます:
その値が表示されたら、正しい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を介してプライベート鍵で接続することを許可します。
参考文献
最終更新