Github Security

Supporta HackTricks

Cos'è Github

(Da qui) A un livello alto, GitHub è un sito web e un servizio basato su cloud che aiuta gli sviluppatori a memorizzare e gestire il loro codice, oltre a tracciare e controllare le modifiche al loro codice.

Informazioni di base

Basic Github Information

Ricognizione esterna

I repository di Github possono essere configurati come pubblici, privati e interni.

  • Privato significa che solo le persone dell'organizzazione potranno accedervi

  • Interno significa che solo le persone dell'impresa (un'impresa può avere diverse organizzazioni) potranno accedervi

  • Pubblico significa che tutto internet potrà accedervi.

Nel caso tu conosca l'utente, il repo o l'organizzazione che vuoi targetizzare, puoi usare github dorks per trovare informazioni sensibili o cercare leak di informazioni sensibili in ogni repo.

Github Dorks

Github consente di cercare qualcosa specificando come ambito un utente, un repo o un'organizzazione. Pertanto, con un elenco di stringhe che appariranno vicino a informazioni sensibili, puoi facilmente cercare potenziali informazioni sensibili nel tuo obiettivo.

Strumenti (ogni strumento contiene il proprio elenco di dorks):

Github Leaks

Si prega di notare che i github dorks sono anche destinati a cercare leak utilizzando le opzioni di ricerca di github. Questa sezione è dedicata a quegli strumenti che scaricheranno ogni repo e cercheranno informazioni sensibili in essi (anche controllando una certa profondità di commit).

Strumenti (ogni strumento contiene il proprio elenco di regex):

Quando cerchi leak in un repo e esegui qualcosa come git log -p, non dimenticare che potrebbero esserci altri rami con altri commit contenenti segreti!

Fork esterni

È possibile compromettere i repo abusando delle pull request. Per sapere se un repo è vulnerabile, è necessario principalmente leggere le configurazioni yaml delle Github Actions. Maggiori informazioni su questo di seguito.

Github Leaks in fork eliminati/interni

Anche se eliminati o interni, potrebbe essere possibile ottenere dati sensibili dai fork dei repository di github. Controllalo qui:

Accessible Deleted Data in Github

Indurimento dell'organizzazione

Privilegi dei membri

Ci sono alcuni privilegi predefiniti che possono essere assegnati ai membri dell'organizzazione. Questi possono essere controllati dalla pagina https://github.com/organizations/<org_name>/settings/member_privileges o dall'API delle organizzazioni.

  • Permessi di base: I membri avranno il permesso Nessuno/Leggi/scrivi/Amministratore sui repository dell'organizzazione. Si consiglia di impostare Nessuno o Leggi.

  • Forking dei repository: Se non necessario, è meglio non consentire ai membri di forkare i repository dell'organizzazione.

  • Creazione di pagine: Se non necessario, è meglio non consentire ai membri di pubblicare pagine dai repo dell'organizzazione. Se necessario, puoi consentire di creare pagine pubbliche o private.

  • Richieste di accesso all'integrazione: Con questo abilitato, i collaboratori esterni potranno richiedere l'accesso per le app GitHub o OAuth per accedere a questa organizzazione e alle sue risorse. È solitamente necessario, ma se non lo è, è meglio disabilitarlo.

  • Non sono riuscito a trovare queste informazioni nella risposta delle API, condividi se lo fai

  • Cambio di visibilità del repository: Se abilitato, i membri con permessi amministrativi per il repository potranno cambiare la sua visibilità. Se disabilitato, solo i proprietari dell'organizzazione possono cambiare le visibilità dei repository. Se non vuoi che le persone rendano le cose pubbliche, assicurati che questo sia disabilitato.

  • Non sono riuscito a trovare queste informazioni nella risposta delle API, condividi se lo fai

  • Cancellazione e trasferimento del repository: Se abilitato, i membri con permessi amministrativi per il repository potranno cancellare o trasferire repository pubblici e privati.

  • Non sono riuscito a trovare queste informazioni nella risposta delle API, condividi se lo fai

  • Consentire ai membri di creare team: Se abilitato, qualsiasi membro dell'organizzazione potrà creare nuovi team. Se disabilitato, solo i proprietari dell'organizzazione possono creare nuovi team. È meglio avere questo disabilitato.

  • Non sono riuscito a trovare queste informazioni nella risposta delle API, condividi se lo fai

  • Altre cose possono essere configurate in questa pagina, ma le precedenti sono quelle più legate alla sicurezza.

Impostazioni delle azioni

Diverse impostazioni relative alla sicurezza possono essere configurate per le azioni dalla pagina https://github.com/organizations/<org_name>/settings/actions.

Nota che tutte queste configurazioni possono anche essere impostate su ciascun repository in modo indipendente

  • Politiche delle azioni di Github: Consente di indicare quali repository possono eseguire flussi di lavoro e quali flussi di lavoro dovrebbero essere consentiti. Si consiglia di specificare quali repository dovrebbero essere consentiti e di non consentire a tutte le azioni di essere eseguite.

  • Flussi di lavoro delle pull request forkate da collaboratori esterni: Si consiglia di richiedere approvazione per tutti i collaboratori esterni.

  • Non sono riuscito a trovare un'API con queste informazioni, condividi se lo fai

  • Esegui flussi di lavoro da pull request forkate: È fortemente sconsigliato eseguire flussi di lavoro da pull request poiché i manutentori del fork originale avranno la possibilità di utilizzare token con permessi di lettura sul repository sorgente.

  • Non sono riuscito a trovare un'API con queste informazioni, condividi se lo fai

  • Permessi dei flussi di lavoro: È altamente consigliato dare solo permessi di lettura sui repository. È sconsigliato dare permessi di scrittura e di creazione/approvazione delle pull request per evitare l'abuso del GITHUB_TOKEN dato ai flussi di lavoro in esecuzione.

Integrazioni

Fammi sapere se conosci l'endpoint API per accedere a queste informazioni!

  • Politica di accesso alle applicazioni di terze parti: Si consiglia di limitare l'accesso a ogni applicazione e consentire solo quelle necessarie (dopo averle esaminate).

  • App GitHub installate: Si consiglia di consentire solo quelle necessarie (dopo averle esaminate).

Ricognizione e attacchi abusando delle credenziali

Per questo scenario supponiamo che tu abbia ottenuto un accesso a un account github.

Con le credenziali dell'utente

Se in qualche modo hai già le credenziali per un utente all'interno di un'organizzazione, puoi solo accedere e controllare quali ruoli di impresa e organizzazione hai, se sei un membro normale, controlla quali permessi hanno i membri normali, in quali gruppi sei, quali permessi hai su quali repo e come sono protetti i repo.

Nota che 2FA potrebbe essere utilizzato, quindi potrai accedere a queste informazioni solo se puoi anche superare quel controllo.

Nota che se riesci a rubare il cookie user_session (attualmente configurato con SameSite: Lax) puoi completamente impersonare l'utente senza bisogno di credenziali o 2FA.

Controlla la sezione qui sotto riguardo ai bypass delle protezioni dei rami nel caso possa essere utile.

Con la chiave SSH dell'utente

Github consente agli utenti di impostare chiavi SSH che verranno utilizzate come metodo di autenticazione per distribuire codice per loro conto (non viene applicata 2FA).

Con questa chiave puoi eseguire modifiche nei repository dove l'utente ha alcuni privilegi, tuttavia non puoi usarla per accedere all'API di github per enumerare l'ambiente. Tuttavia, puoi enumerare le impostazioni locali per ottenere informazioni sui repo e sull'utente a cui hai accesso:

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

Se l'utente ha configurato il proprio nome utente come il suo nome utente github, puoi accedere alle chiavi pubbliche che ha impostato nel suo account in https://github.com/<github_username>.keys, puoi controllare questo per confermare che la chiave privata che hai trovato può essere utilizzata.

Le chiavi SSH possono anche essere impostate nei repository come chiavi di distribuzione. Chiunque abbia accesso a questa chiave sarà in grado di lanciare progetti da un repository. Di solito, in un server con diverse chiavi di distribuzione, il file locale ~/.ssh/config ti darà informazioni su quale chiave è correlata.

Chiavi GPG

Come spiegato qui, a volte è necessario firmare i commit o potresti essere scoperto.

Controlla localmente se l'utente corrente ha qualche chiave con:

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

Con Token Utente

Per un'introduzione sui Token Utente controlla le informazioni di base.

Un token utente può essere utilizzato invece di una password per Git su HTTPS, o può essere utilizzato per autenticarsi all'API tramite Autenticazione di Base. A seconda dei privilegi ad esso associati, potresti essere in grado di eseguire diverse azioni.

Un token utente appare così: ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123

Con Applicazione Oauth

Per un'introduzione sulle Applicazioni Oauth di Github controlla le informazioni di base.

Un attaccante potrebbe creare un'Applicazione Oauth malevola per accedere a dati/azioni privilegiati degli utenti che le accettano probabilmente come parte di una campagna di phishing.

Questi sono i scope che un'applicazione Oauth può richiedere. Un utente dovrebbe sempre controllare gli scope richiesti prima di accettarli.

Inoltre, come spiegato nelle informazioni di base, le organizzazioni possono concedere/negare l'accesso a applicazioni di terze parti a informazioni/repo/azioni relative all'organizzazione.

Con Applicazione Github

Per un'introduzione sulle Applicazioni Github controlla le informazioni di base.

Un attaccante potrebbe creare un'Applicazione Github malevola per accedere a dati/azioni privilegiati degli utenti che le accettano probabilmente come parte di una campagna di phishing.

Inoltre, come spiegato nelle informazioni di base, le organizzazioni possono concedere/negare l'accesso a applicazioni di terze parti a informazioni/repo/azioni relative all'organizzazione.

Compromissione & Abuso di Github Action

Ci sono diverse tecniche per compromettere e abusare di una Github Action, controllale qui:

Abusing Github Actions

Bypass della Protezione dei Branch

  • Richiedere un numero di approvazioni: Se hai compromesso diversi account, potresti semplicemente accettare le tue PR da altri account. Se hai solo l'account da cui hai creato la PR, non puoi accettare la tua PR. Tuttavia, se hai accesso a un ambiente Github Action all'interno del repo, utilizzando il GITHUB_TOKEN potresti essere in grado di approvare la tua PR e ottenere 1 approvazione in questo modo.

  • Nota per questo e per la restrizione dei Code Owners che di solito un utente non sarà in grado di approvare le proprie PR, ma se lo sei, puoi abusarne per accettare le tue PR.

  • Annullare le approvazioni quando vengono inviati nuovi commit: Se questo non è impostato, puoi inviare codice legittimo, aspettare che qualcuno lo approvi e poi inserire codice malevolo e fonderlo nel branch protetto.

  • Richiedere revisioni dai Code Owners: Se questo è attivato e sei un Code Owner, potresti far sì che una Github Action crei la tua PR e poi approvarla tu stesso.

  • Quando un file CODEOWNER è configurato in modo errato, Github non si lamenta ma non lo utilizza. Pertanto, se è configurato in modo errato, la protezione dei Code Owners non viene applicata.

  • Consentire a attori specificati di bypassare i requisiti delle pull request: Se sei uno di questi attori puoi bypassare le protezioni delle pull request.

  • Includere gli amministratori: Se questo non è impostato e sei un amministratore del repo, puoi bypassare queste protezioni del branch.

  • Hijacking delle PR: Potresti essere in grado di modificare la PR di qualcun altro aggiungendo codice malevolo, approvando la PR risultante tu stesso e fondendo tutto.

  • Rimozione delle Protezioni dei Branch: Se sei un amministratore del repo puoi disabilitare le protezioni, fondere la tua PR e ripristinare le protezioni.

  • Bypass delle protezioni di push: Se un repo consente solo a determinati utenti di inviare push (fondere codice) nei branch (la protezione del branch potrebbe proteggere tutti i branch specificando il carattere jolly *).

  • Se hai accesso in scrittura sul repo ma non ti è permesso inviare codice a causa della protezione del branch, puoi comunque creare un nuovo branch e all'interno di esso creare una github action che viene attivata quando viene inviato codice. Poiché la protezione del branch non proteggerà il branch fino a quando non sarà creato, questo primo push di codice nel branch eseguirà la github action.

Bypass delle Protezioni degli Ambienti

Per un'introduzione sulle Ambientazioni di Github controlla le informazioni di base.

Nel caso in cui un ambiente possa essere accessibile da tutti i branch, non è protetto e puoi facilmente accedere ai segreti all'interno dell'ambiente. Nota che potresti trovare repo in cui tutti i branch sono protetti (specificando i loro nomi o utilizzando *), in quel caso, trova un branch dove puoi inviare codice e puoi esfiltrare i segreti creando una nuova github action (o modificandone una).

Nota che potresti trovare il caso limite in cui tutti i branch sono protetti (tramite carattere jolly *) è specificato chi può inviare codice ai branch (puoi specificarlo nella protezione del branch) e il tuo utente non è autorizzato. Puoi comunque eseguire una github action personalizzata perché puoi creare un branch e utilizzare il trigger di push su se stesso. La protezione del branch consente il push a un nuovo branch quindi la github action verrà attivata.

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

Nota che dopo la creazione del branch, la protezione del branch si applicherà al nuovo branch e non sarai in grado di modificarlo, ma per quel momento avrai già estratto i segreti.

Persistenza

  • Genera token utente

  • Ruba token github da secrets

  • Cancellazione dei risultati e dei branch del workflow

  • Dai più permessi a tutta l'organizzazione

  • Crea webhook per esfiltrare informazioni

  • Invita collaboratori esterni

  • Rimuovi i webhook utilizzati dal SIEM

  • Crea/modifica Github Action con una backdoor

  • Trova Github Action vulnerabili a command injection tramite modifica del valore secret

Commit di Impostore - Backdoor tramite commit del repo

In Github è possibile creare una PR per un repo da un fork. Anche se la PR non viene accettata, un commit id all'interno del repo originale verrà creato per la versione fork del codice. Pertanto, un attaccante potrebbe fare riferimento a un commit specifico da un repo apparentemente legittimo che non è stato creato dal proprietario del repo.

Come questo:

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

Per ulteriori informazioni controlla https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd

Supporta HackTricks

Last updated