# Sonsuz Bekleme Yoluyla LFI2RCE
Sıfırdan kahraman olmaya kadar AWS hackleme öğreninhtARTE (HackTricks AWS Kırmızı Takım Uzmanı)!
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na (https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın veya** bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.**
## Temel Bilgiler
Bir dosya PHP'ye yüklendiğinde (beklemese bile), **`php[a-zA-Z0-9]{6}`** gibi bir isme sahip geçici bir dosya oluşturur `/tmp` içinde, ancak bazı docker görüntülerinde oluşturulan dosyaların rakamlar içermediğini gördüm.
Yerel dosya dahilinde, **yüklü dosyayı dahil etmeyi başarırsanız RCE alırsınız**.
Varsayılan olarak **PHP yalnızca tek bir istekte 20 dosya yüklemeye izin verir** (ayarlanır `/etc/php//apache2/php.ini`):
```
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
```
### Diğer teknikler
Diğer teknikler, PHP protokollerine saldırarak (yolun sadece son kısmını kontrol ediyorsanız başarılı olamazsınız), dosyanın yolunu ifşa ederek, beklenen dosyaları kötüye kullanarak veya **PHP'yi bir segmentasyon hatası yaşatıp yüklenen geçici dosyaların silinmemesini sağlayarak** çalışır. Bu teknik, **bir sıfır gün bulmaya gerek olmadan** son teknikle çok benzerdir.
### Sonsuz bekleme tekniği
Bu teknikte **yalnızca göreceli bir yol kontrol etmemiz gerekir**. Eğer dosyaları yüklemeyi başarabilir ve **LFI'nin hiç bitmemesini sağlarsak**, "yeterince zamanımız" olacak ve yüklenen dosyalardan **herhangi birini** **kaba kuvvet uygulayarak bulabileceğiz**.
**Bu tekniğin avantajları**:
- Bir include içinde bir göreceli yol kontrol etmeniz yeterlidir
- Nginx veya log dosyalarına beklenmedik düzeyde erişim gerektirmez
- Bir segmentasyon hatası oluşturmak için bir sıfır gün gerektirmez
- Bir yol ifşası gerektirmez
Bu tekniğin **ana sorunları** şunlardır:
- Belirli bir dosyanın mevcut olması gerekmektedir (daha fazla olabilir)
- **Potansiyel dosya adları için inanılmaz** bir miktar: **56800235584**
- Sunucu **rakamlar kullanmıyorsa** toplam potansiyel miktar: **19770609664**
- Varsayılan olarak **yalnızca bir istekte 20 dosya** yüklenebilir.
- Kullanılan sunucunun **maksimum eşzamanlı işçi sayısı**.
- Bu sınırlama ile birlikte bu saldırının çok uzun sürmesine neden olabilir
- **Bir PHP isteği için zaman aşımı**. İdeal olarak bu sonsuz olmalı veya PHP işlemini silmeden geçici yüklenen dosyaları silmelidir, aksi takdirde bu da bir sorun olacaktır
Peki, bir PHP include'ı **asla bitmeyecek şekilde nasıl yapabilirsiniz**? Sadece **`/sys/kernel/security/apparmor/revision`** dosyasını dahil ederek. (**Ne yazık ki Docker konteynerlerinde mevcut değil...**).
Denemek için sadece şunu çağırın:
```bash
php -a # open php cli
include("/sys/kernel/security/apparmor/revision");
```
## Apache2
Apache, varsayılan olarak **150 eşzamanlı bağlantıyı** destekler, [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) adresinde belirtildiği gibi bu sayıyı 8000'e kadar yükseltmek mümkündür. Bu modülle PHP kullanmak için şu adımları izleyin: [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 işlemi sonsuza kadar sürebilir**.
Şimdi biraz matematik yapalım:
* **149 bağlantı** kullanarak **149 \* 20 = 2980 geçici dosya** oluşturabiliriz.
* Ardından, **son bağlantıyı** potansiyel dosyaları **brute-force** etmek için kullanın.
* **10 istek/s** hızında zamanlar şunlardır:
* 56800235584 / 2980 / 10 / 3600 \~= **530 saat** (265 saatte %50 olasılık)
* (ondalıksız) 19770609664 / 2980 / 10 / 3600 \~= 185 saat (93 saatte %50 olasılık)
{% hint style="warning" %}
Önceki örnekte **başka istemcileri tamamen DoS** ediyoruz!
{% endhint %}
Eğer Apache sunucusu geliştirilirse ve **4000 bağlantıyı** (maksimum sayının yarısı) kullanabilirsek, `3999*20 = 79980` **dosya** oluşturabilir ve **sayı** yaklaşık olarak **19.7 saat** veya **6.9 saat** (10 saat, 3.5 saat %50 olasılık) olur.
## PHP-FMP
Eğer web sayfası PHP betiklerini çalıştırmak için varsayılan php modunu değil de **PHP-FMP**'yi kullanıyorsa (bu web sayfasının verimliliğini artırır, bu yüzden sıkça karşılaşılır), tekniği geliştirmek için başka bir şey yapılabilir.
PHP-FMP, **`/etc/php//fpm/pool.d/www.conf`** içinde **`request_terminate_timeout`** parametresini **ayarlamaya izin verir**.\
Bu parametre, **PHP'ye yapılan isteğin** **ne zaman sonlanması gerektiğini** belirtir (varsayılan olarak sonsuzdur, ancak **parametre yorumlanırsa 30 saniyedir**). Bir istek PHP tarafından işlenirken belirtilen saniye sayısına ulaştığında, **sonlandırılır**. Bu, isteğin geçici dosyalar yüklediği durumda, çünkü **php işlemi durdurulduğunda**, bu **dosyaların silinmeyeceği** anlamına gelir. Dolayısıyla, bir isteği o süre boyunca sürdürebilirseniz, 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'yi önlemek** için bir saldırganın aynı anda yalnızca **100 bağlantıyı** kullanacağını ve php-fmp tarafından belirlenen maksimum işlem süresinin (`request_terminate_timeout`**)** **30 saniye** olduğunu varsayalım. Dolayısıyla, saniyede oluşturulabilecek **geçici dosya sayısı** `100*20/30 = 66.67` olacaktır.
Sonra, **10000 dosya** oluşturmak için bir saldırganın ihtiyacı olan süre: **`10000/66.67 = 150 saniye`** (100000 dosya oluşturmak için gereken süre ise **25 dakika** olacaktır).
Ardından, saldırgan bu **100 bağlantıyı** kullanarak bir **arama brute-force** gerçekleştirebilir. **300 istek/s** hızında çalıştığını varsayarsak, bu saldırıyı gerçekleştirmek için gereken süre şöyledir:
* 56800235584 / 10000 / 300 / 3600 \~= **5.25 saat** (2.63 saatte %50 olasılık)
* (100000 dosya ile) 56800235584 / 100000 / 300 / 3600 \~= **0.525 saat** (0.263 saatte %50 olasılık)
Evet, bir EC2 orta boyutlu örneğinde 100000 geçici dosya oluşturmak mümkündür:
{% hint style="warning" %}
Zaman aşımını tetiklemek için **savunmasız LFI sayfasını içermek yeterlidir**, böylece sonsuz bir dahil döngüye girer.
{% endhint %}
## Nginx
Varsayılan olarak Nginx'in aynı anda **512 paralel bağlantıyı** desteklediği görünüyor (bu sayı artırılabilir).