mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-06-12 19:11:44 -07:00
Translated ['src/pentesting-ci-cd/gogs-security/README.md'] to af
This commit is contained in:
@@ -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}}
|
||||
Reference in New Issue
Block a user