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 el
This commit is contained in:
@@ -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}}
|
||||
Reference in New Issue
Block a user