diff --git a/src/pentesting-ci-cd/gogs-security/README.md b/src/pentesting-ci-cd/gogs-security/README.md new file mode 100644 index 000000000..f2d8cb600 --- /dev/null +++ b/src/pentesting-ci-cd/gogs-security/README.md @@ -0,0 +1,103 @@ +# Gogs Security + +{{#include ../../banners/hacktricks-training.md}} + +## Wat is Gogs + +**Gogs** is ’n **self-hosted lightweight Git service** geskryf in Go. Vanuit ’n aanvaller se oogpunt, behandel dit as ’n **multi-tenant Git hosting platform** waar ’n gebruiker met lae privileges steeds branch names, pull requests, webhooks, tokens, en repository settings kan beheer. + +## Git option injection through refs / branch names + +As ’n application ’n aanvaller-beheerde **ref name** direk na ’n Git command deurgee **sonder `--` of `--end-of-options`**, kan ’n branch wat met `--` begin as ’n **Git option** geparste word in plaas van as data. + +Tipiese gevaarlike patroon: +```bash +git +``` +Veiliger patroon verwag in defensiewe kode: +```bash +git -- +# or +git --end-of-options +``` +'n Algemene valse aanname is dat die validering van die ref met `git rev-parse --verify ` genoeg is. Dit is **nie**: + +- die aanvaller kan eers **’n werklike branch skep** wie se naam met `--` begin +- `rev-parse --verify` kontroleer slegs dat die ref na ’n object oplos +- ’n latere onveilige Git-aanroep kan steeds dieselfde waarde as ’n **option** interpreteer + +Dit maak enige Git-hosting feature wat gestoorde branch names hergebruik, ’n potensiële RCE primitive. + +## Misbruik van `git rebase --exec` vir RCE + +`git rebase` ondersteun `--exec=`, wat die command deur `sh -c` laat loop nadat commits herhaal is. Daarom, as die base branch van ’n pull request na ’n aanroep soortgelyk aan: +```bash +git rebase --quiet +``` +en `` is aanvaller-beheerd, ’n tak soos: +```bash +--exec=touch${IFS}/tmp/rce_proof +``` +kan geïnterpreteer word as 'n **Git vlag** in plaas van 'n taknaam. + +### Hoekom `${IFS}` saak maak + +Git refs kan nie letterlike spasies bevat nie, maar shell-uitbreiding gebeur steeds wanneer Git `--exec` via `sh -c` uitvoer. `${IFS}` brei uit na witspasie by runtime, wat payloads soos die volgende moontlik maak: +```bash +--exec=touch${IFS}/tmp/rce_proof +--exec=id${IFS}>/tmp/out +``` +Vir payloads wat Git-verbode karakters vereis (`:`, `~`, `^`, `?`, `*`, `[`, `\\`, `//`), enkodeer die werklike command en dekodeer dit by uitvoeringstyd: +```bash +--exec=echo${IFS}|base64${IFS}-d|sh +``` +## Windows-spesifieke payload delivery + +Op Windows is inline payloads meer beperk omdat Git branch refs as files stoor en NTFS karakters soos `|` in lêername verbied. ’n Praktiese alternatief is: + +1. Commit ’n payload script in die repository in (byvoorbeeld `.abcdef`) +2. Skep ’n branch soos: +```bash +--exec=sh${IFS}.abcdef +``` +As Git for Windows die payload deur **MSYS2 `sh`** laat begin, kan PowerShell-metakarakters vermink word. ’n Praktiese workaround is om die committed script te laat oproep: +```bash +cmd.exe //c .abcdef.bat +``` +waar `//c` die MSYS2-veilige vorm van Windows `/c` is. + +## Merge / PR state-machine abuse + +Wanneer jy Git-hosting platforms toets, hersien nie net die finale gevaarlike command nie. Hersien ook **vroeëre validasie-paaie** en **agtergrond-herkontroles**. + +’n Nuttige exploitation-patroon is: + +1. Aanvanklike validasie-pad gebruik ’n **veilige** clone/fetch flow met `--end-of-options`, so die kwaadwillige branch word as data aanvaar +2. Die pull request word **mergeable** +3. ’n Latere merge- of checkout-pad hergebruik die gestoorde branch name in ’n **onveilige** Git call +4. Code execution gebeur selfs as ’n latere stap faal en die UI **HTTP 500** terugstuur + +Dit beteken ’n feature kan exploitable wees selfs wanneer die finale merge in ’n error eindig, en die target repository kan in ’n **corrupted partial rebase state** gelaat word nadat die payload reeds geloop het. + +## Praktiese hunting-idees + +Wanneer jy ’n Gogs instance of soortgelyke Git service hersien, kyk vir: + +- Branch names wat met `--` begin +- Merge failures wat `git checkout '--exec=...'` behels +- Pull requests wat vas sit as mergeable al faal latere branch validation +- Repositories wat in partial rebase / broken Git state agtergelaat is ná mislukte merges +- Onverwagte committed helper files op Windows payload paths (byvoorbeeld dotfiles plus `.bat` launchers) +- Verdagte API tokens wat kort voor mislukte PR merges geskep is + +Voorbeeld log artifact: +```text +merge: git checkout '--exec=<...>': exit status 128 - error: unknown option `exec=<...>' +``` +## Verwysings + +- [Rapid7 - Authenticated RCE via Argument Injection in Gogs (NOT FIXED)](https://www.rapid7.com/blog/post/ve-authenticated-rce-via-argument-injection-gogs-unfixed) +- [Metasploit module PR for Gogs rebase argument injection](https://github.com/rapid7/metasploit-framework/pull/21515) +- [Git rebase documentation (`--exec`)](https://git-scm.com/docs/git-rebase) + +{{#include ../../banners/hacktricks-training.md}}