Terraform Security
Last updated
Last updated
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
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.
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 pubblicamente disponibili 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.
Basta installare terraform sul tuo computer.
Qui hai una guida e qui hai il modo migliore per scaricare terraform.
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.
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 SecuritySe 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 è 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 shell inversa quando esegui terraform plan
:
Utilizzando un provider personalizzato
Un attaccante potrebbe inviare un provider personalizzato al Terraform Registry e poi aggiungerlo al codice Terraform in un branch di funzionalità (esempio da qui):
Il provider viene scaricato nell'init
e eseguirà il codice malevolo quando viene eseguito 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:
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 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 un payload come i seguenti termini nel file main.tf
:
Segui i suggerimenti della tecnica precedente per eseguire questo attacco in modo più furtivo utilizzando riferimenti esterni.
Puoi avere valori segreti utilizzati da terraform dumpati eseguendo terraform apply
aggiungendo al file terraform qualcosa come:
Nel caso in cui 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:
Ci sono 2 modi per distruggere le risorse:
Inserire una risorsa con un nome casuale nel file di stato che punta alla vera risorsa da distruggere
Poiché terraform vedrà che la risorsa non dovrebbe esistere, la distruggerà (seguendo l'ID della vera risorsa indicato). Esempio dalla pagina precedente:
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.
È anche possibile creare un provider personalizzato e semplicemente sostituire uno dei provider nel file di stato di terraform con quello malevolo o aggiungere una risorsa vuota con il provider malevolo. Esempio dalla ricerca originale:
In caso tu incontri 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.
Poi puoi usare external
come al solito.
tfsec: tfsec utilizza l'analisi statica del tuo codice terraform per individuare potenziali misconfigurazioni.
terascan: Terrascan è un analizzatore di codice statico per Infrastructure as Code.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)