LFI2RCE Sonsuz Bekleme ile
Reading time: 5 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Temel Bilgiler
Varsayılan olarak, bir dosya PHP'ye yüklendiğinde (beklemese bile), php[a-zA-Z0-9]{6}
gibi bir isimle /tmp
dizininde 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 ve yüklenenlerden herhangi birini bulmak için "yeterince zaman" elde edeceğiz.
Bu tekniğin avantajları:
- Sadece bir include içinde bir göreli yolu kontrol etmeniz gerekiyor
- Nginx veya log dosyalarına erişim için beklenmedik bir seviyeye ihtiyaç duymaz
- Segmentasyon hatası oluşturmak için bir 0 güne ihtiyaç duymaz
- Yol ifşası gerektirmez
Bu tekniğin ana sorunları şunlardır:
- Belirli bir dosya(lar)ı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 limit, önceki limitlerle birlikte 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
dahil ederek (maalesef Docker konteynerlerinde mevcut değil...).
Bunu sadece arayarak deneyin:
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/ bağlantısına 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.
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 yapmak 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'liyoruz!
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 Apache için PHP betiklerini çalıştırmak 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 ereceğini belirten maksimum saniye sayısını gösterir (varsayılan olarak sonsuzdur, ancak parametre yorumlanırsa 30s olur). PHP tarafından işlenen bir isteğin belirtilen saniye sayısı dolduğunda, öldürülür. Bu, eğer istek geçici dosyalar yüklüyorsa, php işlemesi durdurulduğu için, o 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 platforma tüm bağlantıları tüketerek bir 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'dir. 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 varsayarsak, bunu istismar etmek 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 örneğinde 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ı destekler (ve bu sayı artırılabilir).
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.