17 KiB
Github Security
{{#include ../../banners/hacktricks-training.md}}
Šta je Github
(From here) Na visokom nivou, GitHub je veb sajt i usluga zasnovana na oblaku koja pomaže programerima da čuvaju i upravljaju svojim kodom, kao i da prate i kontrolišu promene u svom kodu.
Osnovne informacije
{{#ref}} basic-github-information.md {{#endref}}
Spoljašnje istraživanje
Github repozitorijumi mogu biti konfigurisani kao javni, privatni i interni.
- Privatni znači da će samo ljudi iz organizacije moći da im pristupe
- Interni znači da će samo ljudi iz preduzeća (preduzeće može imati nekoliko organizacija) moći da mu pristupe
- Javni znači da će svi na internetu moći da mu pristupe.
U slučaju da znate korisnika, repozitorijum ili organizaciju koju želite da ciljate, možete koristiti github dorks da pronađete osetljive informacije ili pretražujete curenja osetljivih informacija u svakom repozitorijumu.
Github Dorks
Github omogućava da pretražujete nešto specificirajući kao opseg korisnika, repozitorijuma ili organizacije. Stoga, sa listom stringova koji će se pojaviti blizu osetljivih informacija, možete lako pretraživati potencijalne osetljive informacije u vašem cilju.
Alati (svaki alat sadrži svoju listu dorks):
- https://github.com/obheda12/GitDorker (Lista Dorks)
- https://github.com/techgaun/github-dorks (Lista Dorks)
- https://github.com/hisxo/gitGraber (Lista Dorks)
Github Curenja
Molimo vas, imajte na umu da su github dorks takođe namenjeni pretraživanju curenja koristeći github opcije pretrage. Ova sekcija je posvećena onim alatima koji će preuzeti svaki repozitorijum i pretražiti osetljive informacije u njima (čak proveravajući određenu dubinu commit-a).
Alati (svaki alat sadrži svoju listu regex-a):
- https://github.com/zricethezav/gitleaks
- https://github.com/trufflesecurity/truffleHog
- https://github.com/eth0izzle/shhgit
- https://github.com/michenriksen/gitrob
- https://github.com/anshumanbh/git-all-secrets
- https://github.com/kootenpv/gittyleaks
- https://github.com/awslabs/git-secrets
Warning
Kada tražite curenja u repozitorijumu i pokrenete nešto poput
git log -p, ne zaboravite da mogu postojati druge grane sa drugim commit-ima koje sadrže tajne!
Spoljašnji Forkovi
Moguće je kompromitovati repozitorijume zloupotrebom pull zahteva. Da biste znali da li je repozitorijum ranjiv, uglavnom treba da pročitate Github Actions yaml konfiguracije. Više informacija o ovome u nastavku.
Github Curenja u obrisanim/internim forkovima
Čak i ako su obrisani ili interni, može biti moguće dobiti osetljive podatke iz forkova github repozitorijuma. Proverite ovde:
{{#ref}} accessible-deleted-data-in-github.md {{#endref}}
Ojačavanje organizacije
Privilegije članova
Postoje neke podrazumevane privilegije koje se mogu dodeliti članovima organizacije. Ove se mogu kontrolisati sa stranice https://github.com/organizations/<org_name>/settings/member_privileges ili iz Organizations API.
- Osnovne dozvole: Članovi će imati dozvolu None/Read/write/Admin za repozitorijume organizacije. Preporučuje se None ili Read.
- Forkovanje repozitorijuma: Ako nije neophodno, bolje je ne dozvoliti članovima da fork-uju repozitorijume organizacije.
- Kreiranje stranica: Ako nije neophodno, bolje je ne dozvoliti članovima da objavljuju stranice iz repozitorijuma organizacije. Ako je neophodno, možete dozvoliti kreiranje javnih ili privatnih stranica.
- Zahtevi za pristup integraciji: Sa ovim omogućeno, spoljnim saradnicima će biti omogućeno da zatraže pristup za GitHub ili OAuth aplikacije da pristupe ovoj organizaciji i njenim resursima. Obično je potrebno, ali ako nije, bolje je onemogućiti to.
- Nisam mogao pronaći ove informacije u API odgovoru, podelite ako ih pronađete
- Promena vidljivosti repozitorijuma: Ako je omogućeno, članovi sa admin dozvolama za repozitorijum će moći da promene njegovu vidljivost. Ako je onemogućeno, samo vlasnici organizacije mogu menjati vidljivosti repozitorijuma. Ako ne želite da ljudi učine stvari javnim, uverite se da je ovo onemogućeno.
- Nisam mogao pronaći ove informacije u API odgovoru, podelite ako ih pronađete
- Brisanje i prenos repozitorijuma: Ako je omogućeno, članovi sa admin dozvolama za repozitorijum će moći da obrišu ili prenose javne i privatne repozitorijume.
- Nisam mogao pronaći ove informacije u API odgovoru, podelite ako ih pronađete
- Dozvoliti članovima da kreiraju timove: Ako je omogućeno, svaki član organizacije će moći da kreira nove timove. Ako je onemogućeno, samo vlasnici organizacije mogu kreirati nove timove. Bolje je da ovo bude onemogućeno.
- Nisam mogao pronaći ove informacije u API odgovoru, podelite ako ih pronađete
- Još stvari se mogu konfigurisati na ovoj stranici, ali prethodne su one koje su više vezane za bezbednost.
Podešavanja akcija
Nekoliko podešavanja vezanih za bezbednost može se konfigurisati za akcije sa stranice https://github.com/organizations/<org_name>/settings/actions.
Note
Imajte na umu da se sve ove konfiguracije takođe mogu postaviti na svakom repozitorijumu nezavisno
- Github akcije politike: Omogućava vam da navedete koji repozitorijumi mogu pokretati radne tokove i koji radni tokovi bi trebali biti dozvoljeni. Preporučuje se da specificirate koji repozitorijumi bi trebali biti dozvoljeni i ne dozvoliti svim akcijama da se pokreću.
- API-1, API-2
- Fork pull request radni tokovi od spoljnjih saradnika: Preporučuje se da zahtevate odobrenje za sve spoljne saradnike.
- Nisam mogao pronaći API sa ovim informacijama, podelite ako ih pronađete
- Pokretanje radnih tokova iz fork pull zahteva: Veoma je nepreporučljivo pokretati radne tokove iz pull zahteva jer će održavaoci fork porekla dobiti mogućnost korišćenja tokena sa dozvolama za čitanje na izvorni repozitorijum.
- Nisam mogao pronaći API sa ovim informacijama, podelite ako ih pronađete
- Dozvole radnog toka: Veoma se preporučuje da samo date dozvole za čitanje repozitorijuma. Ne preporučuje se davanje dozvola za pisanje i kreiranje/odobravanje pull zahteva kako bi se izbegla zloupotreba GITHUB_TOKEN-a datog pokrenutim radnim tokovima.
- API
Integracije
Javite mi ako znate API krajnju tačku za pristup ovim informacijama!
- Politika pristupa aplikacijama trećih strana: Preporučuje se ograničiti pristup svakoj aplikaciji i dozvoliti samo potrebne (nakon pregleda).
- Instalirane GitHub aplikacije: Preporučuje se dozvoliti samo potrebne (nakon pregleda).
Istraživanje i napadi zloupotrebom kredencijala
Za ovaj scenario pretpostavićemo da ste dobili neki pristup github nalogu.
Sa korisničkim kredencijalima
Ako nekako već imate kredencijale za korisnika unutar organizacije, možete samo da se prijavite i proverite koje preduzetničke i organizacione uloge imate, ako ste običan član, proverite koje dozvole imaju obični članovi, u kojim grupama ste, koje dozvole imate nad kojim repozitorijumima i kako su repozitorijumi zaštićeni.
Imajte na umu da se 2FA može koristiti tako da ćete moći da pristupite ovim informacijama samo ako takođe možete proći tu proveru.
Note
Imajte na umu da ako uspete da ukradete
user_sessionkolačić (trenutno konfigurisano sa SameSite: Lax) možete potpuno imitirati korisnika bez potrebe za kredencijalima ili 2FA.
Proverite odeljak u nastavku o zaobilaznicama zaštite grana u slučaju da je korisno.
Sa korisničkim SSH ključem
Github omogućava korisnicima da postave SSH ključeve koji će se koristiti kao metoda autentifikacije za implementaciju koda u njihovo ime (2FA se ne primenjuje).
Sa ovim ključem možete izvršiti promene u repozitorijumima gde korisnik ima neke privilegije, međutim ne možete ga koristiti za pristup github API-ju da enumerišete okruženje. Međutim, možete enumerisati lokalne postavke da dobijete informacije o repozitorijumima i korisniku kojem imate pristup:
# Go to the the repository folder
# Get repo config and current user name and email
git config --list
Ako je korisnik konfigurisao svoje korisničko ime kao svoje github korisničko ime, možete pristupiti javnim ključevima koje je postavio na svom nalogu na https://github.com/<github_username>.keys, možete proveriti ovo da potvrdite da li se privatni ključ koji ste pronašli može koristiti.
SSH ključevi se takođe mogu postaviti u repozitorijume kao deploy ključevi. Svako ko ima pristup ovom ključiću moći će da pokrene projekte iz repozitorijuma. Obično, na serveru sa različitim deploy ključevima, lokalna datoteka ~/.ssh/config će vam dati informacije o tome kojem ključu se odnosi.
GPG Ključevi
Kao što je objašnjeno ovde, ponekad je potrebno potpisati commit-e ili biste mogli biti otkriveni.
Proverite lokalno da li trenutni korisnik ima neki ključ sa:
gpg --list-secret-keys --keyid-format=long
Sa korisničkim tokenom
Za uvod o korisničkim tokenima proverite osnovne informacije.
Korisnički token može biti korišćen umesto lozinke za Git preko HTTPS-a, ili može biti korišćen za autentifikaciju na API preko osnovne autentifikacije. U zavisnosti od privilegija koje su mu dodeljene, možda ćete moći da izvršite različite radnje.
Korisnički token izgleda ovako: ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123
Sa Oauth aplikacijom
Za uvod o Github Oauth aplikacijama proverite osnovne informacije.
Napadač može kreirati malicious Oauth aplikaciju da bi pristupio privilegovanim podacima/radnjama korisnika koji je prihvataju verovatno kao deo phishing kampanje.
Ovo su opsegovi koje Oauth aplikacija može zatražiti. Uvek treba proveriti tražene opsegove pre nego što ih prihvatite.
Pored toga, kao što je objašnjeno u osnovnim informacijama, organizacije mogu dati/oduzeti pristup trećim aplikacijama informacijama/repozitorijima/radnjama vezanim za organizaciju.
Sa Github aplikacijom
Za uvod o Github aplikacijama proverite osnovne informacije.
Napadač može kreirati malicious Github aplikaciju da bi pristupio privilegovanim podacima/radnjama korisnika koji je prihvataju verovatno kao deo phishing kampanje.
Pored toga, kao što je objašnjeno u osnovnim informacijama, organizacije mogu dati/oduzeti pristup trećim aplikacijama informacijama/repozitorijima/radnjama vezanim za organizaciju.
Kompromitovanje i zloupotreba Github akcije
Postoji nekoliko tehnika za kompromitovanje i zloupotrebu Github akcije, proverite ih ovde:
{{#ref}} abusing-github-actions/ {{#endref}}
Obilaženje zaštite grane
- Zahtevajte određeni broj odobrenja: Ako ste kompromitovali nekoliko naloga, možete jednostavno prihvatiti svoje PR-ove iz drugih naloga. Ako imate samo nalog sa kojeg ste kreirali PR, ne možete prihvatiti svoj PR. Međutim, ako imate pristup Github Action okruženju unutar repozitorijuma, koristeći GITHUB_TOKEN možda ćete moći da odobrite svoj PR i dobijete 1 odobrenje na ovaj način.
- Napomena za ovo i za ograničenje vlasnika koda da obično korisnik neće moći da odobri svoje PR-ove, ali ako možete, možete to zloupotrebiti da prihvatite svoje PR-ove.
- Odbacite odobrenja kada su novi commit-ovi poslati: Ako ovo nije postavljeno, možete poslati legitiman kod, čekati da ga neko odobri, a zatim staviti maliciozni kod i spojiti ga u zaštićenu granu.
- Zahtevajte preglede od vlasnika koda: Ako je ovo aktivirano i vi ste vlasnik koda, mogli biste napraviti Github Action da kreira vaš PR i zatim ga odobrite sami.
- Kada je CODEOWNER datoteka pogrešno konfigurisana, Github se ne žali, ali je ne koristi. Stoga, ako je pogrešno konfigurisana, zaštita vlasnika koda nije primenjena.
- Dozvolite određenim akterima da zaobiđu zahteve za povlačenje: Ako ste jedan od ovih aktera, možete zaobići zaštitu zahteva za povlačenje.
- Uključite administratore: Ako ovo nije postavljeno i vi ste administrator repozitorijuma, možete zaobići ovu zaštitu grane.
- PR otmica: Možda ćete moći da modifikujete PR nekog drugog dodajući maliciozni kod, odobravajući rezultantni PR sami i spajajući sve.
- Uklanjanje zaštite grane: Ako ste administrator repozitorijuma, možete onemogućiti zaštite, spojiti svoj PR i ponovo postaviti zaštite.
- Obilaženje zaštita za slanje: Ako repozitorijum samo dozvoljava određenim korisnicima da šalju push (spajaju kod) u granama (zaštita grane može štititi sve grane specificirajući wildcard
*). - Ako imate pristup pisanju u repozitorijumu, ali vam nije dozvoljeno da šaljete kod zbog zaštite grane, još uvek možete napraviti novu granu i unutar nje kreirati github akciju koja se aktivira kada se kod pošalje. Kako zaštita grane neće štititi granu dok ne bude kreirana, ovo prvo slanje koda u granu će izvršiti github akciju.
Obilaženje zaštita okruženja
Za uvod o Github okruženju proverite osnovne informacije.
U slučaju da se okruženje može pristupiti sa svih grana, nije zaštićeno i možete lako pristupiti tajnama unutar okruženja. Imajte na umu da možete pronaći repozitorijume gde su sve grane zaštićene (specifikovanjem njihovih imena ili korišćenjem *), u tom scenariju, pronađite granu u kojoj možete poslati kod i možete izvući tajne kreirajući novu github akciju (ili modifikujući jednu).
Napomena, možete naići na ivicu slučaja gde su sve grane zaštićene (putem wildcard *) i specificirano je ko može slati kod u grane (to možete specificirati u zaštiti grane) i vašem korisniku nije dozvoljeno. I dalje možete pokrenuti prilagođenu github akciju jer možete kreirati granu i koristiti okidač za slanje preko nje same. Zaštita grane dozvoljava slanje u novu granu, tako da će github akcija biti aktivirana.
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
Napomena da će se nakon kreiranja grane zaštita grane primeniti na novu granu i nećete moći da je izmenite, ali do tada ćete već izvući tajne.
Persistencija
- Generišite korisnički token
- Ukradite github tokene iz tajni
- Brisanje rezultata workflow-a i grana
- Dajte više dozvola celoj organizaciji
- Kreirajte webhook-ove za exfiltraciju informacija
- Pozovite spoljašnje saradnike
- Uklonite webhook-ove koje koristi SIEM
- Kreirajte/izmenite Github Action sa bekdoor-om
- Pronađite ranjivu Github Action za injekciju komandi putem modifikacije vrednosti tajne
Impostor Commit-ovi - Bekdoor putem repo commit-ova
U Github-u je moguće napraviti PR za repo iz forka. Čak i ako PR nije prihvaćen, commit id unutar originalnog repoa će biti kreiran za fork verziju koda. Stoga, napadač može da se oslanja na korišćenje specifičnog commit-a iz naizgled legitimnog repoa koji nije kreirao vlasnik repoa.
Kao ovaj:
name: example
on: [push]
jobs:
commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e
- shell: bash
run: |
echo 'hello world!'
Za više informacija proverite https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd
{{#include ../../banners/hacktricks-training.md}}