Linux'ta yetki yükseltme (privilege escalation) ne anlama geliyor?
Yetki yükseltme herhangi bir kullanıcının düşük seviye yetkilerini daha yüksek bir yetkiye getirilmesi anlamına gelir.
Bizim için bunun önemi ise düşük yetkili bir kullanıcıyı yönetici yetkilerine getirebilecek bir zafiyet bulmak ve bunu istismar ederek sistemi ele geçirebilmektir (genellikle kullanıcılara izin verilmeyen bazı dosyaları açmak, root olarak komut çalıştırmak vs.).
Linux'ta yetki yükseltme (privilege escalation) konusu neden önemli?
Gerçek bir sızma testi yaptığımızı düşünelim, direkt olarak yönetici yetkilerini ele geçirmek genellikle mümkün olmayacaktır. İlk olarak elde edilen bir kullanıcının yetkileri olacak ve bu yetkiler de bize sınırlı işlem kabiliyeti verecektir.
Yetki yükseltme bu durumda kritik bir rol oynar çünkü başarılabilirse sistem yöneticisine ait tüm yetkiler elde edilmiş olur.
Peki bu yetkileri ele geçirmek ne işe yarar, neler yapılabilir?
- Parolalar sıfırlanabilir,
- Korunan verileri ele geçirmek için erişim kontrol noktaları atlatılabilir,
- Yazılım yapılandırmaları değiştirilebilir,
- Sistemde sürekli (kalıcı) olarak yerleşmek mümkün olabilir (böylece makinaya istediğimiz zaman tekrar erişim sağlanabilecektir),
- Başka kullanıcılara ait yetkiler değiştirilebilir.. vb.
Bunların yanında diğer yönetici (ya da super user (sudo) komutları da çalıştırılabilecektir.
Linux'ta yetki yükseltme (privilege escalation) çeşitleri?
Temelde iki tip yetki yükseltme mümkündür: yatay ve dikey.
Eğer başka bir kullanıcının yetkileri ele geçirilebiliyorsa buna yatay, eğer yönetici yetkileri ele geçirilebiliyorsa buna dikey yetki yükseltme denir.
Yatay yetki yükseltme: Kendi kullanıcımız ile aynı seviyede (aynı yetkilere sahip) başka bir kullanıcının yetkilerini ele geçirmemizdir. Aynı seviyede bir kullanıcı olduğu için faydasız değildir, aksine bu yeni kullanıcı bize yönetici yetkilerini ele geçirebilmemiz için gereken kapıyı açıyor olabilir. Bu yeni kullanıcının erişebildiği dizin ve dosyalar artık araştırmamız için elimizin altındadır. Tekrar bir başka aynı seviye kullanıcı hesabının ele geçirilmesi için de kullanılabilecektir.
Dikey yetki yükseltme: Privilege escalation yerine Privilege Elevation da denmektedir ve ayrıcalıkların yükselmesi anlamına gelir. Local yani yerel sistemde yetki yükseltme saldırıları için yönetici yetkilerine ya da root kullanıcı ayrıcalıklarına sahip bir hesabın ele geçirilmesi anlamına gelir.
Yetki yükseltme için LinEnum kullanımı
LinEnum nedir?
LinEnum bir bash betiğidir ve yetki yükseltmeye çalışırken oldukça kolaylık sağlar.
LinEnum nasıl yüklenir?
https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh
Yukarıda yer alan adresten yüklenebilir. LinEnum özellikle yetki yükseltmeye çalışırken çok işe yarayacak bir araç olduğundan nereye yüklendiği ve nasıl kullanıldığının hatırlanması iyi olacaktır.
LinEnum'u hedef makinaya alabilmek için iki yol var:
└─$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)
└─$ wget "localIPadresiniz":8000/LinEnum.sh
! Eğer dosya transfer edilemiyorsa: Hedef dosyadaki kullanıcının bu işlem için yeterli yetkiye sahip olması durumunda LinEnum kodunun raw hali yerel makinadan kopyalanıp hedef makinada bir dosya içerisine kaydedilebilir (.sh uzantısı ile). Bunun için ben vim kullanıyorum ancak Nano da kullanılabilir. Ardından kaydedilen dosyanın yine çalıştırılabilir hale gelmesi için chmod +x dosya adı komutunun kullanılması gerekir. Böylece hedef makinada LinEnum script'i ./LinEnum.sh komutuyla çalıştırılabilir.
LinEnum Çıktılarını anlamak
LinEnum çıktıları birkaç bölümden oluşur.
(Kernel nedir? İşletim sistemi çekirdeği, kısaca çekirdek. Daha detaylı bilgi için: https://tr.wikipedia.org/wiki/%C3%87ekirdek_(bilgisayar_bilimi) )
Hassas dosyaları okuyabiliyor ya da bu dosyalara yazabiliyor muyum? LinEnum ile alınan çıktılar bize herhangi bir kimliği doğrulanmış kullanıcı tarafından yazılabilir ve okunabilir dosyaları gösterir.
Hassas dosyaların yetki izinlerine bakarak nerede bir hatalı yapılandırma olduğu araştırılabilir. Ayrıca normalde erişilmemesi gereken herhangi bir dosyaya herhangi bir kullanıcının erişim izni bulunması ve bu dosyaya yazabilmesi de araştırılır.
SUID Dosyaları: SUID dosyalarının çıktılarının gösterildiği bölümdür.
(SUID Nedir? SUID (Set owner User ID up on execution), adından da anlaşılabileceği üzere "dosyayı dosya sahibinin izinleri ile çalıştır" demektir. Yani çalıştırılabilir dosyalar için, diğer kullanıcıların dosyayı sahibinin etkin izinleriyle çalıştırmasına olanak tanıyan özel bir dosya iznidir. Yürütme izinlerini temsil eden normal x yerine, kullanıcı için bir s (SUID belirtmek için) özel izni görülür. Daha detaylı bilgi için: https://www.tecmint.com/how-to-find-files-with-suid-and-sgid-permissions-in-linux/ )
Dolayısıyla yetki yükseltme için kullanılabilmektedir.
Crontab: Zamanlanmış görevler burada gösterilir. Cron komutların belirtilen zamanda çalıştırılması için kullanılır. Bu zamanlanmış görevlere "cron jobs" denir. Gerekli komutlar ve talimatları cron deamon'un çalıştırması için oluşturan crontab dosyaları crontab komutu ile oluşturulur. Bu bölümde cronjobs'ı istismar etmek için gerekli bilgiler bulunabilir.
LinEnum çıktıları bu kadarla sınırlı değildir ve genellikle istismar için çok sayıda önemli bilgiyi verir.
SUID Dosyalarını Bulmak ve İstismar Etmek
Linux'ta yetki yükseltmeye çalışılırken ilk yapılması gereken SUID/SGID bit set dosyalarını araştırmaktır.
Dosya veya dosyaların, dosya sahibi ya da grubunun izinleriyle çalıştırılabileceği düşünülürse "super user" olarak dosyaları çalıştırabileceğimiz anlamına gelir. Bu da yetki sahibi olarak shell elde etmek için bundan yararlanabileceğimiz anlamına gelir.
SUID binary nedir?
Bilindiği üzere Linux'ta okuma / yazma / yürütme gibi üç işleme izin verme veya kısıtlama yetkilerine sahip dizinler ve cihazlar dahil olmak üzere her şey bir dosyadır. Bir dosya için yetki belirlediğimizde bu yetkilerin (okuma / yazma / yürütme yetkileri) kime ya da kimlere verildiğinin de bilinmesi gerekir.
Maksimum yetki (rwx-rwx-rwx) şeklinde görülür ve şu anlama gelir:
r = read (okuyabilir)
w = write (yazabilir)
x = execute (çalıştırabilir)
rwx-rwx-rwx görüldüğünde ilk üçlü (rwx) kullanıcı, ikincisi grup, üçüncü ise "diğer" için tanımlanmış yetkileri ifade eder.
Bu örnekte her üçü de okuma, yazma ve çalıştırma yetkilerine sahip olduğundan "maksimum yetkiler"e sahip oldukları anlaşılır ve rakam ile gösterimi: 421 421 421 şeklindedir.
Her kullanıcı yetkisi için belirlenebilecek maksimum rakam 7'dir ve okuma (4), yazma (2) ve çalıştırma (1)'in toplamına eşittir.
Farklı bir örnek olarak yetkileri chmod komutu ile 755 olarak ayarlarsak rwx-rx-rx olacak ve ilk rakam (7) kullanıcının maksimum yetkilere sahip olduğunu gösterecek, grup çalıştırma ve okuma yetkilerine, "diğerleri" de çalıştırma ve okuma yetkilerine (çünkü 4+1=5) sahip olacaktır.
ANCAK
Eğer her kullanıcıya özel yetki verilirse SUID (Set User ID) ya da SGID (Set Group ID) haline gelir.
Bu durumda normalde gördüğümüz "x" yani execute yani çalıştırabilme yetkisinin yerini "s" alır.
SUID ararken bakılacak yetki aşağıdaki gibi görünür:
rws-rwx-rwx
SGID (ya da GUID) ararken bakılacak yetki aşağıdaki gibi görünür:
rwx-rws-rwx
SUID Binary bulmak
LinEnum scan sonucunda sistemde SUID özellikli dosyalar olduğunu tespit edebiliyoruz.
Ancak tespit işini manuel olarak yapmak istiyorsak aşağıdaki komutu kullanarak sistemde yer alan SUID/GUID dosyalarını aratabiliriz:
find / -perm -u=s -type f 2>/dev/null
* Normalde find komutu ile bir şey aradığımızda milyon tane "Permission denied" yazan hata döndüğünden komutun son kısmında yer alan 2>/dev/null kullanımı hayat kurtarır.
Buarada dünyalar iyisi find komutunu da iyi kullanabilir olmak sıklıkla işe yarıyor. Yukarıdaki komutta yer alan flagların ne olduğunu bilmiyorsanız Find Komutu ile Aradığını Bulmak (Linux) ve Deneme Soruları yazıma bakabilirsiniz.
Bu yazı olması gerekenden çok uzadığı için burada bırakıyorum. Devamına Linux'ta yetki yükseltme (Privilege Escalation) II yazısından erişilebilecektir.
Daha öğrenilmesi gereken çok şey var...
Hiç yorum yok:
Yorum Gönder