[TR] SUID & Privilege Escalation
(Nisan 2020)
Herkese merhaba, ben Anıl Çelik.
Bugünkü yazımda, Linux sistemlerde bulunan SUID kavramından ve SUID kullanılarak yapılan Privilege Escalation (Hak/Yetki Yükseltme) işleminden bahsedeceğim.
Öncelikle, SUID (Set Owner UserID) nedir?
Linux sistemlerde, normalde bir kullanıcı bir dosyayı çalıştırmak istediğinde, dosya üzerinde gerekli okuma ve çalıştırma yetkilerine sahipse bu dosyayı kendi kullanıcı hesabına atanmış yetkilerle çalıştırabilir.
Set Owner UserID (SUID) ise, Linux sistemlerde bir dosyaya verilen özel bir izindir. Sistem üzerindeki bir kullanıcı üzerinde çalıştırma yetkisi bulunmadığı bir dosyayı çalıştırmak istediğinde, dosyanın sahibi tarafından ilgili işlemin yapılabilmesi için gerekli yetkinin bulunduğu bit’e bir SUID biti atanır ve daha önce dosya üzerinde istediği işlemi gerçekleştiremeyen kullanıcı, SUID biti atandıktan sonra o dosyayı dosya sahibinin yetkilerini kullanarak çalıştırabilir. SUID nin kullanılması,düşük yetkili kullanıcının sadece çalıştırması gereken dosyaya yüksek yetkili kullanıcı/dosya sahibi izinleriyle çalıştırma izni vererek kullanıcıya daha yüksek yetkiler verilmesinin önüne geçilmesi gibi durumlarda avantaj sağlayabilir.
Örnek olarak dosyaların içeriğini görüntülememizi sağlayan cat komutunu ele alalım. Root yetkisine sahip bir kullanıcıda oluşturduğumuz bir dosyanın içeriğini root yetkisine sahip olmayan bir kullanıcıdan görüntülemeye çalıştığımızda, aşağıdaki hatayı alacağız:
Bu problemi iki farklı yolla aşabiliriz. İlk yolda, dosya içeriğini görüntülememize yarayan cat komutuna bir SUID bit set edebiliriz, böylece kullanıcı sahibi root olan dosyalar dahil istediği herhangi bir dosyanın içeriğini görüntüleyebilir. Önce cat komutunun SUID değerini ayarlayalım:
Şimdi de az önce görüntülemeye çalıştığımız dosyayı tekrar görüntülemeye çalışalım:
Görüldüğü üzere, dosyanın içeriğini görüntüleyebildik. Ancak burada aklımızda bulundurmamız gereken en önemli şey, SUID değerini cat dosyasına tanımladığımız için, yetki verdiğimiz kullanıcı görmesini istemediğimiz dosyaları da görüntüleyebilir, bu da bir güvenlik açığı oluşturabilir. Bunun yerine, daya uygun bir yöntem olarak direk görüntülenmesi istenen dosya/dosyalara ait SUID bit değerlerini set edebiliriz:
Burada dikkat edilebilecek bir nokta olarak, SUID bitini temsil eden “s” bitinin büyük s “S” şeklinde yazılması olabilir. Bunun sebebi, SUID bitinin ilgili dosyada set edilmiş ancak henüz çalıştırılabilir iznin verilmemiş olmasından kaynaklanmaktadır. Bu sorunu çözmek için:
Bu yolu izleyebiliriz. Sonrasında ise kullanıcıya çalıştırma o+x komutu ile çalıştırma yetkisi verip tekrar root olmayan bir kullanıcıdan dosya içeriğini görüntülemeye çalıştığımızda:
Gördüğümüz gibi dosya içeriğini görüntüleyebildik.
SUID nin kullanıldığı bir diğer örnek olarak, Linux sistemlerde root yetkilere sahip olmayan bir kullanıcı, hesabının şifresini değiştirmek istediğinde şifresini başarıyla değiştirebilmesinin sebebi, /usr/bin/passwd dosyasındaki SUID bitinin set edilmiş olmasından kaynaklanmaktadır. Çünkü, bir kullanıcı hesabının şifresini değiştirmek istediğinde, bu değişikliği yetkisinin bulunmadığı, kullanıcı bilgilerinin tutulduğu /etc/shadow dosyasında değişiklik yapması gerekmektedir. Bir kullanıcı şifresini değiştirmek istediğinde, /usr/bin/passwd dosyasındaki set edilmiş SUID biti sayesinde root yetkisi ile işlem yaptıktan sonra /etc/shadow dosyasına yapılan root yönlendirmesiyle bu işlemi gerçekleştirebilmektedir. /usr/bin/passwd dosyasının SUID bitini aşağıda görebiliriz:
Şimdi gelelim SUID ile oluşabilecek güvenlik açıklarına ve Privilege Escalation yani Hak/Yetki Yükseltme aşamasına :) Az önce yukarıda yapmış olduğumuz gibi cat komutunda yaptığımız bir SUID bit düzenlemesine benzer olarak benzer veya daha kritik bir sistem komutunda yanlış yapılandırılacak bir SUID biti, sisteme düşük haklara sahip bir kullanıcı ile sızmış bir saldırganın sistem üzerindeki verileri rahatlıkla okuyarak yetkilerini yükseltmesine sebebiyet verebilir. Örneğin, yanlış SUID yapılandırmasına sahip bir /etc/shadow dosyasına erişim sağlayan bir saldırgan, sistem üzerindeki bütün kullanıcıların kullanıcı adları ve parolalarına ait hash bilgilerine ulaşıp basit bir hash decryption işlemiyle sistem üzerinde yüksek yetkilere sahip kullanıcı ile bir SSH oturumu elde edebilir. Lafı daha fazla uzatmadan, TryHackMe platformunda bulunan ve SUID Privilege Escalation aşamasında kullanacağım lab ortamına geçiş yapalım. Bu lab makinesinin SUID ye karşı zafiyet barındırdığını zaten biliyoruz, bu yüzden direk sistem üzerinde tanımlanmış bütün SUID bitlerini görüntülemek için find / -user root -perm -4000 -exec ls -ldb {} \; komutunu kullanalım:
Gördüğümüz gibi, aşağıya kadar uzanıp giden uzun bir liste var. Biz burada nice, nl, ip, chmod, run-parts ve son olarak vim modülleri üzerinden sistemde istediğimiz dosyaları görüntülemeye veya hak yükseltmeye çalışacağız.
- İlk olarak nice ile başlayalım. nice modülü, Kernel yani User Application ve Computer Hardware arasında bulunan katman üzerinde direkt olarak System Call yetkisine sahip olup, işlemcinin yapması gereken görevleri önceliklendirmede kullanılır. nice modülüne dair hak yükseltme işlemlerini incelemek için GTFO Bins üzerinde bulunan yetki yükseltme komutu/komutları kullanabiliriz (Bundan sonraki her komutta yine GTFO Bins üzerindeki dökümanı kullanacağım):
Burada verilen sudo nice /bin/sh komutunu kullanalım:
Görüldüğü üzere, herhangi bir ekstra işleme gerek kalmadan direk olarak root seviyesinde bir shell elde ettik :)
- Sıradaki komutumuz olan nl ile devam edelim. nl, number lines adı verilen, dosyaları satır satır okumamıza olanak sağlayan bir modüldür. Bu modülün SUID zafiyetinden yararlanmak için aşağıdaki komutu girebiliriz:
nl in kendisi dosya üzerinde görüntüleme üzerine bir modül olduğu için, kendisine ait SUID zafiyeti de gördüğümüz gibi istediğimiz dosyayı okuyabilmemize olanak sağlıyor.
- Bir sonraki komutumuz olan ip ile devam edelim. Genel olarak ifconfig komutuna benzeyen ip komutu, birden çok network işlemini tek komutta halletmemize olanak sağlar. SUID zafiyeti için aşağıdaki işlemi gerçekleştirebiliriz:
Gördüğümüz gibi, yine hedef dosyayı okumayı başardık.
- Sonraki komutumuz, chmod. Bu yazıda da birçok kez kullandığımız chmod, dosya izinlerini düzenlememize yarar. İlgili SUID zafiyetine göz atalım:
Yine dosyayı okumayı başardık.
- Bir sonraki modülümüz olan ve bize root shell erişimi sağlayacak olan run-parts modülüne geçelim. run-parts modülü, bir dizindeki scriptleri veya programları çalıştırmamıza olanak sağlar. Zafiyet kısmına geçelim:
Görüldüğü üzere, haklarımızı root kullanıcısına yükseltmeyi başardık.
- Son olarak haklarımızı root seviyesine yükseltmemize yarayacak bir diğer modül olan vim i inceleyelim. Vim, Linux sistemlerde bir text editor ve aynı zamanda hex editor olarak kullanılmaktadır. Vim ile hak yükseltmemize yarayan zafiyete geçelim:
Ve son olarak Vim aracı ile de sistem üzerinde haklarımızı yükseltmeyi başardık.
Buradan çıkarabileceğimiz sonuç; SUID bize çeşitli kolaylıklar sağlayabilir ancak sistem üzerinde dosyaların yetkisine bağlı bir değişiklik yapmadan önce, o değişikliğin sistem üzerinde nasıl etkilere sahip olabileceğini, arkası kurcalandığında sistem üzerinde ne tür zafiyetlere yol açabileceğini çok iyi incelememiz gerekmektedir.
SUID ve Privilege Escalation hakkında bahsetmek istediklerim bu kadardı, yazımı okuduğunuz için teşekkür ederim.