# 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//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//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:
> [!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}}