hacktricks/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md

98 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LFI2RCE via Eternal waiting
{{#include ../../banners/hacktricks-training.md}}
## Temel Bilgiler
Varsayılan olarak, bir dosya PHP'ye yüklendiğinde (beklemese bile), `/tmp` dizininde **`php[a-zA-Z0-9]{6}`** gibi bir isimle geçici bir dosya oluşturur, ancak bazı docker imajlarında oluşturulan dosyaların rakam içermediğini gördüm.
Yerel dosya dahil etmede, **eğer o yüklenen dosyayı dahil etmeyi başarırsanız, RCE elde edersiniz**.
Varsayılan olarak, **PHP yalnızca tek bir istekte 20 dosya yüklemeye izin verir** (bu, `/etc/php/<version>/apache2/php.ini` dosyasında ayarlanmıştır):
```
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
```
Ayrıca, **potansiyel dosya adlarının sayısı 62\*62\*62\*62\*62\*62 = 56800235584**
### Diğer teknikler
Diğer teknikler, PHP protokollerine saldırmayı (yolun son kısmını kontrol ediyorsanız bunu yapamazsınız), dosyanın yolunu ifşa etmeyi, beklenen dosyaları kötüye kullanmayı veya **yüklenen geçici dosyaların silinmemesi için PHP'nin bir segmentasyon hatası yaşamasını sağlamayı** içerir.\
Bu teknik, **sıfır gün bulmaya gerek kalmadan** sonuncusuna **çok benzer**.
### Sonsuz bekleme tekniği
Bu teknikte **sadece bir göreli yolu kontrol etmemiz gerekiyor**. Dosyaları yüklemeyi başarabilir ve **LFI'nin asla bitmemesini** sağlayabilirsek, **yüklenen dosyaları brute-force** yapacak "yeterli zaman"ımız olacak ve **yüklenenlerden herhangi birini bulabileceğiz**.
**Bu tekniğin avantajları**:
- Sadece bir include içinde göreli bir yolu kontrol etmeniz gerekiyor
- Nginx veya log dosyalarına beklenmedik bir erişim seviyesi gerektirmiyor
- Segmentasyon hatası oluşturmak için bir 0 gün gerektirmiyor
- Yol ifşası gerektirmiyor
Bu tekniğin **ana sorunları** şunlardır:
- Belirli bir dosyanın (veya dosyaların) mevcut olmasını gerektirir (daha fazlası olabilir)
- **Çılgın** miktarda potansiyel dosya adı: **56800235584**
- Sunucu **rakam kullanmıyorsa** toplam potansiyel miktar: **19770609664**
- Varsayılan olarak **tek bir istekte yalnızca 20 dosya** yüklenebilir.
- Kullanılan sunucunun **maksimum paralel işçi sayısı**.
- Bu limitler, bu saldırının çok uzun sürmesine neden olabilir
- **PHP isteği için zaman aşımı**. İdeal olarak bu sonsuz olmalı veya geçici yüklenen dosyaları silmeden PHP sürecini öldürmelidir, aksi takdirde bu da bir sorun olacaktır
Peki, **PHP include'ını asla nasıl bitirebilirsiniz**? Sadece dosyayı **`/sys/kernel/security/apparmor/revision`** ekleyerek (**maalesef Docker konteynerlerinde mevcut değil...**).
Bunu sadece çağırarak deneyin:
```bash
php -a # open php cli
include("/sys/kernel/security/apparmor/revision");
```
## Apache2
Varsayılan olarak, Apache **150 eşzamanlı bağlantı** destekler, [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) adresine göre bu sayı **8000**'e kadar yükseltilebilir. Bu modül ile PHP kullanmak için şunu takip edin: [https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04).
Varsayılan olarak, (testlerimde gördüğüm kadarıyla), bir **PHP süreci sonsuza kadar sürebilir**.
Hesap yapalım:
- **149 bağlantı** kullanarak **149 \* 20 = 2980 geçici dosya** oluşturabiliriz.
- Sonra, **son bağlantıyı** potansiyel dosyaları **brute-force** için kullanın.
- **10 istek/s** hızında süreler:
- 56800235584 / 2980 / 10 / 3600 \~= **530 saat** (265 saatte %50 şans)
- (rakam olmadan) 19770609664 / 2980 / 10 / 3600 \~= 185saat (93 saatte %50 şans)
> [!WARNING]
> Önceki örnekte **diğer istemcileri tamamen DoS'ladığımızı** unutmayın!
Eğer Apache sunucusu geliştirilirse ve **4000 bağlantı** kötüye kullanılabilirse (maksimum sayıya yarı yol). `3999*20 = 79980` **dosya** oluşturabiliriz ve **sayı** yaklaşık **19.7saat** veya **6.9saat** (10saat, 3.5saat %50 şans) olarak **azalır**.
## PHP-FMP
Eğer PHP betiklerini çalıştırmak için Apache için normal php modunu kullanmak yerine **web sayfası** **PHP-FMP** kullanıyorsa (bu, web sayfasının verimliliğini artırır, bu yüzden sıkça bulunur), tekniği geliştirmek için başka bir şey yapılabilir.
PHP-FMP, **`/etc/php/<php-version>/fpm/pool.d/www.conf`** dosyasında **`request_terminate_timeout`** **parametresini** **ayarlar**.\
Bu parametre, **PHP'ye yapılan isteğin ne zaman sona ermesi gerektiğini** belirten maksimum saniye sayısını gösterir (varsayılan olarak sonsuz, ancak **parametre yorum satırından çıkarıldığında 30s**). PHP tarafından işlenen bir istek belirtilen saniye sayısında **öldürülür**. Bu, eğer istek geçici dosyalar yüklüyorsa, **php işlemesi durdurulduğu için**, bu **dosyaların silinmeyeceği** anlamına gelir. Bu nedenle, bir isteğin o süre boyunca sürmesini sağlarsanız, **silinmeyecek binlerce geçici dosya** oluşturabilirsiniz, bu da **onları bulma sürecini hızlandırır** ve tüm bağlantıları tüketerek platforma DoS olasılığını azaltır.
Bu nedenle, **DoS'tan kaçınmak için** bir **saldırganın aynı anda yalnızca 100 bağlantı** kullanacağını varsayalım ve php max işleme süresi **php-fmp** (`request_terminate_timeout`**) **30s**. Bu nedenle, **saniyede** oluşturulabilecek **geçici dosya** sayısı `100*20/30 = 66.67`'dir.
Sonra, **10000 dosya** oluşturmak için bir saldırganın ihtiyacı olacak: **`10000/66.67 = 150s`** ( **100000 dosya** oluşturmak için süre **25dakika** olacaktır).
Sonra, saldırgan bu **100 bağlantıyı** bir **arama brute-force** gerçekleştirmek için kullanabilir. 300 req/s hızında bu işlemi gerçekleştirmek için gereken süre aşağıdaki gibidir:
- 56800235584 / 10000 / 300 / 3600 \~= **5.25 saat** (2.63 saatte %50 şans)
- (100000 dosya ile) 56800235584 / 100000 / 300 / 3600 \~= **0.525 saat** (0.263 saatte %50 şans)
Evet, bir EC2 orta boyutlu örnekte 100000 geçici dosya oluşturmak mümkündür:
<figure><img src="../../images/image (240).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> Zaman aşımını tetiklemek için **savunmasız LFI sayfasını dahil etmek yeterli olacaktır**, böylece sonsuz bir dahil etme döngüsüne girer.
## Nginx
Görünüşe göre varsayılan olarak Nginx **512 paralel bağlantı** desteklemektedir (ve bu sayı artırılabilir).
{{#include ../../banners/hacktricks-training.md}}