AWS - Steal Lambda Requests
Lambdaフロー
Slicerは、コンテナ外のプロセスで、initプロセスに呼び出しを送信します。
initプロセスは、いくつかの興味深いエンドポイントを公開するポート9001でリスンします:
/2018-06-01/runtime/invocation/next
– 次の呼び出しイベントを取得します/2018-06-01/runtime/invocation/{invoke-id}/response
– 呼び出しのハンドラ応答を返します/2018-06-01/runtime/invocation/{invoke-id}/error
– 実行エラーを返します
bootstrap.pyは、initプロセスから呼び出しを取得するループを持ち、ユーザーのコードを処理するためにそれらを呼び出します(
/next
)。最後に、bootstrap.pyはinitに応答を送信します
ユーザーコードはモジュールとして読み込まれるため、ユーザーコードによって実行されるコード実行は実際にはこのプロセスで行われています。
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に送信し、その後通常通りリクエストを処理できます。
この攻撃では、現在のLambda呼び出しから**
bootstrap.py
**の元のコードを取得し、githubから悪意のあるコードを追加して実行するだけで十分です。
攻撃手順
RCEの脆弱性を見つける
悪意のある bootstrapを生成する(例: https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py)
悪意のある bootstrapを実行する
これらのアクションを簡単に実行できます。
詳細についてはhttps://github.com/carlospolop/lambda_bootstrap_switcherを参照してください。
参考文献
最終更新