Terraform Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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 sieci, a także komponentami wysokiego poziomu, takimi jak wpisy DNS i funkcje SaaS.
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 do zarządzania 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.
Po prostu zainstaluj terraform na swoim komputerze.
Tutaj masz przewodnik, a tutaj masz najlepszy sposób na pobranie 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 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
:
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):
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:
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 terraform rev shell w gałęzi wewnątrz repo, coś takiego: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
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
:
Postępuj zgodnie z zaleceniami z poprzedniej techniki, aby przeprowadzić ten atak w bardziej ukryty sposób, używając zewnętrznych odniesień.
Możesz mieć wartości sekretów używanych przez terraform zrzucane uruchamiając terraform apply
, dodając do pliku terraform coś takiego:
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:
Istnieją 2 sposoby na zniszczenie zasobów:
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:
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ą.
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ń:
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ę.
Następnie możesz użyć external
jak zwykle.
tfsec: tfsec wykorzystuje analizę statyczną twojego kodu terraform, aby wykryć potencjalne błędy konfiguracyjne.
terascan: Terrascan to statyczny analizator kodu dla Infrastructure as Code.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)