mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
98 lines
6.5 KiB
Markdown
98 lines
6.5 KiB
Markdown
# 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}}
|