# Gitea Security

{{#include ../../banners/hacktricks-training.md}}

## Šta je Gitea

**Gitea** je **rešenje za hostovanje koda koje se lako upravlja i koje se samostalno hostuje**, napisano u Go.

![](<../../images/image (160).png>)

### Osnovne informacije

{{#ref}}
basic-gitea-information.md
{{#endref}}

## Laboratorija

Da biste pokrenuli Gitea instancu lokalno, možete jednostavno pokrenuti docker kontejner:
```bash
docker run -p 3000:3000 gitea/gitea
```
Povežite se na port 3000 da biste pristupili veb stranici.

Takođe možete da ga pokrenete sa kubernetes:
```
helm repo add gitea-charts https://dl.gitea.io/charts/
helm install gitea gitea-charts/gitea
```
## Neautentifikovana Enumeracija

- Javni repozitorijumi: [http://localhost:3000/explore/repos](http://localhost:3000/explore/repos)
- Registrovani korisnici: [http://localhost:3000/explore/users](http://localhost:3000/explore/users)
- Registrovane organizacije: [http://localhost:3000/explore/organizations](http://localhost:3000/explore/organizations)

Imajte na umu da **podrazumevano Gitea omogućava novim korisnicima da se registruju**. Ovo neće pružiti posebno zanimljiv pristup novim korisnicima u odnosu na druge organizacije/korisnike repozitorijuma, ali **prijavljeni korisnik** može biti u mogućnosti da **vidi više repozitorijuma ili organizacija**.

## Interna Eksploatacija

Za ovaj scenario pretpostavićemo da ste dobili neki pristup github nalogu.

### Sa Korisničkim Akreditivima/Web Kolačićem

Ako već imate akreditive za korisnika unutar organizacije (ili ste ukrali kolačić sesije) možete **samo da se prijavite** i proverite koje **dozvole imate** nad kojim **repozitorijumima,** u **kojim timovima** se nalazite, **lista drugih korisnika**, 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 `i_like_gitea` kolačić** (trenutno konfigurisan sa SameSite: Lax) možete **potpuno imitirati korisnika** bez potrebe za akreditivima ili 2FA.

### Sa Korisničkim SSH Ključem

Gitea 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 neka prava**, međutim ne možete ga koristiti za pristup gitea API-ju da enumerišete okruženje. Međutim, možete **enumerisati lokalne postavke** da dobijete informacije o repozitorijumima i korisniku kojem imate pristup:
```bash
# 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 gitea korisničko ime, možete pristupiti **javnim ključevima koje je postavio** na svom nalogu na _https://github.com/\<gitea_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čeve**. 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**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/gitea-security/broken-reference/README.md), ponekad je potrebno potpisati commit-e ili biste mogli biti otkriveni.

Proverite lokalno da li trenutni korisnik ima neki ključ sa:
```shell
gpg --list-secret-keys --keyid-format=long
```
### Sa korisničkim tokenom

Za uvod o [**korisničkim tokenima proverite osnovne informacije**](basic-gitea-information.md#personal-access-tokens).

Korisnički token se može koristiti **umesto lozinke** za **autentifikaciju** protiv Gitea servera [**putem API-ja**](https://try.gitea.io/api/swagger#/). Imaće **potpun pristup** korisniku.

### Sa Oauth aplikacijom

Za uvod o [**Gitea Oauth aplikacijama proverite osnovne informacije**](./#with-oauth-application).

Napadač može kreirati **malicious Oauth aplikaciju** da bi pristupio privilegovanim podacima/akcijama korisnika koji ih verovatno prihvataju kao deo phishing kampanje.

Kao što je objašnjeno u osnovnim informacijama, aplikacija će imati **potpun pristup korisničkom nalogu**.

### Zaobilaženje zaštite grane

Na Github-u imamo **github akcije** koje po defaultu dobijaju **token sa pristupom za pisanje** na repozitorijum koji se može koristiti za **zaobilaženje zaštita grane**. U ovom slučaju to **ne postoji**, tako da su zaobilaženja ograničenija. Ali hajde da pogledamo šta može da se uradi:

- **Omogući Push**: Ako bilo ko sa pristupom za pisanje može da pošalje na granu, samo pošaljite na nju.
- **Whitelist Restricted Push**: Na isti način, ako ste deo ove liste, pošaljite na granu.
- **Omogući Merge Whitelist**: Ako postoji whitelist za spajanje, morate biti unutar nje.
- **Zahtevajte odobrenja veće od 0**: Tada... morate kompromitovati drugog korisnika.
- **Ograničite odobrenja na whitelisted**: Ako samo whitelisted korisnici mogu odobriti... morate kompromitovati drugog korisnika koji je unutar te liste.
- **Odbacite zastarela odobrenja**: Ako odobrenja nisu uklonjena novim commit-ima, mogli biste preuzeti već odobren PR da ubacite svoj kod i spojite PR.

Napomena: **ako ste admin org/repo** možete zaobići zaštite.

### Enumeracija Webhook-ova

**Webhook-ovi** su sposobni da **pošalju specifične gitea informacije na neka mesta**. Možda ćete moći da **iskoristite tu komunikaciju**.\
Međutim, obično se postavlja **tajna** koju ne možete **dobiti** u **webhook-u** koja će **sprečiti** spoljne korisnike koji znaju URL webhook-a, ali ne i tajnu, da **iskoriste taj webhook**.\
Ali u nekim prilikama, ljudi umesto da postave **tajnu** na njeno mesto, **postavljaju je u URL** kao parametar, tako da **proveravanje URL-ova** može omogućiti da **pronađete tajne** i druga mesta koja biste mogli dalje iskoristiti.

Webhook-ovi se mogu postaviti na **repo i na org nivou**.

## Post Eksploatacija

### Unutar servera

Ako ste nekako uspeli da uđete u server na kojem se gitea pokreće, trebali biste potražiti gitea konfiguracioni fajl. Po defaultu se nalazi u `/data/gitea/conf/app.ini`

U ovom fajlu možete pronaći **ključeve** i **lozinke**.

U gitea putanji (po defaultu: /data/gitea) možete pronaći i zanimljive informacije kao što su:

- **sqlite** DB: Ako gitea ne koristi eksternu bazu podataka, koristiće sqlite bazu.
- **sesije** unutar foldera sesija: Pokretanjem `cat sessions/*/*/*` možete videti korisnička imena prijavljenih korisnika (gitea takođe može sačuvati sesije unutar DB).
- **jwt privatni ključ** unutar jwt foldera.
- Više **osetljivih informacija** može se pronaći u ovom folderu.

Ako ste unutar servera, takođe možete **koristiti `gitea` binarni fajl** za pristup/modifikaciju informacija:

- `gitea dump` će dumpovati gitea i generisati .zip fajl.
- `gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET` će generisati token naznačenog tipa (persistence).
- `gitea admin user change-password --username admin --password newpassword` promenite lozinku.
- `gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token` kreirajte novog admin korisnika i dobijte pristupni token.

{{#include ../../banners/hacktricks-training.md}}
