mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 21:53:54 +00:00
Translated ['pentesting-web/race-condition.md'] to tr
This commit is contained in:
parent
81ed0feb7c
commit
b557e23933
1 changed files with 25 additions and 24 deletions
|
@ -29,14 +29,14 @@ Bu tekniği derinlemesine anlamak için orijinal raporu [https://portswigger.net
|
|||
|
||||
## Race Condition Saldırılarını Geliştirme
|
||||
|
||||
Race condition'ları avantaja çevirmenin ana engeli, birden fazla isteğin **işleme sürelerinde çok az farkla—ideali, 1ms'den az**—aynı anda işlenmesini sağlamaktır.
|
||||
Race condition'ları avantaja çevirmenin ana engeli, birden fazla isteğin **işleme sürelerinde çok az farkla—idealde, 1ms'den az**—aynı anda işlenmesini sağlamaktır.
|
||||
|
||||
İstekleri Senkronize Etmek için bazı teknikler burada bulunmaktadır:
|
||||
|
||||
#### HTTP/2 Tek-Paket Saldırısı vs. HTTP/1.1 Son-Bayt Senkronizasyonu
|
||||
|
||||
* **HTTP/2**: Tek bir TCP bağlantısı üzerinden iki isteğin gönderilmesini destekler, ağ jitter etkisini azaltır. Ancak, sunucu tarafındaki varyasyonlar nedeniyle, iki istek tutarlı bir race condition istismarına yeterli olmayabilir.
|
||||
* **HTTP/1.1 'Son-Bayt Senkronizasyonu'**: 20-30 isteğin çoğu kısmının önceden gönderilmesini sağlar, küçük bir parçayı saklayarak, bu parçanın birlikte gönderilmesini sağlayarak sunucuya eşzamanlı varış elde eder.
|
||||
* **HTTP/1.1 'Son-Bayt Senkronizasyonu'**: 20-30 isteğin çoğu kısmının önceden gönderilmesini sağlar, küçük bir parçayı saklayarak, bu parça daha sonra birlikte gönderilir ve sunucuya eşzamanlı varış sağlanır.
|
||||
|
||||
**Son-Bayt Senkronizasyonu için Hazırlık** şunları içerir:
|
||||
|
||||
|
@ -49,19 +49,19 @@ Saklanan çerçevelerin sonraki gönderimi, Wireshark ile doğrulanabilir şekil
|
|||
|
||||
### Sunucu Mimarisine Uyum Sağlama
|
||||
|
||||
Hedefin mimarisini anlamak çok önemlidir. Ön uç sunucular, istekleri farklı yönlendirebilir, bu da zamanlamayı etkileyebilir. Önleyici sunucu tarafı bağlantı ısıtma, önemsiz istekler aracılığıyla istek zamanlamasını normalleştirebilir.
|
||||
Hedefin mimarisini anlamak çok önemlidir. Ön uç sunucular, istekleri farklı yönlendirebilir ve zamanlamayı etkileyebilir. Önleyici sunucu tarafı bağlantı ısıtma, önemsiz istekler aracılığıyla istek zamanlamasını normalleştirebilir.
|
||||
|
||||
#### Oturum Tabanlı Kilitlemeyi Yönetme
|
||||
|
||||
PHP'nin oturum yöneticisi gibi çerçeveler, istekleri oturum bazında serileştirir, bu da zafiyetleri gizleyebilir. Her istek için farklı oturum jetonları kullanmak bu sorunu aşabilir.
|
||||
PHP'nin oturum yöneticisi gibi çerçeveler, istekleri oturum bazında serileştirir ve potansiyel olarak zafiyetleri gizleyebilir. Her istek için farklı oturum jetonları kullanmak bu sorunu aşabilir.
|
||||
|
||||
#### Hız veya Kaynak Sınırlamalarını Aşma
|
||||
|
||||
Bağlantı ısıtma etkili değilse, web sunucularının hız veya kaynak sınırlama gecikmelerini kasıtlı olarak bir dizi sahte istekle tetiklemek, sunucu tarafında race condition'lara uygun bir gecikme oluşturarak tek paket saldırısını kolaylaştırabilir.
|
||||
Bağlantı ısıtma etkili değilse, web sunucularının hız veya kaynak limit gecikmelerini kasıtlı olarak bir dizi sahte istekle tetiklemek, sunucu tarafında race condition'lara uygun bir gecikme oluşturarak tek paket saldırısını kolaylaştırabilir.
|
||||
|
||||
## Saldırı Örnekleri
|
||||
|
||||
* **Tubo Intruder - HTTP2 tek-paket saldırısı (1 uç nokta)**: İsteği **Turbo intruder**'a (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`) gönderebilirsiniz, istekte **`%s`** için brute force yapmak istediğiniz değeri değiştirebilirsiniz, örneğin `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` ve ardından açılır menüden **`examples/race-single-packer-attack.py`**'i seçin:
|
||||
* **Tubo Intruder - HTTP2 tek-paket saldırısı (1 uç nokta)**: İsteği **Turbo intruder**'a (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`) gönderebilirsiniz, istekte **`%s`** için brute force yapmak istediğiniz değeri değiştirebilirsiniz, örneğin `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` ve ardından açılır menüden **`examples/race-single-packer-attack.py`**'yi seçin:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (57).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -75,7 +75,7 @@ engine.queue(target.req, password, gate='race1')
|
|||
Eğer web HTTP2'yi desteklemiyorsa (sadece HTTP1.1) `Engine.BURP2` yerine `Engine.THREADED` veya `Engine.BURP` kullanın.
|
||||
{% endhint %}
|
||||
|
||||
* **Tubo Intruder - HTTP2 tek paketli saldırı (Birçok uç nokta)**: RCE'yi tetiklemek için 1 uç noktaya bir istek göndermeniz ve ardından diğer uç noktalara birden fazla istek göndermeniz gerektiğinde, `race-single-packet-attack.py` scriptini şu şekilde değiştirebilirsiniz:
|
||||
* **Tubo Intruder - HTTP2 tek paketli saldırı (Birçok uç nokta)**: Eğer 1 uç noktaya bir istek göndermeniz ve ardından RCE'yi tetiklemek için diğer uç noktalara birden fazla istek göndermeniz gerekiyorsa, `race-single-packet-attack.py` scriptini şu şekilde değiştirebilirsiniz:
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
|
@ -114,8 +114,8 @@ engine.openGate(currentAttempt)
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* **Otomatik python scripti**: Bu scriptin amacı, bir kullanıcının e-posta adresini değiştirirken sürekli olarak doğrulamak ve yeni e-posta adresinin doğrulama tokeni son e-posta adresine ulaşana kadar devam etmektir (bu, kodda bir e-posta adresinin değiştirilip doğrulamanın eski adrese gönderilebildiği bir RC görüldüğü içindir çünkü e-posta adresini gösteren değişken zaten ilk e-posta ile doldurulmuştu).\
|
||||
"objetivo" kelimesi alınan e-postalarda bulunduğunda, değiştirilmiş e-posta adresinin doğrulama tokenini aldığımızı biliyoruz ve saldırıyı sonlandırıyoruz.
|
||||
* **Otomatik python scripti**: Bu scriptin amacı, bir kullanıcının e-posta adresini değiştirirken sürekli olarak doğrulamak ve yeni e-posta adresinin doğrulama token'ı son e-posta adresine ulaşana kadar bunu yapmaktır (bu, kodda bir e-posta adresinin değiştirilip doğrulamanın eski adrese gönderilebildiği bir RC görüldüğü içindir çünkü e-posta adresini gösteren değişken zaten ilk e-posta ile doldurulmuştu).\
|
||||
"objetivo" kelimesi alınan e-postalarda bulunduğunda, değiştirilmiş e-posta adresinin doğrulama token'ını aldığımızı biliyoruz ve saldırıyı sonlandırıyoruz.
|
||||
```python
|
||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||
# Script from victor to solve a HTB challenge
|
||||
|
@ -242,7 +242,7 @@ response = requests.get(url, verify=False)
|
|||
```
|
||||
### Tek Paket Saldırısını Geliştirme
|
||||
|
||||
Orijinal araştırmada, bu saldırının 1.500 baytlık bir sınırı olduğu açıklanmıştır. Ancak, [**bu yazıda**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) tek paket saldırısının 1.500 baytlık sınırlamasını **IP katmanı parçalama** (tek bir paketi birden fazla IP paketine bölme) kullanarak **TCP'nin 65.535 B pencere sınırlamasına** nasıl genişletilebileceği açıklanmıştır ve bunların farklı bir sırayla gönderilmesi, tüm parçalar sunucuya ulaşana kadar paketin yeniden birleştirilmesini engellemiştir. Bu teknik, araştırmacının yaklaşık 166 ms içinde 10.000 istek göndermesine olanak tanımıştır. 
|
||||
Orijinal araştırmada bu saldırının 1,500 baytlık bir sınırı olduğu açıklanmıştır. Ancak, [**bu yazıda**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) tek paket saldırısının 1,500 baytlık sınırlamasını **IP katmanı parçalama** (tek bir paketi birden fazla IP paketine bölme) kullanarak **TCP'nin 65,535 B pencere sınırlamasına** nasıl genişletilebileceği açıklanmıştır ve bunların farklı bir sırayla gönderilmesi, tüm parçalar sunucuya ulaşana kadar paketin yeniden birleştirilmesini engellemiştir. Bu teknik, araştırmacının yaklaşık 166ms içinde 10,000 istek göndermesine olanak tanımıştır. 
|
||||
|
||||
Bu iyileştirmenin, aynı anda yüzlerce/binlerce paketin ulaşmasını gerektiren RC'de saldırıyı daha güvenilir hale getirdiğini unutmayın, ancak bazı yazılım sınırlamaları da olabilir. Apache, Nginx ve Go gibi bazı popüler HTTP sunucuları, `SETTINGS_MAX_CONCURRENT_STREAMS` ayarını sırasıyla 100, 128 ve 250 olarak belirlemiştir. Ancak, NodeJS ve nghttp2 gibi diğerleri sınırsızdır.\
|
||||
Bu, temelde Apache'nin tek bir TCP bağlantısından yalnızca 100 HTTP bağlantısını dikkate alacağı anlamına gelir (bu RC saldırısını sınırlayarak).
|
||||
|
@ -312,31 +312,31 @@ Bu tür saldırının birçok varyasyonu vardır, bunlar arasında:
|
|||
|
||||
* Bir hediye kartını birden fazla kez kullanma
|
||||
* Bir ürünü birden fazla kez değerlendirme
|
||||
* Hesap bakiyenizin üzerinde nakit çekme veya transfer etme
|
||||
* Hesap bakiyenizden fazla nakit çekme veya transfer etme
|
||||
* Tek bir CAPTCHA çözümünü yeniden kullanma
|
||||
* Bir anti-brute-force hız limitini aşma
|
||||
|
||||
### **Gizli alt durumlar**
|
||||
|
||||
Karmaşık yarış durumlarını istismar etmek genellikle gizli veya **istenmeyen makine alt durumlarıyla** etkileşimde bulunmak için kısa fırsatları değerlendirmeyi içerir. Bunu nasıl ele alacağınız:
|
||||
Karmaşık yarış durumlarını istismar etmek genellikle gizli veya **istenmeyen makine alt durumlarıyla** etkileşimde bulunmak için kısa fırsatları değerlendirmeyi içerir. İşte buna yaklaşmanın yolu:
|
||||
|
||||
1. **Potansiyel Gizli Alt Durumları Belirleyin**
|
||||
* Kullanıcı profilleri veya şifre sıfırlama süreçleri gibi kritik verileri değiştiren veya bunlarla etkileşime giren uç noktaları belirleyerek başlayın. Şunlara odaklanın:
|
||||
* Kullanıcı profilleri veya şifre sıfırlama süreçleri gibi kritik verileri değiştiren veya bunlarla etkileşime giren uç noktaları belirleyerek başlayın. Şuna odaklanın:
|
||||
* **Depolama**: Sunucu tarafında kalıcı verileri manipüle eden uç noktaları, istemci tarafında veri işleyenlerden daha fazla tercih edin.
|
||||
* **Eylem**: Mevcut verileri değiştiren işlemleri arayın; bunlar yeni veri ekleyenlere göre istismar edilebilir koşullar yaratma olasılığı daha yüksektir.
|
||||
* **Anahtar**: Başarılı saldırılar genellikle aynı tanımlayıcıya dayanan işlemleri içerir, örneğin, kullanıcı adı veya sıfırlama belirteci.
|
||||
2. **İlk Keşif Yapın**
|
||||
* Belirlenen uç noktaları yarış durumu saldırılarıyla test edin, beklenen sonuçlardan herhangi bir sapma olup olmadığını gözlemleyin. Beklenmedik yanıtlar veya uygulama davranışındaki değişiklikler bir zayıflığı işaret edebilir.
|
||||
2. **İlk Kez Test Yapın**
|
||||
* Belirlenen uç noktaları yarış durumu saldırılarıyla test edin, beklenen sonuçlardan herhangi bir sapma olup olmadığını gözlemleyin. Beklenmedik yanıtlar veya uygulama davranışındaki değişiklikler bir zayıflığın sinyalini verebilir.
|
||||
3. **Zayıflığı Gösterin**
|
||||
* Zayıflığı istismar etmek için gereken en az istek sayısını daraltın, genellikle sadece iki. Bu adım, dahil olan hassas zamanlama nedeniyle birden fazla deneme veya otomasyon gerektirebilir.
|
||||
* Zayıflığı istismar etmek için gereken en az istek sayısını daraltın, genellikle sadece iki. Bu adım, hassas zamanlama gerektirdiğinden birden fazla deneme veya otomasyon gerektirebilir.
|
||||
|
||||
### Zaman Hassas Saldırılar
|
||||
|
||||
İsteklerin zamanlamasındaki hassasiyet, özellikle güvenlik belirteçleri için zaman damgaları gibi öngörülebilir yöntemler kullanıldığında zayıflıkları ortaya çıkarabilir. Örneğin, zaman damgalarına dayalı şifre sıfırlama belirteçleri oluşturmak, eşzamanlı istekler için aynı belirteçlerin oluşmasına neden olabilir.
|
||||
İsteklerin zamanlamasındaki hassasiyet, özellikle güvenlik belirteçleri için tahmin edilebilir yöntemler (örneğin, zaman damgaları) kullanıldığında zayıflıkları ortaya çıkarabilir. Örneğin, zaman damgalarına dayalı şifre sıfırlama belirteçleri oluşturmak, eşzamanlı istekler için aynı belirteçlerin oluşmasına neden olabilir.
|
||||
|
||||
**İstismar Etmek İçin:**
|
||||
|
||||
* Eşzamanlı şifre sıfırlama istekleri yapmak için tek bir paket saldırısı gibi hassas zamanlama kullanın. Aynı belirteçler bir zayıflığı gösterir.
|
||||
* Eşzamanlı şifre sıfırlama istekleri yapmak için tek bir paket saldırısı gibi hassas zamanlama kullanın. Aynı belirteçler bir zayıflığın göstergesidir.
|
||||
|
||||
**Örnek:**
|
||||
|
||||
|
@ -352,9 +352,9 @@ Bunu görmek için [**PortSwigger Lab**](https://portswigger.net/web-security/lo
|
|||
|
||||
### Diğer e-postaları onayla
|
||||
|
||||
Amaç, **bir e-posta adresini doğrulamak ve aynı anda farklı birine değiştirmek** ve platformun yeni değiştirilen e-postayı doğrulayıp doğrulamadığını bulmaktır.
|
||||
Amaç, **bir e-posta adresini doğrulamak ve aynı anda farklı birine değiştirmek**; böylece platformun yeni değiştirilen e-postayı doğrulayıp doğrulamadığını öğrenmektir.
|
||||
|
||||
### E-postayı 2 e-posta adresine Değiştir
|
||||
### E-postayı 2 e-posta adresine değiştir
|
||||
|
||||
[**Bu araştırmaya**](https://portswigger.net/research/smashing-the-state-machine) göre, Gitlab bu şekilde bir ele geçirmeye karşı savunmasızdı çünkü **bir e-posta için e-posta doğrulama belirtecini diğer e-postaya gönderebilir**.
|
||||
|
||||
|
@ -362,7 +362,7 @@ Amaç, **bir e-posta adresini doğrulamak ve aynı anda farklı birine değişti
|
|||
|
||||
### Gizli Veritabanı durumları / Onay Atlama
|
||||
|
||||
Eğer **2 farklı yazma** işlemi **veri eklemek** için kullanılıyorsa, veritabanına **yalnızca ilk verinin yazıldığı** küçük bir zaman dilimi vardır. Örneğin, bir kullanıcı oluştururken **kullanıcı adı** ve **şifre** yazılabilir ve ardından yeni oluşturulan hesabı onaylamak için **belirteç** yazılır. Bu, **bir hesabı onaylamak için belirtecin null olduğu** küçük bir zaman dilimi olduğu anlamına gelir.
|
||||
Eğer **2 farklı yazma** işlemi **veri eklemek** için kullanılıyorsa, veritabanına **yalnızca ilk verinin yazıldığı** küçük bir zaman dilimi vardır. Örneğin, bir kullanıcı oluştururken **kullanıcı adı** ve **şifre** yazılabilir ve ardından yeni oluşturulan hesabı onaylamak için **belirteç** yazılabilir. Bu, **bir hesabı onaylamak için belirtecin null olduğu** küçük bir zaman dilimi olduğu anlamına gelir.
|
||||
|
||||
Bu nedenle, **bir hesap kaydetmek ve hemen onaylamak için boş bir belirteçle** (`token=` veya `token[]=` veya başka bir varyasyon) birkaç istek göndermek, e-posta kontrolünüz olmayan bir hesabı **onaylamanıza** olanak tanıyabilir.
|
||||
|
||||
|
@ -370,7 +370,7 @@ Bu nedenle, **bir hesap kaydetmek ve hemen onaylamak için boş bir belirteçle*
|
|||
|
||||
### 2FA'yı Atlama
|
||||
|
||||
Aşağıdaki pseudo-kod, çok kısa bir süre içinde **2FA'nın uygulanmadığı** için yarış durumuna karşı savunmasızdır:
|
||||
Aşağıdaki pseudo-kod, çok kısa bir süre içinde **2FA'nın uygulanmadığı** için yarış durumuna karşı savunmasızdır; bu süre zarfında oturum oluşturulmaktadır:
|
||||
```python
|
||||
session['userid'] = user.userid
|
||||
if user.mfa_enabled:
|
||||
|
@ -385,11 +385,11 @@ Buraya kadar, sadece bir google/linkedin/github... ile giriş yapma durumu var;
|
|||
|
||||
#### `authorization_code`'da Yarış Durumu
|
||||
|
||||
**Sorun**, **kabul ettiğinizde** ve otomatik olarak kötü niyetli uygulamaya bir **`authorization_code`** gönderdiğinizde ortaya çıkar. Ardından, bu **uygulama, OAUth hizmet sağlayıcısındaki bir Yarış Durumunu kötüye kullanarak hesabınız için **`authorization_code`**'dan birden fazla AT/RT (_Authentication Token/Refresh Token_) üretir. Temelde, uygulamanın verilerinize erişim izni verdiğinizi kötüye kullanarak **birden fazla hesap oluşturur**. Sonrasında, eğer **uygulamanın verilerinize erişim iznini durdurursanız, bir çift AT/RT silinecek, ancak diğerleri geçerli kalacaktır.**
|
||||
**Sorun**, **izin verdiğinizde** ve otomatik olarak kötü niyetli uygulamaya bir **`authorization_code`** gönderdiğinizde ortaya çıkar. Ardından, bu **uygulama, OAUth hizmet sağlayıcısındaki bir Yarış Durumunu kötüye kullanarak hesabınız için **`authorization_code`**'dan birden fazla AT/RT (_Authentication Token/Refresh Token_) üretir. Temelde, uygulamanın verilerinize erişim izni verdiğinizi kötüye kullanarak **birden fazla hesap oluşturur**. Sonrasında, eğer **uygulamanın verilerinize erişim iznini durdurursanız, bir çift AT/RT silinecek, ancak diğerleri geçerli kalacaktır**.
|
||||
|
||||
#### `Refresh Token`'da Yarış Durumu
|
||||
|
||||
Bir **geçerli RT** elde ettiğinizde, **birden fazla AT/RT** üretmek için **kötüye kullanmayı** deneyebilirsiniz ve **kullanıcı kötü niyetli uygulamanın verilerine erişim izinlerini iptal etse bile**, **birden fazla RT hala geçerli olacaktır.**
|
||||
Bir **geçerli RT** elde ettiğinizde, **birden fazla AT/RT üretmek için bunu kötüye kullanmayı** deneyebilirsiniz ve **kullanıcı kötü niyetli uygulamanın verilerine erişim izinlerini iptal etse bile**, **birden fazla RT hala geçerli olacaktır.**
|
||||
|
||||
## **WebSockets'te RC**
|
||||
|
||||
|
@ -402,6 +402,7 @@ Bir **geçerli RT** elde ettiğinizde, **birden fazla AT/RT** üretmek için **k
|
|||
* [https://hackerone.com/reports/55140](https://hackerone.com/reports/55140)
|
||||
* [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||
* [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions)
|
||||
* [https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS Hacking'i öğrenin ve pratik yapın:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
|
|
Loading…
Reference in a new issue