Atlantis Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Atlantis βασικά σας βοηθά να εκτελείτε terraform από Pull Requests από τον git server σας.
Πηγαίνετε στη σελίδα εκδόσεων του atlantis στο https://github.com/runatlantis/atlantis/releases και κατεβάστε την κατάλληλη για εσάς.
Δημιουργήστε ένα προσωπικό token (με πρόσβαση στο repo) του χρήστη σας στο github
Εκτελέστε ./atlantis testdrive
και θα δημιουργήσει ένα demo repo που μπορείτε να χρησιμοποιήσετε για να μιλήσετε με το atlantis
Μπορείτε να αποκτήσετε πρόσβαση στη σελίδα στον 127.0.0.1:4141
Atlantis υποστηρίζει αρκετούς git hosts όπως Github, Gitlab, Bitbucket και Azure DevOps. Ωστόσο, για να αποκτήσετε πρόσβαση στα repos σε αυτές τις πλατφόρμες και να εκτελέσετε ενέργειες, χρειάζεται να έχει κάποιες παραχωρημένες προνομιακές πρόσβασεις (τουλάχιστον δικαιώματα εγγραφής). Τα docs προτείνουν να δημιουργήσετε έναν χρήστη σε αυτές τις πλατφόρμες ειδικά για το Atlantis, αλλά κάποιοι μπορεί να χρησιμοποιούν προσωπικούς λογαριασμούς.
Σε κάθε περίπτωση, από την οπτική γωνία ενός επιτιθέμενου, ο λογαριασμός Atlantis θα είναι πολύ ενδιαφέρον να παραβιαστεί.
Το Atlantis χρησιμοποιεί προαιρετικά Webhook secrets για να επιβεβαιώσει ότι οι webhooks που λαμβάνει από τον Git host σας είναι νόμιμοι.
Ένας τρόπος για να το επιβεβαιώσετε αυτό θα ήταν να επιτρέψετε τις αιτήσεις να προέρχονται μόνο από τις IPs του Git host σας, αλλά ένας πιο εύκολος τρόπος είναι να χρησιμοποιήσετε ένα Webhook Secret.
Σημειώστε ότι εκτός αν χρησιμοποιείτε έναν ιδιωτικό server github ή bitbucket, θα χρειαστεί να εκθέσετε τα webhook endpoints στο Διαδίκτυο.
Το Atlantis θα είναι εκθέτοντας webhooks ώστε ο git server να μπορεί να του στείλει πληροφορίες. Από την οπτική γωνία ενός επιτιθέμενου, θα ήταν ενδιαφέρον να γνωρίζετε αν μπορείτε να του στείλετε μηνύματα.
Το Atlantis εκτελεί Terraform απλά εκτελώντας τις εντολές terraform plan
και apply
στον server στον οποίο φιλοξενείται το Atlantis. Ακριβώς όπως όταν εκτελείτε Terraform τοπικά, το Atlantis χρειάζεται διαπιστευτήρια για τον συγκεκριμένο πάροχο σας.
Είναι στο χέρι σας πώς να παρέχετε διαπιστευτήρια για τον συγκεκριμένο πάροχο στο Atlantis:
Το Atlantis Helm Chart και το AWS Fargate Module έχουν τους δικούς τους μηχανισμούς για τα διαπιστευτήρια παρόχου. Διαβάστε τα docs τους.
Αν εκτελείτε το Atlantis σε ένα cloud, τότε πολλά clouds έχουν τρόπους να δώσουν πρόσβαση στο cloud API σε εφαρμογές που εκτελούνται σε αυτά, π.χ.:
AWS EC2 Roles (Αναζητήστε "EC2 Role")
Πολλοί χρήστες ρυθμίζουν μεταβλητές περιβάλλοντος, π.χ. AWS_ACCESS_KEY
, όπου εκτελείται το Atlantis.
Άλλοι δημιουργούν τα απαραίτητα αρχεία ρυθμίσεων, π.χ. ~/.aws/credentials
, όπου εκτελείται το Atlantis.
Χρησιμοποιήστε τον HashiCorp Vault Provider για να αποκτήσετε διαπιστευτήρια παρόχου.
Το container όπου τρέχει το Atlantis θα περιέχει πιθανότατα προνομιακά διαπιστευτήρια για τους παρόχους (AWS, GCP, Github...) που διαχειρίζεται το Atlantis μέσω Terraform.
Από προεπιλογή, το Atlantis θα εκτελεί μια ιστοσελίδα στην πόρτα 4141 στον localhost. Αυτή η σελίδα απλά σας επιτρέπει να ενεργοποιήσετε/απενεργοποιήσετε το atlantis apply και να ελέγξετε την κατάσταση του σχεδίου των repos και να τα ξεκλειδώσετε (δεν επιτρέπει να τροποποιήσετε πράγματα, οπότε δεν είναι και τόσο χρήσιμη).
Πιθανότατα δεν θα τη βρείτε εκτεθειμένη στο διαδίκτυο, αλλά φαίνεται ότι από προεπιλογή δεν απαιτούνται διαπιστευτήρια για να αποκτήσετε πρόσβαση σε αυτήν (και αν απαιτούνται, atlantis
:atlantis
είναι οι προεπιλεγμένες).
Η ρύθμιση για το atlantis server
μπορεί να καθοριστεί μέσω σημαιών γραμμής εντολών, μεταβλητών περιβάλλοντος, αρχείου ρυθμίσεων ή ενός μείγματος των τριών.
Μπορείτε να βρείτε εδώ τη λίστα με τις σημαίες που υποστηρίζει ο server του Atlantis
Μπορείτε να βρείτε εδώ πώς να μετατρέψετε μια επιλογή ρύθμισης σε μεταβλητή περιβάλλοντος
Οι τιμές επιλέγονται με αυτή τη σειρά:
Σημαίες
Μεταβλητές Περιβάλλοντος
Αρχείο Ρυθμίσεων
Σημειώστε ότι στη ρύθμιση μπορεί να βρείτε ενδιαφέρουσες τιμές όπως tokens και κωδικούς πρόσβασης.
Ορισμένες ρυθμίσεις επηρεάζουν πώς διαχειρίζονται τα repos. Ωστόσο, είναι πιθανό ότι κάθε repo απαιτεί διαφορετικές ρυθμίσεις, οπότε υπάρχουν τρόποι να καθορίσετε κάθε repo. Αυτή είναι η σειρά προτεραιότητας:
Αρχείο /atlantis.yml
. Αυτό το αρχείο μπορεί να χρησιμοποιηθεί για να καθορίσει πώς το atlantis θα πρέπει να αντιμετωπίζει το repo. Ωστόσο, από προεπιλογή, ορισμένα κλειδιά δεν μπορούν να καθοριστούν εδώ χωρίς ορισμένες σημαίες που το επιτρέπουν.
Πιθανώς απαιτείται να επιτραπεί από σημαίες όπως allowed_overrides
ή allow_custom_workflows
Server Side Config: Μπορείτε να το περάσετε με τη σημαία --repo-config
και είναι ένα yaml που ρυθμίζει νέες ρυθμίσεις για κάθε repo (υποστηρίζονται regexes)
Προεπιλεγμένες τιμές
PR Protections
Το Atlantis επιτρέπει να υποδείξετε αν θέλετε το PR να είναι approved
από κάποιον άλλο (ακόμα και αν αυτό δεν έχει οριστεί στην προστασία του κλάδου) και/ή να είναι mergeable
(προστασίες κλάδου περασμένες) πριν εκτελέσετε το apply. Από την άποψη της ασφάλειας, η ρύθμιση και των δύο επιλογών είναι συνιστώμενη.
Σε περίπτωση που το allowed_overrides
είναι True, αυτές οι ρυθμίσεις μπορούν να υπεργραφούν σε κάθε έργο από το αρχείο /atlantis.yml
.
Scripts
Η ρύθμιση του repo μπορεί να καθορίσει scripts για εκτέλεση πριν (προ workflow hooks) και μετά (μετά workflow hooks) από μια workflow που εκτελείται.
Δεν υπάρχει καμία επιλογή για να επιτρέψετε να καθορίσετε αυτά τα scripts στο repo /atlantis.yml
αρχείο.
Workflow
Στη ρύθμιση του repo (server side config) μπορείτε να καθορίσετε μια νέα προεπιλεγμένη workflow, ή να δημιουργήσετε νέες προσαρμοσμένες workflows. Μπορείτε επίσης να καθορίσετε ποια repos μπορούν να πρόσβαση στις νέες που δημιουργούνται. Στη συνέχεια, μπορείτε να επιτρέψετε το αρχείο atlantis.yaml κάθε repo να καθορίσει την workflow που θα χρησιμοποιηθεί.
Αν η σημαία server side config allow_custom_workflows
είναι ρυθμισμένη σε True, οι workflows μπορούν να καθοριστούν στο atlantis.yaml
αρχείο κάθε repo. Είναι επίσης πιθανώς απαραίτητο το allowed_overrides
να καθορίζει επίσης workflow
για να υπεργράψει την workflow που θα χρησιμοποιηθεί.
Αυτό θα δώσει βασικά RCE στον server του Atlantis σε οποιονδήποτε χρήστη μπορεί να έχει πρόσβαση σε αυτό το repo.
Έλεγχος Πολιτικής Conftest
Το Atlantis υποστηρίζει την εκτέλεση server-side conftest πολιτικών κατά της εξόδου του σχεδίου. Κοινές περιπτώσεις χρήσης για αυτή τη διαδικασία περιλαμβάνουν:
Απαγόρευση χρήσης μιας λίστας μονάδων
Επιβεβαίωση χαρακτηριστικών ενός πόρου κατά τη διάρκεια της δημιουργίας
Ανίχνευση μη σκόπιμων διαγραφών πόρων
Πρόληψη κινδύνων ασφαλείας (π.χ. έκθεση ασφαλών θυρών στο κοινό)
Μπορείτε να ελέγξετε πώς να το ρυθμίσετε στα έγγραφα.
Στα έγγραφα μπορείτε να βρείτε τις επιλογές που μπορείτε να χρησιμοποιήσετε για να εκτελέσετε το Atlantis:
Εάν κατά τη διάρκεια της εκμετάλλευσης βρείτε αυτό το σφάλμα: Error: Error acquiring the state lock
Μπορείτε να το διορθώσετε εκτελώντας:
Αν έχετε δικαιώματα εγγραφής σε ένα αποθετήριο, θα μπορείτε να δημιουργήσετε ένα νέο κλάδο σε αυτό και να δημιουργήσετε ένα PR. Αν μπορείτε να εκτελέσετε atlantis plan
(ή ίσως εκτελείται αυτόματα) θα μπορείτε να RCE μέσα στον διακομιστή Atlantis.
Μπορείτε να το κάνετε αυτό κάνοντάς το Atlantis να φορτώσει μια εξωτερική πηγή δεδομένων. Απλά τοποθετήστε ένα payload όπως το παρακάτω στο αρχείο main.tf
:
Stealthier Attack
You can perform this attack even in a stealthier way, by following this suggestions:
Αντί να προσθέσετε το rev shell απευθείας στο αρχείο terraform, μπορείτε να φορτώσετε έναν εξωτερικό πόρο που περιέχει το rev shell:
Μπορείτε να βρείτε τον κώδικα rev shell στο https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules
Στον εξωτερικό πόρο, χρησιμοποιήστε τη δυνατότητα ref για να κρύψετε τον κώδικα terraform rev shell σε ένα branch μέσα στο repo, κάτι σαν: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
Αντί να δημιουργήσετε ένα PR προς το master για να ενεργοποιήσετε το Atlantis, δημιουργήστε 2 branches (test1 και test2) και δημιουργήστε ένα PR από το ένα στο άλλο. Όταν ολοκληρώσετε την επίθεση, απλά αφαιρέστε το PR και τα branches.
Μπορείτε να dump secrets που χρησιμοποιούνται από το terraform εκτελώντας atlantis plan
(terraform plan
) βάζοντας κάτι σαν αυτό στο αρχείο terraform:
Εάν έχετε δικαιώματα εγγραφής σε ένα αποθετήριο, θα μπορείτε να δημιουργήσετε ένα νέο κλάδο σε αυτό και να δημιουργήσετε ένα PR. Εάν μπορείτε να εκτελέσετε atlantis apply
, θα μπορείτε να κάνετε RCE μέσα στον διακομιστή Atlantis.
Ωστόσο, συνήθως θα χρειαστεί να παρακάμψετε κάποιες προστασίες:
Mergeable: Εάν αυτή η προστασία είναι ενεργοποιημένη στο Atlantis, μπορείτε να εκτελέσετε atlantis apply
μόνο εάν το PR είναι mergeable (που σημαίνει ότι η προστασία του κλάδου πρέπει να παρακαμφθεί).
Ελέγξτε τις πιθανές παρακάμψεις προστασιών κλάδου
Approved: Εάν αυτή η προστασία είναι ενεργοποιημένη στο Atlantis, κάποιος άλλος χρήστης πρέπει να εγκρίνει το PR πριν μπορέσετε να εκτελέσετε atlantis apply
Από προεπιλογή, μπορείτε να εκμεταλλευτείτε το Gitbot token για να παρακάμψετε αυτή την προστασία
Εκτελώντας terraform apply
σε ένα κακόβουλο αρχείο Terraform με local-exec.
Απλά πρέπει να βεβαιωθείτε ότι κάποιο payload όπως τα παρακάτω καταλήγει στο αρχείο main.tf
:
Ακολουθήστε τις προτάσεις από την προηγούμενη τεχνική για να εκτελέσετε αυτήν την επίθεση με πιο διακριτικό τρόπο.
Όταν εκτελείτε atlantis plan
ή atlantis apply
, το terraform εκτελείται από κάτω, μπορείτε να περάσετε εντολές στο terraform από το atlantis σχολιάζοντας κάτι όπως:
Κάτι που μπορείτε να περάσετε είναι οι env μεταβλητές που μπορεί να είναι χρήσιμες για να παρακάμψετε κάποιες προστασίες. Ελέγξτε τις terraform env vars στο https://www.terraform.io/cli/config/environment-variables
Εκτέλεση κακόβουλων προσαρμοσμένων εντολών κατασκευής που καθορίζονται σε ένα αρχείο atlantis.yaml
. Το Atlantis χρησιμοποιεί το αρχείο atlantis.yaml
από το branch του pull request, όχι από το master
.
Αυτή η δυνατότητα αναφέρθηκε σε προηγούμενη ενότητα:
Εάν η σημαία server side config allow_custom_workflows
είναι ρυθμισμένη σε True, οι ροές εργασίας μπορούν να καθοριστούν στο atlantis.yaml
αρχείο κάθε repo. Είναι επίσης πιθανώς απαραίτητο ότι το allowed_overrides
καθορίζει επίσης workflow
για να παρακάμψει τη ροή εργασίας που πρόκειται να χρησιμοποιηθεί.
Αυτό θα δώσει βασικά RCE στον διακομιστή Atlantis σε οποιονδήποτε χρήστη μπορεί να έχει πρόσβαση σε αυτό το repo.
Εάν η διαμόρφωση πλευράς διακομιστή σημαία allowed_overrides
έχει ρυθμιστεί apply_requirements
, είναι δυνατόν για ένα repo να τροποποιήσει τις προστασίες plan/apply για να τις παρακάμψει.
Αν κάποιος στείλει atlantis plan/apply
σχόλια στις έγκυρες αιτήσεις σας, θα προκαλέσει την εκτέλεση του terraform όταν δεν το θέλετε.
Επιπλέον, αν δεν έχετε ρυθμίσει στην προστασία κλάδου να ζητάει επανεκτίμηση κάθε PR όταν προστεθεί μια νέα δέσμευση σε αυτό, κάποιος θα μπορούσε να γράψει κακόβουλες ρυθμίσεις (δείτε προηγούμενα σενάρια) στη ρύθμιση terraform, να εκτελέσει atlantis plan/apply
και να αποκτήσει RCE.
Αυτή είναι η ρύθμιση στις προστασίες κλάδου του Github:
Αν καταφέρετε να κλέψετε το webhook secret που χρησιμοποιείται ή αν δεν υπάρχει κανένα webhook secret που να χρησιμοποιείται, θα μπορούσατε να καλέσετε το webhook του Atlantis και να καλέσετε τις εντολές του atlantis απευθείας.
Το Bitbucket Cloud δεν υποστηρίζει webhook secrets. Αυτό θα μπορούσε να επιτρέψει στους επιτιθέμενους να παραποιήσουν αιτήματα από το Bitbucket. Βεβαιωθείτε ότι επιτρέπετε μόνο τις διευθύνσεις IP του Bitbucket.
Αυτό σημαίνει ότι ένας επιτιθέμενος θα μπορούσε να κάνει ψευδείς αιτήσεις προς το Atlantis που φαίνονται ότι προέρχονται από το Bitbucket.
Αν καθορίζετε --repo-allowlist
, τότε θα μπορούσαν να παραποιήσουν μόνο αιτήματα που αφορούν σε αυτά τα αποθετήρια, οπότε η μεγαλύτερη ζημιά που θα μπορούσαν να προκαλέσουν θα ήταν να εκτελέσουν plan/apply στα δικά σας αποθετήρια.
Για να το αποτρέψετε, επιτρέψτε μόνο τις διευθύνσεις IP του Bitbucket (δείτε τις Εξόδους IPv4).
Αν καταφέρατε να αποκτήσετε πρόσβαση στον διακομιστή ή τουλάχιστον έχετε LFI, υπάρχουν μερικά ενδιαφέροντα πράγματα που θα πρέπει να προσπαθήσετε να διαβάσετε:
/home/atlantis/.git-credentials
Περιέχει διαπιστευτήρια πρόσβασης vcs
/atlantis-data/atlantis.db
Περιέχει διαπιστευτήρια πρόσβασης vcs με περισσότερες πληροφορίες
/atlantis-data/repos/<org_name>
/
<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate
Αρχείο κατάστασης του Terraform
Παράδειγμα: /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
/proc/1/environ
Μεταβλητές περιβάλλοντος
/proc/[2-20]/cmdline
Γραμμή εντολών του atlantis server
(μπορεί να περιέχει ευαίσθητα δεδομένα)
Επειδή οποιοσδήποτε μπορεί να σχολιάσει σε δημόσιες αιτήσεις, ακόμη και με όλες τις διαθέσιμες ρυθμίσεις ασφαλείας, είναι ακόμα επικίνδυνο να εκτελείτε το Atlantis σε δημόσια αποθετήρια χωρίς σωστή ρύθμιση των ρυθμίσεων ασφαλείας.
--allow-fork-prs
Αν εκτελείτε σε δημόσιο αποθετήριο (το οποίο δεν συνιστάται, δείτε παραπάνω), δεν θα πρέπει να ρυθμίσετε --allow-fork-prs
(προεπιλογή false) επειδή οποιοσδήποτε μπορεί να ανοίξει μια αίτηση από το fork του στο αποθετήριο σας.
--repo-allowlist
Το Atlantis απαιτεί να καθορίσετε μια λίστα επιτρεπόμενων αποθετηρίων από τα οποία θα δέχεται webhooks μέσω της σημαίας --repo-allowlist
. Για παράδειγμα:
Συγκεκριμένα αποθετήρια: --repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests
Ολόκληρη η οργάνωσή σας: --repo-allowlist=github.com/runatlantis/*
Κάθε αποθετήριο στην εγκατάσταση GitHub Enterprise σας: --repo-allowlist=github.yourcompany.com/*
Όλα τα αποθετήρια: --repo-allowlist=*
. Χρήσιμο όταν βρίσκεστε σε προστατευμένο δίκτυο αλλά επικίνδυνο χωρίς επίσης να ρυθμίσετε ένα webhook secret.
Αυτή η σημαία διασφαλίζει ότι η εγκατάσταση του Atlantis σας δεν χρησιμοποιείται με αποθετήρια που δεν ελέγχετε. Δείτε atlantis server --help
για περισσότερες λεπτομέρειες.
Αν οι επιτιθέμενοι υποβάλλουν αιτήσεις με κακόβουλο κώδικα Terraform είναι στο μοντέλο απειλής σας, τότε πρέπει να είστε ενήμεροι ότι οι εγκρίσεις terraform apply
δεν είναι αρκετές. Είναι δυνατόν να εκτελέσετε κακόβουλο κώδικα σε ένα terraform plan
χρησιμοποιώντας την external
πηγή δεδομένων ή καθορίζοντας έναν κακόβουλο πάροχο. Αυτός ο κώδικας θα μπορούσε στη συνέχεια να εξάγει τα διαπιστευτήριά σας.
Για να το αποτρέψετε, θα μπορούσατε να:
Ψήνετε τους παρόχους στην εικόνα του Atlantis ή να τους φιλοξενείτε και να αρνείστε την έξοδο στην παραγωγή.
Να εφαρμόσετε το πρωτόκολλο μητρώου παρόχων εσωτερικά και να αρνείστε την δημόσια έξοδο, έτσι ώστε να ελέγχετε ποιος έχει δικαίωμα εγγραφής στο μητρώο.
Να τροποποιήσετε το βήμα plan
της διαμόρφωσης αποθετηρίου server-side για να επικυρώσετε τη χρήση μη επιτρεπόμενων παρόχων ή πηγών δεδομένων ή PRs από μη επιτρεπόμενους χρήστες. Θα μπορούσατε επίσης να προσθέσετε επιπλέον επικύρωση σε αυτό το σημείο, π.χ. απαιτώντας ένα "thumbs-up" στην PR πριν επιτρέψετε την συνέχιση του plan
. Το Conftest θα μπορούσε να είναι χρήσιμο εδώ.
Το Atlantis θα πρέπει να εκτελείται με ρυθμισμένα Webhook secrets μέσω των μεταβλητών περιβάλλοντος $ATLANTIS_GH_WEBHOOK_SECRET
/$ATLANTIS_GITLAB_WEBHOOK_SECRET
. Ακόμη και με τη σημαία --repo-allowlist
ρυθμισμένη, χωρίς ένα webhook secret, οι επιτιθέμενοι θα μπορούσαν να κάνουν αιτήματα προς το Atlantis προσποιούμενοι ότι είναι ένα αποθετήριο που είναι στη λίστα επιτρεπόμενων. Τα webhook secrets διασφαλίζουν ότι τα αιτήματα webhook προέρχονται πραγματικά από τον πάροχο VCS σας (GitHub ή GitLab).
Αν χρησιμοποιείτε Azure DevOps, αντί για webhook secrets προσθέστε ένα βασικό όνομα χρήστη και κωδικό πρόσβασης.
Το Azure DevOps υποστηρίζει την αποστολή ενός βασικού επικεφαλίδας αυθεντικοποίησης σε όλα τα γεγονότα webhook. Αυτό απαιτεί τη χρήση μιας διεύθυνσης URL HTTPS για την τοποθεσία του webhook σας.
Αν χρησιμοποιείτε webhook secrets αλλά η κίνηση σας είναι μέσω HTTP, τότε τα webhook secrets θα μπορούσαν να κλαπούν. Ενεργοποιήστε το SSL/HTTPS χρησιμοποιώντας τις σημαίες --ssl-cert-file
και --ssl-key-file
.
Συνιστάται πολύ να ενεργοποιήσετε την αυθεντικοποίηση στην υπηρεσία ιστού. Ενεργοποιήστε το BasicAuth χρησιμοποιώντας τη σημαία --web-basic-auth=true
και ρυθμίστε ένα όνομα χρήστη και έναν κωδικό πρόσβασης χρησιμοποιώντας τις σημαίες --web-username=yourUsername
και --web-password=yourPassword
.
Μπορείτε επίσης να περάσετε αυτά ως μεταβλητές περιβάλλοντος ATLANTIS_WEB_BASIC_AUTH=true
ATLANTIS_WEB_USERNAME=yourUsername
και ATLANTIS_WEB_PASSWORD=yourPassword
.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)