Sudo Komutu ve Linux Privilege Escalation

Alp Batur
6 min readOct 30, 2020

--

Bu flood’da Sudo Komutunu ve Linux Privilege Escalation konusunu anlatacağım. Öncelikle sudo komutunun ne olduğu ile başlayalım.

Sudo, mevcut kullanıcıya geçici olarak root (tüm yetkilere sahip olan hesap) yetkisi veren ve herhangi bir komutu yönetici olarak çalıştırmasına olanak sağlar. Örneğin, normal kullanıcıların zaman zaman root yetkisi ile işlemler yapması gerekebilir. Fakat bütün oturumu root yetkisiyle yönetmek çok tehlikelidir. Yanlış bir komut ile zarar verilebilir veya zararlı bir dosya çalıştırıp saldırgan tarafından ele geçirilmesine yardımcı olabiliriz. Bu yüzden sistemi daha esnek ve daha sıkı yapmamız için sudo komutu bize yardımcı olmaktadır.

Linux işletim sistemlerinde iki kullanıcı türü bulunmaktadır. Bunlar sistem kullanıcıları ve useradd komutu ile yaratılan kullanıcılardır. Sistem kullanıcıları çeşitli paketler yükleme sırasında oluşturulan kullanıcıları içermektedir ve genellikle düşük UID değerine sahiptirler. Useradd komutu ile oluşturulan kullanıcılar ise sistem sahipleri tarafından ihtiyaç doğrultusunda oluşturulmuş kullanıcılardır. /etc/login.def dosyasını incelediğimizde useradd komutu ile oluşturulan kullanıcıların UID aralığının 1000 ile 60000 arasında tanımlandığını tespit ediyoruz.

Bu bilgi doğrultusunda useradd ile oluşturulan kullanıcıları listelemek için awk komutunu kullanacağız. Awk, örüntü temelli tarama ve işleme dilidir. Dosyadaki her satır ve sütunu ayrıştırarak örüntüye uygun bir şekilde çıktı verir. Default olarak kelimeleri boşluklara göre ayrıştırır. /etc/passwd dosya formatında ilk dizin kullanıcı adını ve üçüncü dizin user id (UID) değerini belirttiği için aşağıdaki komut sayesinde useradd komutu ile oluşturulan kullanıcıları listeliyoruz ve sadece kullanici adlı kullanıcının useradd komutu ile oluşturulduğunu görüyoruz.

Tüm kullanıcıları listelemek için cat /etc/passwd,
sistemdeki kullanıcıların sayısı için cat /etc/passwd | wc -l,
alternatif olarak kullanıcı listesi için compgen -u ve grup listesi için compgen -g komutları kullanılabilir.

Sisteme bulaşmış bir malware olduğu zaman kullanıcı kontrolü önem arz edecektir.

Kullanıcı oluşturmak için adduser veya useradd ve şifre belirlemek için passwd komutu kullanılır. Parametre olarak herhangi bir kullanıcı adı verilmediği takdirde aktif kullanıcı için şifre değişimi yapar. Kullanıcı silmek için ise userdel komutu kullanılır. Fakat bu komut sadece kullanıcıyı siler, dosyaları ile birlikte silmek için -r parametresi kullanılır. Aynı şekilde kullanıcı grubu oluşturmak için groupadd ve silmek için groupdel komutları kullanılmaktadır.

Useradd komutu ile oluşturulan kullanıcılar adduser komutu ile oluşturulan kullanıcılara göre daha düşük seviyeli kullanıcılardır. Aşağıda a kullanıcısı useradd komutu ve b kullanıcısı adduser komutu ile oluşturulmuştur.

Aşağıda sudo useradd komutuyla “kullanici” adında bir kullanıcı oluşturulmuştur. -m parametresi ile home dizininde kullanıcıya ait bir klasör oluşturabilirdik, şimdilik gerek yok.

Yukarıda kullanıcımızı oluşturmuştuk, şimdi ise su kullanıcı komutu ile kullanıcı adlı kullanıcıya geçiş sağlayalım. sudo -l komutu ile hangi yetkilere sahip olduğumuzu görebiliyoruz. Root hesabına geçiş yapmak sudo -i komutunu kullanabiliriz. Fakat kullanıcı adlı kullanıcımız sudo grubuna üye olmadığından dolayı root hesabına geçme istediğimiz başarılı sonuç vermedi.

adduser kullanıcı sudo komutu ile kullanıcımızı sudo grubuna ekledikten sonra sudo -i komutu ile rahatlıkla root yetkilerine erişebiliyoruz.

id komutu ile kullanıcımızın sudo grubuna üye olduğunu teyit edebiliriz.

Sudo yetkilerini kimler hangi nitelikte kullandığını incelemek ve düzenlemek için sudoers dosyası kullanılır. Sudoers dosyasını düzenlemek için visudo adlı özel komut kullanılır. Aşağıda yazdığımız komut ile sudoers dosyasını üzerinden de kullanıcımıza sudo yetkisi verebilirdik.

İlk ALL ile bütün terminallerden, ikinci ALL ile bütün kullanıcıların yerine ve üçüncü ALL ile bütün komutları kullanma hakkı tanınmıştır.

Sudo yetkilerine sahip kullanıcıları listelemek için cat /etc/group | grep sudo komutunu kullanabiliriz.

Kullanıcıya tamamen root yetkilerini vermek yerine sadece belirlediğimiz komutları kullanabileceği sınırlı bir yetki vermek için sudoers dosyası üzerinden gerekli düzenlemeleri yapmamız gerekmektedir. Sadece systemctl status networking komutunu sudo yetkisi ile kullanmasını istediğimiz kullanıcı için sudoers dosyasına aşağıdaki satırı ekliyoruz.

sudo -l komutu ile yetkilerimize baktığımızda sadece systemctl status networking komutunu sudo yetkisi ile kullanabildiğimizi açıkça gözlemleyebiliyoruz. Fakat sistem başka bir komutu sudo yetkisi ile çalıştırmamıza izin vermiyor. Örneğin, systemctl restart networking komutunu root yetkisi ile çalıştırmak istediğimizde hata ile karşılaşıyoruz.

Privilage Escalation

Kullanıcımıza sadece kendi dizinindeki selam.sh ve selamm.sh adlı bash scriptleri sudo yetkisiyle kullanması için sudoers dosyasını aşağıda gösterildiği gibi düzenliyoruz.

Fakat selam.sh scriptine /bin/bash -i komutu dahil edildikten sonra sudo komutuyla çalıştırıldığında otomatik olarak root yetkisini elde edilyoruz.

Aynı şekilde, home dizinindeki selam2.sh scriptine sudo -i komutu dahil edildikten sonra sudo komutuyla çalıştırıldığında yine otomatik olarak root yetkisine sahip olduk.

İkinci senaryomuzda ise kullanıcımıza sudo yetkisini sadece etc/ssh/ssh_config dosyasını more komutuyla kullanması için verilmiştir. Bakıldığında çok kısıtlı bir yetki olarak görülebilir, fakat manipülasyon edilerek root yetkisine çıkılabiliyor.

sudo more /etc/ssh/ssh_config komutu ile dosya açıldıktan sonra en alt satıra yazılan !bash komutu bizi root hesabına yükseltecektir.

Üçüncü senaryomuzda ise kullanıcımıza sınırlı bir root yetkisi tanımlanmış olup bu yetkiyi sadece /var/opt/* dizinindeki dosyaları nano komutu ile kullanabilmesi için düzenleme yapılmıştır.

Fakat dizinler içinde geriye doğru hareket ederek istediğimiz dizine gitme şansı yakaladıktan sonra sahip olduğumuz kullanıcıyı daha yetkili konuma getirmek için sudoers dosyasına gidiyoruz.

Artık kullanıcımızın root yetkisine sahip olması için aşağıdaki komutu ekleyebiliriz.

sudo -l komutu ile yetkilerimizi teyit edebiliriz.

Dördüncü senaryomuzda ise privilege escalation için suid biti etkin uygulamaları kullanacağız.

Suid biti, bir programın herhangi bir kullanıcı bakımından o programın sahibinin yetkileriyle çalıştırmasını sağlar. Örneklemek gerekirse, -SUID biti sayesinde- şifremizi değiştirmek için kullandığımız passwd komutunu aracılığıyla kendi kullanıcımızın şifresini root olmamıza gerek kalmaksızın değiştirebiliyoruz.

find / \( -perm -u+s -or -perm -g+s \) -type f -exec ls -l {} \; komutunu kullanarak sistemde SUID veya SGID bitleri etkinleştirilmiş dosyalar tespit ettikten sonra bir komutun ve processin önceliğini düzenleyen nice programının SUID bitinin etkin olduğunu saptadık. sudo nice /bin/sh komutu ile root seviyesine yükseldik.

Son senaryomuzda ise yine privesc için SUID biti etkin uygulamaları kullanacağız. find / \( -perm -u+s -or -perm -g+s \) -type f -exec ls -l {} \; komutu ile sistemde SUID veya SGID bitleri etkinleştirilmiş dosyaları tespit ediyoruz. Dosya kopyalamak için kullanılan /bin/cp uygulamasında SUID bitin etkin durumda olduğunu gördük. (ls -la /bin/cp yaparak tekrar teyit edebiliriz). cp komutunu kullanarak root yetkisinde kopyalama işlemi yapabiliriz. Öncelikle /etc/passwd dosyasının içeriğini home dizinimizde passwd isimli dosyaya kopyalıyoruz. Dosyamızı nano editörü ile açtıktan sonra kendi kullanıcımızın id değerini root kullanıcısının id değeri ile eşitledikten sonra tekrar /etc/passwd dizinine kopyalıyoruz. su kullanici komutunu kullanarak root yetkisine çıkıyoruz.

--

--