İçeriğe atla
0 XP 0
11 dkderinleşmeyle 12 dk55 XP5 etkinlik

Numaralandırma: cron, PATH ve servisler

Bu derste
  • linpeas gibi araçlar cron, PATH ve servis yanlış yapılandırmalarını saniyede çıkarır, ama her satırı doğrulamak sana düşer.
  • Araç olasılık üretir, kanıt üretmez; işaretlenen her bulguyu elle denersin.
  • Yazılabilir servis dosyası, gevşek PATH ve mutlak yolsuz cron görevi üç klasik yoldur.

Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

Yükseltme çoğu zaman tek bir açıkla gelmez. Küçük yanlış yapılandırmalar üst üste binince yol açılır. Bu dersin konusu, o yığını hızlı çıkarmak ve her maddeyi tek tek kanıta çevirmektir.

Araç haritayı çizer; kanıtı sen üretirsin. Aradığın desen her zaman aynıdır: yüksek yetkiyle çalışan bir şey ile senin dokunabildiğin bir şeyin kesişimi. Bu kesişimi hızlı bulmak, bir denetimin en çok vakit alan ama en çok kazandıran adımıdır.

Araç olasılık üretir, kanıt sen

Elle numaralandırma öğreticidir ama yavaştır. Aynı kontrolleri bir araç saniyeler içinde yapar. linpeas, Linux için yüzlerce kontrolü arka arkaya koşturur ve dikkat çeken satırları renklendirip işaretler. Bu hız bir tuzak da taşır.

Araç bir satırı kırmızıya boyadığında, o satır bir olasılıktır, kanıt değildir. İşaretlenen her maddeyi elle denersin. Doğrulanmamış bir çıktı rapora girerse yanlış pozitif olur ve bütün raporun güvenilirliğini düşürür. Bir müşteri tek bir yanlış bulguyu fark ederse geri kalan doğru bulgulara da güveni azalır.

$ ./linpeas.sh -q > linpeas.txt
$ grep -i 'writable' linpeas.txt | grep '\.service' | sort -u
$ grep -A3 'PATH' /etc/crontab
Ham çıktı süzülerek okunur, sonra her bulgu ayrı ayrı denenir.

Boru hattını adım adım oku. İlk satır linpeas çıktısını düz metin olarak bir dosyaya yazar. İkinci satır bu dosyayı iki süzgeçten geçirir. grep -i 'writable' harf büyüklüğünü önemsemeden yazılabilir kelimesini içeren satırları bırakır.

İkinci grep bu satırlardan yalnız .service uzantılı olanları seçer. sort -u aynı satırın tekrarını siler ve listeyi tek kopyaya indirir. Üçüncü komut cron yapılandırmasındaki PATH tanımını ve çevresindeki üç satırı gösterir. Her süzgeci ayrı çalıştırırsan hangi adımın neyi elediğini görürsün.

Bu süzme alışkanlığı yalnız linpeas için değildir. Herhangi bir uzun çıktıyı okurken aynı yöntemi kullanırsın. İki kısa liste çıkarmak işi kolaylaştırır.

Biri root olarak koşan süreçler, görevler ve servislerdir. Öbürü senin yazabildiğin dosya ve dizinlerdir. İki listenin ortak noktası yükseltme adayıdır.

Ham çıktıda yüzlerce satır arasında kaybolmak yerine, bu iki listeye indirgersin. İki listeyi yan yana koymak, yüzlerce satırı birkaç adaya düşürür.

Gerçek bir denetimde bu süzme becerisi zaman kazandırır. Bir e-ticaret sunucusunda linpeas yüzlerce satır üretir ve bunların çoğu yalnız bilgilendirme amaçlıdır. Senin işin, o yığından yazılabilir bir birim dosyasını ya da gevşek bir PATH tanımını birkaç grep ile çekip çıkarmaktır.

Deneyimli analist çıktıyı baştan sona okumaz. Aradığı deseni bilir ve doğrudan ona iner. Bu da ancak hangi satırın neden önemli olduğunu önceden öğrenmekle kazanılan bir sezgidir.

Etkinlik 1 / 5

linpeas çıktısından yazılabilir servis dosyalarını ayıkla. Parçaları sıraya diz.

Parçalara tıklayarak komutu soldan sağa kur.

$

cron ve PATH

İlk klasik yol cron görevleridir. Sistem belirli aralıklarla root olarak betik çalıştırır. Betik yazılabilir bir dizindeyse içeriğini değiştirir, bir sonraki koşuda kendi kodunu root olarak çalıştırırsın. Daha ince bir durum PATH sırasıdır.

PATH, kabuğun komutları hangi dizinlerde ve hangi sırada arayacağını söyler. Başında kullanıcının yazabildiği bir dizin varsa, mutlak yol kullanmayan her çağrı risk taşır. Bu yüzden cron yapılandırmasında hem betiğin iznine hem PATH sırasına birlikte bakarsın.

Mekanizma şöyle işler. Root bir cron betiğinde bir komutu çıplak adıyla, yani tam yolunu yazmadan çağırır. Kabuk o komutu PATH'teki dizinlerde soldan sağa arar. PATH'in başında senin yazabildiğin bir dizin varsa, oraya aynı adda bir dosya koyduğunda kabuk önce seninkini bulur ve çalıştırır.

Gerçek komut hiç sıra gelmez. Tek bir eksik mutlak yol, bütün görevi devralmana yeter. Aşağıdaki cron yapılandırmasında bu iki hata bir arada durur.

Bu yolu denemeden önce güvenli mi diye bakarsın. cron görevinin ne sıklıkla koştuğunu okur, bir sonraki koşuyu beklersin. Değiştireceğin betiğin bir yedeğini alır, kanıtı topladıktan sonra eski haline döndürürsün. Gerçek bir ortamda bu dikkat önemlidir.

Her beş dakikada bir koşan bir yedek görevini bozarsan, o gece yedek alınmaz ve iş aksar. Kanıt için çoğu zaman betiğe zararsız bir satır, örneğin kimliği bir dosyaya yazan tek bir komut eklemek yeter. Yıkıcı bir yük bırakmana gerek kalmaz.

Bu yolu mavi taraftan kapatmak kolaydır. cron betikleri her zaman mutlak yolla çağrılır ve betik dosyaları yalnız root'un yazabileceği biçimde tutulur. PATH tanımına kullanıcı dizini konmaz.

Sahipsiz ya da herkese yazılır cron betikleri düzenli taranır. Bu üç kontrol, görevi devralma yolunu baştan tıkar ve haftalık bir denetime kolayca sığar. Üç kontrol de birer satırlık komutla otomatikleştirilebilir. Böylece denetim her hafta tekrar edilir ve yeni bir açık geldiğinde hemen görünür.

Etkinlik 2 / 5

cron görevinde yükseltmeye açık satırı bul.

Zafiyetli satıra tıkla.

linpeas çıktısını okumak

linpeas'ı bayraklarıyla doğru çalıştırmak çıktıyı okunur tutar. -q bayrağı renk kodlarını ve gereksiz başlıkları keser. Çıktıyı bir dosyaya yönlendirince düz metin elde edersin. Düz metni grep ile süzer, rapora da doğrudan alıntılarsın.

Renkli çıktı ekranda hızlı tarama için iyidir, ama bir dosyaya yazınca kaçış kodları metni kirletir ve grep'i yanıltır. Bu yüzden kaydedilecek çıktı her zaman sade biçimde alınır. Aksi halde kaydettiğin dosyada satırlar bozulur ve rapora alıntılaman zorlaşır.

Çıktıda önce öne çıkan satırlara bakarsın, ama aracın işareti senin sıralaman değildir. Kendi kesişim mantığınla okursun. Root olarak koşan bir süreç, yazılabilir bir yol ve bilinen bir kaçış birleşiyorsa, o satır önceliklidir.

Geri kalanını not alır, zaman kalırsa dönersin. Birden çok yükseltme yolu bulduğunda hepsini raporlar, ama en sessiz ve en güvenilir olanı gösterirsin; müşteri önce hangisini düzelteceğini böyle bilir.

linpeas tek araç değildir. LinEnum ve linux-smart-enumeration benzer kontrolleri farklı biçimde sunar. pspy ise ayrı bir işe yarar: root iznine gerek olmadan çalışan süreçleri ve zamanlanmış görevleri canlı izler.

Bir cron görevinin tam olarak hangi komutu, hangi kullanıcıyla çağırdığını görmek istersen pspy çıktısı doğrudan gösterir. Yine de araç ne olursa olsun kural değişmez. Araç bir aday gösterir, sen onu elle doğrular ve kanıtını toplarsın. Hiçbir araç senin yerine bir bulgunun gerçek olduğunu kanıtlamaz.

Etkinlik 3 / 5

linpeas bu bayrakla çalıştırıldığında çıktı nasıl döner?

Önce kodu oku, sonra çıktıyı seç.

$ ./linpeas.sh -q > linpeas.txt

systemd birimleri ve kimlik bilgisi avı

İkinci klasik yol systemd birim dosyalarıdır. Bir servis, nasıl başlayacağını birim dosyasındaki ExecStart satırından okur. Bu dosyayı ya da gösterdiği ikiliyi düzenleyebiliyorsan, çalıştırdığı komutu değiştirirsin.

Servis root olarak yeniden başlatıldığında senin komutun da root koşar. systemctl cat komutu birim dosyasının tam içeriğini ve geldiği yolu gösterir. Dosya izinlerini her zaman bu çıktıyla birlikte okursun, çünkü açık bazen birim dosyasında değil, çağırdığı betiğin izinlerindedir.

$ systemctl cat yedek.service
# /etc/systemd/system/yedek.service
[Service]
ExecStart=/opt/altay/yedek.sh
$ ls -l /opt/altay/yedek.sh
-rwxrwxrwx 1 root root 812 Mar  4  2026 /opt/altay/yedek.sh        <-- herkese yazilir
Birim root koşuyor, ExecStart hedefi herkese yazılır; ikisi birleşince yol açılır.

Çıktı iki parçayı yan yana koyar. Üstte birim dosyası ExecStart ile /opt/altay/yedek.sh betiğini çağırıyor. Altta o betiğin izinleri rwxrwxrwx, yani herkes yazabiliyor. Servis root olarak koştuğu için, betiğe eklenen bir satır bir sonraki yeniden başlatmada root çalışır.

Buradaki açık, birim dosyasının izinlerinde değil, çağırdığı betiğin herkese yazılır olmasındadır. İki ucu birlikte okumasan bu bulguyu kaçırırsın. Bu alışkanlık, gizli kalmış açıkları görünür kılar.

Kimlik bilgisi avı da bu aşamaya girer. Yapılandırma dosyaları, kabuk geçmişi ve yedek betikler düz metin parola taşıyabilir. .bash_history dosyası, bir yöneticinin komut satırına yazdığı parolayı tutmuş olabilir. Ortam değişkenleri ve süreç listesi, argüman içinde parola taşıyan çağrıları gösterir.

Yedek yapılandırma dosyaları ise veritabanı bağlantı dizesini açıkta bırakabilir. Bulduğun bir kimlik bilgisini yalnız kapsamdaki sistemde denersin. Kapsam dışı bir sistemde parola denemek, testin sınırını aşmak demektir.

systemd yalnız servislerle sınırlı değildir. Zamanlayıcılar cron'un modern karşılığıdır ve aynı mantıkla yanlış yapılandırılır. Soket etkinleştirmesi ise bir servisi, bir bağlantı geldiğinde başlatır.

Bu birimlerin hepsi birer dosyadır ve dosya izinleri aynı soruyu sordurur: kim yazabiliyor? systemctl list-timers komutu etkin zamanlayıcıları listeler. Bir zamanlayıcı root olarak koşan ve senin düzenleyebildiğin bir birimi tetikliyorsa, cron örneğindeki yolun aynısı açılır. Modern bir sistemde cron yerine bu birimler kullanılır, ama risk birebir aynıdır.

Etkinlik 4 / 5

Yazılabilir bir systemd servis dosyası neden yükseltme yolu açar?

Sık hata ve mavi taraf denetimi

En sık iki hata burada toplanır. Birincisi, otomatik aracın bir bulgusunu doğrulamadan rapora yazmaktır. İkincisi, elde ettiğin bir parolayı başka bir makinede denemektir. Aynı parolanın ikinci sistemde denenmesi yatay harekettir ve bu bir kapsam sorusudur.

Kapsam belgesi yatay hareketi açıkça yazmıyorsa, ikinci makineye geçmezsin. Bulguyu yazar ve müşteriden yazılı onay istersin. Yetkisiz bir yatay hareket, bütün testin hukuki temelini zedeler.

Mavi taraf için bu dersin tamamı bir denetim listesine döner. Yazılabilir birim dosyaları, gevşek PATH tanımları ve sahipsiz cron görevleri haftalık taranır. Servis hesapları en az yetkiyle koşar.

Numaralandırma çıktısını saklamak düzeltme turunu da kolaylaştırır. Aynı araç düzeltmeden sonra yeniden koşturulur, iki çıktı karşılaştırılır ve kapatılan maddeler fark listesinde görünür. Böylece hem saldırgan hem savunmacı aynı veriyi kullanır. Bir denetim turu, hem saldırı yüzeyini hem düzeltmenin kanıtını birden üretir.

Bulguları önceliklendirmek de senin işindir. Üç ayrı yükseltme yolu bulduysan raporda hepsini yazarsın, ama en düşük gürültülü ve en güvenilir olanı öne koyarsın. Müşteri hangi yapılandırmayı önce düzelteceğini böyle bilir.

Numaralandırmayı bitirince kısa bir özet çıkarırsın: hangi kontroller yapıldı, hangileri atlandı ve neden. Bu özet raporun sistem bölümünün iskeleti olur. İyi bir rapor bir saldırı günlüğü değil, düzeltmeye yol gösteren bir harita gibi okunur.

Derinleş:Çekirdek açığı neden en sona konur

Dördüncü bakılacak yer çekirdek sürümü ve yüklü paketlerdir. Eski bir çekirdek, bilinen bir yerel yükseltme açığı taşıyabilir. Yine de çekirdek sömürüsü yetkili bir testte en sona konur.

Nedeni basittir: yanlış sürüme yazılmış bir çekirdek açığı makineyi kilitler ya da yeniden başlatır. Bu hem test ortamını bozar hem de müşterinin işini durdurur.

Önce yapılandırma hatalarını tüketirsin: sudo kuralları, SUID dosyaları, cron görevleri, PATH ve servisler. Bunlar dakikalar sürer ve makineyi riske atmaz. Çekirdek açığına yalnız öbür yolların hepsi kapalıysa ve müşteri bu riski yazılı onaylıyorsa gidersin. O zaman da önce bir anlık görüntü ya da yedek alınır, böylece makine bozulursa geri dönülebilir.

Etkinlik 5 / 5

Doğru mu, yanlış mı?

Otomatik numaralandırma aracının her bulgusu doğrulanmadan rapora yazılabilir.

Dersi bitirmek için 5 etkinlik kaldı

Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.

Bu derste bir hata mı gördün? Bildir