Concourse Enumeration & Attacks
Απαρίθμηση και Επιθέσεις στο Concourse
Ρόλοι Χρηστών & Δικαιώματα
Το Concourse έρχεται με πέντε ρόλους:
Concourse Admin: Αυτός ο ρόλος δίνεται μόνο στους ιδιοκτήτες της κύριας ομάδας (προεπιλεγμένη αρχική ομάδα του Concourse). Οι διαχειριστές μπορούν να διαμορφώσουν άλλες ομάδες (π.χ.:
fly set-team
,fly destroy-team
...). Τα δικαιώματα αυτού του ρόλου δεν μπορούν να επηρεαστούν από το RBAC.ιδιοκτήτης: Οι ιδιοκτήτες της ομάδας μπορούν να τροποποιήσουν τα πάντα μέσα στην ομάδα.
μέλος: Τα μέλη της ομάδας μπορούν να διαβάσουν και να γράψουν μέσα στα αντικείμενα της ομάδας αλλά δεν μπορούν να τροποποιήσουν τις ρυθμίσεις της ομάδας.
operator παραγωγής pipeline: Οι operators παραγωγής pipeline μπορούν να εκτελέσουν λειτουργίες pipeline όπως ενεργοποίηση κατασκευών και ακινητοποίηση πόρων, όμως δεν μπορούν να ενημερώσουν τις ρυθμίσεις του pipeline.
θεατής: Οι θεατές της ομάδας έχουν πρόσβαση μόνο για ανάγνωση σε μια ομάδα και τα pipelines της.
Επιπλέον, τα δικαιώματα των ρόλων ιδιοκτήτη, μέλους, operator παραγωγής pipeline και θεατή μπορούν να τροποποιηθούν διαμορφώνοντας το RBAC (διαμορφώνοντας πιο συγκεκριμένα τις ενέργειές του). Διαβάστε περισσότερα σχετικά με αυτό στο: https://concourse-ci.org/user-roles.html
Σημειώστε ότι το Concourse ομαδοποιεί τα pipelines μέσα σε ομάδες. Επομένως, οι χρήστες που ανήκουν σε μια ομάδα θα μπορούν να διαχειριστούν αυτά τα pipelines και μπορεί να υπάρχουν πολλές ομάδες. Ένας χρήστης μπορεί να ανήκει σε πολλές ομάδες και να έχει διαφορετικά δικαιώματα σε κάθε μία από αυτές.
Μεταβλητές & Διαχειριστής Πιστοποιητικών
Στις διαμορφώσεις YAML μπορείτε να διαμορφώσετε τιμές χρησιμοποιώντας τη σύνταξη ((_source-name_:_secret-path_._secret-field_))
.
Από τα έγγραφα: Το όνομα πηγής είναι προαιρετικό, και αν παραλειφθεί, θα χρησιμοποιηθεί ο διαχειριστής πιστοποιητικών σε επίπεδο cluster, ή η τιμή μπορεί να παρέχεται στατικά.
Το προαιρετικό _secret-field_ καθορίζει ένα πεδίο στο ανακτημένο μυστικό για ανάγνωση. Εάν παραλειφθεί, ο διαχειριστής πιστοποιητικών μπορεί να επιλέξει να διαβάσει ένα 'προεπιλεγμένο πεδίο' από το ανακτημένο πιστοποιητικό εάν το πεδίο υπάρχει.
Επιπλέον, οι secret-path και secret-field μπορεί να περικλείονται με διπλά εισαγωγικά "..."
εάν περιέχουν ειδικούς χαρακτήρες όπως .
και :
. Για παράδειγμα, ((source:"my.secret"."field:1"))
θα ορίσει το secret-path σε my.secret
και το secret-field σε field:1
.
Στατικές Μεταβλητές
Οι στατικές μεταβλητές μπορούν να καθοριστούν στα βήματα των εργασιών:
Ή χρησιμοποιώντας τα ακόλουθα fly
όρισματα:
-v
ή--var
NAME=VALUE
ορίζει το αλφαριθμητικόVALUE
ως την τιμή για τη μεταβλητήNAME
.-y
ή--yaml-var
NAME=VALUE
αναλύει τοVALUE
ως YAML και το ορίζει ως την τιμή για τη μεταβλητήNAME
.-i
ή--instance-var
NAME=VALUE
αναλύει τοVALUE
ως YAML και το ορίζει ως την τιμή για τη μεταβλητή της περίπτωσηςNAME
. Δείτε Ομαδοποίηση Αγωγών για να μάθετε περισσότερα σχετικά με τις μεταβλητές της περίπτωσης.-l
ή--load-vars-from
FILE
φορτώνει τοFILE
, ένα έγγραφο YAML που περιέχει την αντιστοίχιση των ονομάτων μεταβλητών σε τιμές και τις ορίζει όλες.
Διαχείριση Διαπιστευτηρίων
Υπάρχουν διάφοροι τρόποι με τους οποίους μπορεί να καθοριστεί ένας Διαχειριστής Διαπιστευτηρίων σε μια αγωγή, διαβάστε πώς στο https://concourse-ci.org/creds.html. Επιπλέον, το Concourse υποστηρίζει διάφορους διαχειριστές διαπιστευτηρίων:
Σημειώστε ότι αν έχετε κάποια μορφή πρόσβασης εγγραφής στο Concourse μπορείτε να δημιουργήσετε εργασίες για να διαρρεύσετε αυτά τα μυστικά καθώς το Concourse πρέπει να μπορεί να τα αποκτήσει πρόσβαση.
Απαρίθμηση Concourse
Για να απαριθμήσετε ένα περιβάλλον Concourse, πρέπει πρώτα να συγκεντρώσετε έγκυρα διαπιστευτήρια ή να βρείτε ένα εξουσιοδοτημένο τοκέν πιθανώς σε ένα αρχείο διαμόρφωσης .flyrc
.
Σύνδεση και απαρίθμηση τρέχοντος χρήστη
Για να συνδεθείτε, πρέπει να γνωρίζετε το σημείο πρόσβασης, το όνομα ομάδας (προεπιλογή είναι
main
) και μια ομάδα στην οποία ανήκει ο χρήστης:fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]
Πάρτε τις στόχους που έχουν διαμορφωθεί:
fly targets
Ελέγξτε αν η σύνδεση με τον στόχο που έχει διαμορφωθεί είναι ακόμα έγκυρη:
fly -t <target> status
Πάρτε το ρόλο του χρήστη έναντι του στόχου που υποδεικνύεται:
fly -t <target> userinfo
Σημειώστε ότι το διακριτικό API αποθηκεύεται από προεπιλογή στο $HOME/.flyrc
, οπότε αν κλέψετε μια μηχανή μπορείτε να βρείτε εκεί τα διαπιστευτήρια.
Ομάδες & Χρήστες
Πάρτε μια λίστα με τις Ομάδες
fly -t <target> teams
Πάρτε τους ρόλους μέσα στην ομάδα
fly -t <target> get-team -n <team-name>
Πάρτε μια λίστα με τους χρήστες
fly -t <target> active-users
Αγωγές
Λίστα αγωγών:
fly -t <target> pipelines -a
Πάρτε το yaml της αγωγής (ευαίσθητες πληροφορίες μπορεί να βρεθούν στον ορισμό):
fly -t <target> get-pipeline -p <pipeline-name>
Πάρτε όλες τις δηλωμένες μεταβλητές ρυθμίσεων της αγωγής
for pipename in $(fly -t <target> pipelines | grep -Ev "^id" | awk '{print $2}'); do echo $pipename; fly -t <target> get-pipeline -p $pipename -j | grep -Eo '"vars":[^}]+'; done
Πάρτε όλα τα ονόματα μυστικών που χρησιμοποιούνται στις αγωγές (αν μπορείτε να δημιουργήσετε/τροποποιήσετε μια εργασία ή να αποκτήσετε έλεγχο ενός container, μπορείτε να τα διαρρεύσετε):
Κοντέινερ & Εργαζόμενοι
Λίστα εργαζομένων:
fly -t <target> workers
Λίστα κοντέινερ:
fly -t <target> containers
Λίστα builds (για να δείτε τι τρέχει):
fly -t <target> builds
Επιθέσεις στο Concourse
Βίαιη Δοκιμή Διαπιστευτηρίων
admin:admin
test:test
Απαρίθμηση Μυστικών και παραμέτρων
Στο προηγούμενο τμήμα είδαμε πώς μπορείτε να πάρετε όλα τα ονόματα μυστικών και μεταβλητών που χρησιμοποιούνται από το pipeline. Οι μεταβλητές μπορεί να περιέχουν ευαίσθητες πληροφορίες και το όνομα των μυστικών θα είναι χρήσιμο αργότερα για να προσπαθήσετε να τα κλέψετε.
Συνεδρία μέσα σε εκτελούμενο ή πρόσφατα εκτελεσμένο κοντέινερ
Εάν έχετε αρκετά προνόμια (ρόλος μέλους ή περισσότερο) θα μπορείτε να καταλογογραφήσετε τα pipelines και τους ρόλους και απλά να πάρετε μια συνεδρία μέσα στον κοντέινερ <pipeline>/<job>
χρησιμοποιώντας:
Με αυτές τις άδειες μπορείς να:
Κλέψεις τα μυστικά μέσα από το container
Προσπαθήσεις να δραπετεύσεις στον κόμβο
Απαριθμήσεις/Εκμεταλλευτείς το metadata του cloud (από το pod και από τον κόμβο, αν είναι δυνατόν)
Δημιουργία/Τροποποίηση Αγωγού
Αν έχεις αρκετά προνόμια (ρόλος μέλους ή περισσότερο), θα μπορείς να δημιουργήσεις/τροποποιήσεις νέους αγωγούς. Ελέγξτε αυτό το παράδειγμα:
Με τη τροποποίηση/δημιουργία ενός νέου pipeline θα μπορείτε να:
Κλέψετε τα μυστικά (μέσω της εμφάνισής τους ή μπαίνοντας μέσα στο container και εκτελώντας
env
)Αποδράσετε στον κόμβο (δίνοντάς σας αρκετά προνόμια -
privileged: true
)Απαριθμήστε/Καταχραστείτε το metadata endpoint του cloud (από το pod και από τον κόμβο)
Διαγράψτε το δημιουργημένο pipeline
Εκτέλεση Προσαρμοσμένης Εργασίας
Αυτό είναι παρόμοιο με την προηγούμενη μέθοδο, αλλά αντί να τροποποιήσετε/δημιουργήσετε ένα ολόκληρο νέο pipeline, μπορείτε απλά να εκτελέσετε μια προσαρμοσμένη εργασία (που πιθανότατα θα είναι πολύ πιο αόρατη):
Απόδραση στον κόμβο από προνομιούχα εργασία
Στα προηγούμενα τμήματα είδαμε πώς να εκτελέσουμε μια προνομιούχα εργασία με το concourse. Αυτό δεν δίνει στον container ακριβώς την ίδια πρόσβαση με την προνομιούχα σημαία σε ένα docker container. Για παράδειγμα, δεν θα δείτε τη συσκευή αρχείου συστήματος του κόμβου στο /dev, οπότε η απόδραση μπορεί να είναι πιο "πολύπλοκη".
Στο παρακάτω PoC θα χρησιμοποιήσουμε το release_agent για να αποδράσουμε με μερικές μικρές τροποποιήσεις:
Όπως μπορείτε να παρατηρήσετε, αυτό είναι απλά ένα απόδραση του release_agent με την τροποποίηση της διαδρομής της εντολής στον κόμβο
Απόδραση στον κόμβο από έναν εργατικό container
Μια απλή απόδραση του release_agent με μια μικρή τροποποίηση είναι αρκετή για αυτό:
Απόδραση στον κόμβο από τον δοχείο του Ιστού
Ακόμα κι αν το δοχείο του Ιστού έχει απενεργοποιημένες ορισμένες αμυντικές μηχανισμούς, δεν εκτελείται ως ένα κοινό προνομιούχο δοχείο (για παράδειγμα, δεν μπορείτε να κάνετε mount και οι δυνατότητες είναι πολύ περιορισμένες), οπότε όλοι οι εύκολοι τρόποι για να αποδράσετε από το δοχείο είναι άχρηστοι.
Ωστόσο, αποθηκεύει τα τοπικά διαπιστευτήρια σε καθαρό κείμενο:
Μπορείτε να χρησιμοποιήσετε αυτές τις πιστοποιήσεις για να συνδεθείτε στον διακομιστή ιστού και να δημιουργήσετε ένα προνομιούχο container και να δραπετεύσετε στον κόμβο.
Στο περιβάλλον μπορείτε επίσης να βρείτε πληροφορίες για να αποκτήσετε πρόσβαση στην εγκατάσταση postgresql που χρησιμοποιεί το concourse (διεύθυνση, όνομα χρήστη, κωδικό πρόσβασης και άλλες πληροφορίες για τη βάση δεδομένων):
Κατάχρηση της υπηρεσίας Garden - Δεν είναι πραγματική επίθεση
Αυτές είναι απλά μερικές ενδιαφέρουσες σημειώσεις για την υπηρεσία, αλλά επειδή ακούει μόνο στο localhost, αυτές οι σημειώσεις δεν θα έχουν κανένα αντίκτυπο που δεν έχουμε ήδη εκμεταλλευτεί προηγουμένως.
Από προεπιλογή, κάθε εργαζόμενος του Concourse θα εκτελεί μια υπηρεσία Garden στη θύρα 7777. Αυτή η υπηρεσία χρησιμοποιείται από τον διαχειριστή του ιστότοπου για να υποδείξει στον εργαζόμενο τι χρειάζεται να εκτελέσει (να κατεβάσει την εικόνα και να εκτελέσει κάθε εργασία). Αυτό ακούγεται πολύ καλό για έναν επιτιθέμενο, αλλά υπάρχουν μερικές καλές προστασίες:
Είναι απλά προσβάσιμο τοπικά (127.0.0.1) και νομίζω ότι όταν ο εργαζόμενος επαληθεύεται ξανά από τον ιστό με την ειδική υπηρεσία SSH, δημιουργείται ένας σωλήνας, έτσι ώστε ο ιστός να επικοινωνεί με κάθε υπηρεσία Garden μέσα σε κάθε εργαζόμενο.
Ο ιστός παρακολουθεί τα εκτελούμενα δοχεία κάθε λίγα δευτερόλεπτα, και τα αναπάντεχα δοχεία διαγράφονται. Έτσι, αν θέλετε να εκτελέσετε ένα προσαρμοσμένο δοχείο, πρέπει να παρεμβάλετε στη επικοινωνία μεταξύ του ιστού και της υπηρεσίας garden.
Οι εργαζόμενοι του Concourse λειτουργούν με υψηλά προνόμια δοχείου:
Ωστόσο, τεχνικές όπως η προσάρτηση της συσκευής /dev του κόμβου ή του release_agent δεν θα λειτουργήσουν (καθώς η πραγματική συσκευή με το σύστημα αρχείων του κόμβου δεν είναι προσβάσιμη, μόνο μια εικονική). Δεν μπορούμε να έχουμε πρόσβαση στις διεργασίες του κόμβου, οπότε η διαφυγή από τον κόμβο χωρίς εκμετάλλευση του πυρήνα γίνεται περίπλοκη.
Στην προηγούμενη ενότητα είδαμε πώς να διαφύγουμε από ένα προνομιούχο container, οπότε αν μπορούμε να εκτελέσουμε εντολές σε ένα προνομιούχο container που δημιουργήθηκε από τον τρέχοντα εργαζόμενο, θα μπορούσαμε να διαφύγουμε στον κόμβο.
Να σημειωθεί ότι παίζοντας με το concourse παρατήρησα ότι όταν δημιουργείται ένα νέο container για να εκτελέσει κάτι, οι διεργασίες του container είναι προσβάσιμες από τον εργαζόμενο container, οπότε είναι σαν να δημιουργείται ένα νέο container μέσα σε αυτό.
Εισβολή σε ένα εκτελούμενο προνομιούχο container
Δημιουργία ενός νέου προνομιούχου container
Μπορείτε πολύ εύκολα να δημιουργήσετε ένα νέο container (απλά εκτελέστε ένα τυχαίο UID) και να εκτελέσετε κάτι πάνω σε αυτό:
Ωστόσο, ο διακομιστής ιστού ελέγχει κάθε λίγα δευτερόλεπτα τα ενεργά δοχεία και αν ανιχνευθεί ένα αναπάντεχο, θα διαγραφεί. Καθώς η επικοινωνία γίνεται μέσω HTTP, μπορείτε να παρεμβάλετε στην επικοινωνία για να αποφύγετε τη διαγραφή αναπάντεχων δοχείων:
Αναφορές
https://concourse-ci.org/vars.html
Last updated