Disable Functions Bypass - dl Function

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) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

dl() PHP’nin çalışma zamanında bir shared extension yüklemesine izin verir. Eğer saldırgan kontrollü bir modül yükletebilirseniz, dahili olarak execve, system veya başka bir native primitive çağıran yeni bir PHP fonksiyonu kaydederek disable_functions’ı baypas edebilirsiniz.

Bu gerçek bir primitive’dir, ancak modern hedeflerde eski yazıların ima ettiğinden çok daha az yaygındır.

Bugün bu baypasın neden nadir olduğu

Ana engeller şunlardır:

  • dl() mevcut olmalı ve devre dışı bırakılmamış olmalı
  • enable_dl hala dinamik yüklemeye izin vermeli
  • Hedef SAPI dl()’yı desteklemeli
  • Payload, aynı hedef ABI için derlenmiş geçerli bir PHP extension olmalı
  • Extension, yapılandırılmış extension_dir’den erişilebilir olmalı

Resmi PHP manuali burada en önemli gerçeklik kontrolüdür: dl() yalnızca CLI ve embed SAPIs için, ve CGI SAPI için komut satırından çalıştırıldığında kullanılabilir. Bu, tekniğin genellikle normal PHP-FPM/mod_php web isteklerinde mevcut olmadığı anlamına gelir; bu yüzden payload oluşturmak için zaman harcamadan önce SAPI’yi kontrol edin.

Ayrıca enable_dl bir INI_SYSTEM ayarıdır ve PHP 8.3.0 itibarıyla PHP bunu kullanımdan kaldırılmış olarak belgelemiştir, bu yüzden genellikle saldırgan kontrollü PHP kodundan çalışma zamanında bunu değiştiremezsiniz.

Eğer dl() uygun değilse, daha geniş module/version dependent bypasses listesine geri dönün.

Bir foothold’tan hızlı ön değerlendirme

Herhangi bir şey inşa etmeden önce, modülün uyması gereken kesin parametreleri toplayın:

<?php
phpinfo();
echo "PHP_VERSION=" . PHP_VERSION . PHP_EOL;
echo "PHP_SAPI=" . php_sapi_name() . PHP_EOL;
echo "ZTS=" . (PHP_ZTS ? "yes" : "no") . PHP_EOL;
echo "INT_BITS=" . (PHP_INT_SIZE * 8) . PHP_EOL;
echo "enable_dl=" . ini_get("enable_dl") . PHP_EOL;
echo "extension_dir=" . ini_get("extension_dir") . PHP_EOL;
echo "disabled=" . ini_get("disable_functions") . PHP_EOL;
?>

What you care about:

  • PHP_SAPI: eğer bu fpm-fcgi veya apache2handler ise, dl() genellikle web exploitation için çıkmaz yoldur
  • extension_dir: payload buraya yüklenmelidir
  • PHP Version, architecture, debug/non-debug, and ZTS/non-ZTS: modülünüz bunlarla uyumlu olmalı
  • disable_functions: dl’ün yokluğunun gerçekten devre dışı bırakılmasından mı yoksa SAPI’nin onu desteklememesinden mi olduğunu doğrulayın

Practical exploitation constraints

1. You normally need write access to extension_dir

Bu en büyük darboğazdır.

dl() extension filename’ı alır ve PHP bunu extension_dir’den yükler. Pratikte bu, /var/www/html/uploads gibi normal bir arbitrary file upload’un yeterli olmadığı anlamına gelir. Hâlâ PHP’nin gerçekten extension’ları yüklediği yere .so/.dll koyabilecek bir yola ihtiyacınız var.

Realistic situations where this becomes exploitable:

  • CTFs veya extension_dir’in yazılabilir olduğu kasıtlı zayıf lablar
  • Shared-hosting veya konteyner yanlış yapılandırmaları — yazılabilir bir extension yolunu açığa çıkaran durumlar
  • Zaten extension_dir’e ulaşan ayrı bir arbitrary file write primitive
  • Post-exploitation senaryoları — zaten yeterince yükselmiş olup oraya dosya bırakabildiğiniz durumlar

2. The module must match the target build

Sadece PHP_VERSION ile eşleşmek yeterli değildir. Extension ayrıca şu kriterlerle uyumlu olmalıdır:

  • OS ve CPU architecture
  • libc/toolchain beklentileri
  • ZEND_MODULE_API_NO
  • debug vs non-debug build
  • ZTS vs NTS

Bunlar eşleşmezse, dl() başarısız olur veya process çökebilir.

3. open_basedir is not the main defense here

Modülü extension_dir’e koyup dl() çağırabildiğinizde, extension kodu PHP process içinde çalışır. Bu noktada asıl engel open_basedir değil; geçerli bir shared object’i extension yükleme yoluna bırakabilme yeteneğidir.

Building the malicious extension

Klasik yol hâlâ geçerlidir:

  1. Hedef build’i mümkün olduğunca yakından yeniden oluşturun
  2. Paylaşılan bir extension derlemek için phpize, ./configure ve make kullanın
  3. Native komut çalıştırmayı saran bypass_exec($cmd) gibi bir PHP fonksiyonu export edin
  4. Derlenmiş modülü extension_dir’e upload edin
  5. dl() ile yükleyin ve export ettiğiniz fonksiyonu çağırın

Saldırı eski olsa da hâlâ önemlidir çünkü PHP 8.x changelog’ları dl()-özel çökme düzeltmelerini içermeye devam ediyor. Primitive hâlâ mevcut; zor olan kısım, erişilebilir ve uyumlu bir modül bırakabileceğiniz bir dağıtım bulmaktır.

Minimal workflow

On the attacker box

mkdir bypass && cd bypass
phpize
./configure
make

Oluşan shared object genellikle modules/ altında olacaktır.

Hedeften farklı bir ortamda derleme yapıyorsanız, üretilen dosyayı ABI’nin hedefle eşleştiğini doğrulayana kadar taslak olarak kabul edin.

Uzantıyı yükleme ve kullanma

Hedef gerçekten dl()’yı destekliyorsa ve modül extension_dir içinde ise, çalışma zamanı tarafı basittir:

<?php
if (!extension_loaded('bypass')) {
dl('bypass.so'); // use the correct filename for the target platform
}
echo bypass_exec($_GET['cmd']);
?>

Windows’ta dosya adı genellikle .dll olurken, Unix-benzeri hedeflerde genellikle .so olur.

Saldırgan notları

  • Bazı dökümantasyonlarda veya eski yazılarda function_exists("dl") true döndüğü için bunun uzaktan çalıştığını varsaymayın; canlı SAPI’yi doğrulayın
  • Uyumsuz bir modül nedeniyle başarısız bir dl() denemesi PHP worker’ını öldürebilir
  • PHP 8’den itibaren, devre dışı bırakılmış fonksiyonlar fonksiyon tablosundan kaldırılır; bu yüzden userland enumerasyonu eski yazılardan farklı olabilir
  • Eğer extension_dir’e yazamıyorsanız, bu teknik genellikle bu bölümde daha önce ele alınan FPM/FastCGI, LD_PRELOAD veya modül-özel bypass’larından daha az pratiktir

Referanslar

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) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin