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

This commit is contained in:
Translator
2026-06-05 13:57:17 +00:00
parent 493e795f56
commit c9039279ec
@@ -0,0 +1,103 @@
# Gogs Security
{{#include ../../banners/hacktricks-training.md}}
## Τι είναι το Gogs
Το **Gogs** είναι μια **self-hosted lightweight Git service** γραμμένη σε Go. Από την οπτική του attacker, αντιμετώπισέ το ως μια **multi-tenant Git hosting platform** όπου ένας low-privileged user μπορεί ακόμα να ελέγχει branch names, pull requests, webhooks, tokens, και repository settings.
## Git option injection μέσω refs / branch names
Αν ένα application περνάει ένα attacker-controlled **ref name** απευθείας σε μια Git command **χωρίς `--` ή `--end-of-options`**, ένα branch που αρχίζει με `--` μπορεί να γίνει parse ως **Git option** αντί για data.
Typical dangerous pattern:
```bash
git <subcommand> <user-controlled-ref>
```
Αναμενόμενο ασφαλέστερο μοτίβο σε αμυντικό code:
```bash
git <subcommand> -- <user-controlled-ref>
# or
git <subcommand> --end-of-options <user-controlled-ref>
```
Μια συνηθισμένη λανθασμένη υπόθεση είναι ότι η επικύρωση του ref με `git rev-parse --verify <ref>` είναι αρκετή. Δεν είναι:
- ο attacker μπορεί πρώτα να **δημιουργήσει ένα πραγματικό branch** του οποίου το όνομα αρχίζει με `--`
- το `rev-parse --verify` ελέγχει μόνο ότι το ref επιλύεται σε ένα object
- μια μεταγενέστερη μη ασφαλής Git invocation μπορεί να ερμηνεύσει την ίδια τιμή ως **option**
Αυτό μετατρέπει οποιοδήποτε Git-hosting feature που επαναχρησιμοποιεί αποθηκευμένα branch names σε ένα πιθανό RCE primitive.
## Abusing `git rebase --exec` for RCE
Το `git rebase` υποστηρίζει `--exec=<cmd>`, το οποίο εκτελεί το command μέσω `sh -c` μετά την αναπαραγωγή commits. Επομένως, αν το base branch ενός pull request καταλήγει σε μια κλήση παρόμοια με:
```bash
git rebase --quiet <baseBranch> <headBranch>
```
και το `<baseBranch>` ελέγχεται από τον attacker, ένα branch όπως:
```bash
--exec=touch${IFS}/tmp/rce_proof
```
μπορεί να ερμηνευτεί ως **Git flag** αντί για όνομα branch.
### Γιατί έχει σημασία το `${IFS}`
Τα Git refs δεν μπορούν να περιέχουν κυριολεκτικά spaces, αλλά το shell expansion εξακολουθεί να συμβαίνει όταν το Git εκτελεί το `--exec` μέσω `sh -c`. Το `${IFS}` επεκτείνεται σε whitespace κατά το runtime, επιτρέποντας payloads όπως:
```bash
--exec=touch${IFS}/tmp/rce_proof
--exec=id${IFS}>/tmp/out
```
Για payloads που απαιτούν Git-forbidden characters (`:`, `~`, `^`, `?`, `*`, `[`, `\\`, `//`), encode το πραγματικό command και decode το στο execution time:
```bash
--exec=echo${IFS}<base64_payload>|base64${IFS}-d|sh
```
## Παράδοση payload ειδική για Windows
Στα Windows, τα inline payloads είναι πιο περιορισμένα επειδή το Git αποθηκεύει τα branch refs ως αρχεία και το NTFS απαγορεύει χαρακτήρες όπως `|` στα ονόματα αρχείων. Μια πρακτική εναλλακτική είναι:
1. Κάνε commit ένα payload script στο repository (για παράδειγμα `.abcdef`)
2. Δημιούργησε ένα branch όπως:
```bash
--exec=sh${IFS}.abcdef
```
Εάν το Git for Windows εκκινεί το payload μέσω του **MSYS2 `sh`**, τα PowerShell metacharacters μπορεί να παραμορφωθούν. Μια πρακτική παράκαμψη είναι να αφήσετε το committed script να καλέσει:
```bash
cmd.exe //c .abcdef.bat
```
όπου `//c` είναι η MSYS2-safe μορφή του Windows `/c`.
## Κατάχρηση του state-machine Merge / PR
Όταν κάνετε testing Git-hosting platforms, μην ελέγχετε μόνο την τελική επικίνδυνη εντολή. Ελέγξτε επίσης τις **προηγούμενες validation paths** και τα **background rechecks**.
Ένα χρήσιμο exploitation pattern είναι:
1. Η αρχική validation path χρησιμοποιεί ένα **safe** clone/fetch flow με `--end-of-options`, ώστε το malicious branch να γίνει αποδεκτό ως data
2. Το pull request γίνεται **mergeable**
3. Ένα μεταγενέστερο merge ή checkout path επαναχρησιμοποιεί το αποθηκευμένο branch name σε ένα **unsafe** Git call
4. Γίνεται code execution ακόμα κι αν ένα μεταγενέστερο βήμα αποτύχει και το UI επιστρέψει **HTTP 500**
Αυτό σημαίνει ότι ένα feature μπορεί να είναι exploitable ακόμα και όταν το τελικό merge καταλήγει σε error, και το target repository μπορεί να μείνει σε μια **corrupted partial rebase state** αφού το payload έχει ήδη εκτελεστεί.
## Πρακτικές ιδέες hunting
Όταν ελέγχετε ένα Gogs instance ή παρόμοια Git service, αναζητήστε:
- Branch names που ξεκινούν με `--`
- Merge failures που περιλαμβάνουν `git checkout '--exec=...'`
- Pull requests που μένουν mergeable παρόλο που αργότερα αποτυγχάνει το branch validation
- Repositories που μένουν σε partial rebase / broken Git state μετά από failed merges
- Απροσδόκητα committed helper files σε Windows payload paths (για παράδειγμα dotfiles μαζί με `.bat` launchers)
- Suspicious API tokens που δημιουργήθηκαν λίγο πριν από failed PR merges
Παράδειγμα log artifact:
```text
merge: git checkout '--exec=<...>': exit status 128 - error: unknown option `exec=<...>'
```
## Αναφορές
- [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}}