Linux Privilege Escalation (Linux Yetki Yükseltme)

Hedef bir sisteme çeşitli şekillerde sızdıktan sonra sistem üzerinde tam bir yetkiye sahip olamayabiliriz. Çeşitli yöntemlerle sahip olduğumuz yetkileri yükseltebiliriz. Yöntemlerimizi test etmek için Try Hack Me üzerinden bulunan Linux PrivEsc labından göstereceğim.

Öncelikle labda bulunan makineyi çalıştırıyoruz ve çalıştıktan sonra bize verilen SSH bilgileriyle hedef sisteme bağlanmalıyız. Hedef sisteme 10.10.94.109 Ip adresiyle ulaşacağız. SSH bağlantısı için user ve password321 ikilisi kullanıcak.

ssh user@10.10.94.109

Okunabilir /etc/shadow

Linux sistemlerinde kullanıcı bilgileri /etc/passwd dosyasında, kullanıcı hashleri /etc/shadow dosyasında depolanır. Normal bir sistemde sistem yada kullanıcılar hakkında kritik bilgileri normal bir kullanıcının okuyamaması lazım.

Linux sistemimizde /etc/shadow dosyasının sahip olduğu izinleri görmek için şu komutu çalıştırıyoruz ve şu çıktıyı alıyoruz:

/etc/shadow dosyası üzerinde okuma ve yazma yetkimiz olduğunu görüyoruz. Güvenli bir sistemde bu izinlere sahip olmamız gerekiyor.

/etc/shadow dosyasında bulunan hash değerini okuyup John The Ripper yada Hashcat gibi araçlarla hash değerini kırmayı deneyebiliriz.

Dosyayı okuduğumuzda root kullanıcısının şifre hash değerine ulaşıyoruz. $6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0 hash değerini kendi makinemizde hash.txt dosyasının içine ekliyoruz.

Bu işlem sonucunda hashlenmiş şifre değerine ulaşıyoruz: password123

Elde ettiğimiz şifre ile artık root olabiliriz.

Şifre kısmında elde ettiğimiz şifreyi giriyoruz "password123"

Root yetkilerine sahip olduktan sonra diğer yöntemlerle yetki yükseltmek için root yetkisinden exit komutuyla çıkıyoruz.

Yazılabilir /etc/shadow

/etc/shadow dosyası üzerinde okuma ve yazma yetkilerimiz olduğunu görmüştük. Her zaman elde ettiğimiz hash değerini kıramayabiliriz. Bu yüzden var olan hash değerini kendi oluşturacağımız hash değeriyle değiştirebiliriz.

Öncelikle mkpasswd -m sha-512 <newPassword> komutuyla yeni bir hash değeri elde edebiliriz.

Metin editörleriyle birlikte /etc/shadow dosyası açılıp root kullanıcısının sahip olduğu hash değeri değiştirilip kaydedilir. Sonrasında su root yaparak kendi oluşturduğumuz şifreyle root yetkilerine sahip olacağız.

/etc/passwd

/etc/passwd dosyası kullanıcılar hakkında bilgileri barındırır. Yetkisiz bir kullanıcı bu içeriği okuyabilir ama üzerinde yazma yetkisine sahip olmaması lazım. Bizim hedef sistemimizde /etc/passwd dosyası üzerinde ne yetkilerimiz var bakalım.

Dosya üzerinde yazma yetkisine sahibiz. Eski Linux sürümlerinde şifre hashleri /etc/passwd dosyalarında depolanırdı. Bazı sürümlerde hala bu durum geçerlidir.

cat komutuyla /etc/passwd dosyamızı okuyalım ve dosya yapısını görelim.

root kelimesinden sonra gelen x karakteri /etc/passwd dosyasında şifre içermediğini, /etc/shadow dosyasında bu kullanıcı ile ilgili şifre olabilir anlamına geliyor. x değerini silip buraya hashlenmiş şifre değerini eklersek bizim sahip olacağız yeni root şifresi bu olacaktır.

mkpasswd -m sha-512 yavuzkuk55 komutuyla yeni hash değeri oluşturuluyor. /etc/passwd dosyasında bulunan x değeri kaldırılıp elde ettiğimiz hash değeri eklenmiştir.

su root komutu yazdıktan sonra oluşturduğumuz şifre ile sisteme root yetkileriyle giriş yapabiliriz.


sudo

Bazı sitemlerde düşük seviye kullanıcılara bazı uygulamalar üzerinde istisnai root yetkileri verilebilir. Bu root yetkileri düşük izinlere sahip olan kullanıcılara sistem bütününde root yetkisi vermeden uygulamayı root yetkilerine sahipmiş gibi yürütmesinde işe yarar.

Sistem tarafından düşük izinlere sahip kullanıcılara verilen root yetkilerini görmek için sudo -l komutunu kullanacağız.

Yukarıda gördüğümüz uygulamaların/komutların düşük seviye kullanıcıyken bile root yetkisine sahipmişiz gibi çalıştırabiliriz.

Gördüğümüz uygulamaların/komutların bize vermiş olduğu root yetkilerini sömürüp sistem genelinde root yetkilerine sahip olmak için GTFOBins sitesinde bulunan yönergeleri takip edeceğiz.

GTFOBins sitesine giderek yukarıda karşımıza çıkan less komutunu arayacağız. GTFOBins sitesinde çeşitli uygulamalar için çeşitli yetki yükseltme teknikleri bulunmaktadır. Bizim burada aradığımız şey sudo yetkisiyle yetki yükseltme.

Kırmızı kutu içerisinde yazan komutları sırasıyla komut satırında çalıştırıyoruz.

Bu komut sonrasında karşımıza çıkan uzun içeriğin sonuna en son komutumuzu ekliyoruz.

En son komutumuzu ekledikten sonra enter tuşuna basıyoruz ve bizi root kullanıcı yapıyor.

LD_PRELOAD

sudo -l komutu kullandıktan sonra bazı uygulamaların ve komutların GTFOBin sitesinden nasıl sömürüleceğini gördük ama yukarıdaki çıktımızda bulunan apache2 uygulaması sitede bulunmuyor.

Sitede bulunan yöntemlerle apache2 üzerinden yetki yükseltme yapamıyoruz. Bunun yerine farklı bir yöntem izleyeceğiz.

Öncelikle sudo -l çıktısına tekrardan bakıyoruz.

3.satırda LD_PRELOAD ve LD_LIBRARY_PATH değerleini görüyoruz. Bu ifadeleri açıklamak gerekirse:

  • LD_PRELOAD değeri bir uygulama çalıştırılmadan önce sistemde bulunan bir kütüphaneyi zorla yükler.

  • LD_LIBRARY_PATH uygulamanın kullandığı kütüphaneleri aramak için bakacağı ilk dizini vermemize yarar.

Sırasıyla bu konularda örnekler yapacağız.

Öncekikle apache2 uygulamasını çalıştırırken LD_PRELOAD seçeneğiyle kendi oluşturduğumu kütüphaneyi çalıştırmaya zorlayacağız.

Bağlandığımız sistemde /home/user/tools/sudo altında preload.c adında bir dosya bulunmakta.

C kodunu okuduğumuzda çevre değişkeni kaldırılır, kullanıcı kimlik id değerleri değiştirilir ve /bin/bash komutu çalıştırılır. Öncelikle C kodunu derleyip kütüphane haline getirmeliyiz.

Bunun için şu komutu kullanacağız:

Bu komut sonrasında /tmp klasörü altında preload.so adında bir kütüphane dosyası oluşturuldu. apache2 uygulamamızı çalıştırken bu kütüphaneyi yüklemesini sağlamamız lazım.

Bu işlem sonunda root yetkisine sahip oluyorum.

LD_LIBRARY_PATH

Yine apache üzerinden işlem yapacağız. Öncelikle apache2 uygulamasının hangi kütüphanelerini kullandığını öğrenmek için ldd komutunu kullanıyoruz.

/home/user/tools/sudo/ altında bulunan library_path.c dosyasını derleyeceğiz ve çıktı ismine apache2 uygulamasının kullandığı kütüphanelerden birinin ismini vereceğiz.

Örnek olması amacıyla derlenmiş kodun ismini libcrypt.so.1 olarak seçeceğim.

Sonrasında oluşturduğumuz kütüphanenin yolunu uygulama çalıştırılırken veriyoruz.

Cron

Cron dediğimiz yapı işletim sisteminde belirlenmiş zamanlarda ve aralıklarda çalıştırılan scriptler ya da çalıştırılan uygulamalardır.

Sistemde var olan cronları görmek için /etc/crontab dosyasını okuyabiliriz.

overwrite.sh ve /usr/local/bin/compress.sh adında iki tane dosyamız. Öncelikle overwrite.sh dosyası üzerinden root yetkilerine sahip olmaya çalışalım.

Locate komutu ile dosyanın nerede olduğunu öğrenmeye çalışalım ve dosya içeriğini okuyalım.

Dosya üzerinde yazma ve okuma izinlerine sahibiz. Dosya içeriğini değiştirip root yetkisine sahip olmaya çalışacağız.

Bu komutu yazıp kaydettikten sonra kendi sistemimizde netcat ile dinleme yapmamız gerekiyor ve 1 dakika bekledikten sonra root yetkisine sahip oluyoruz.

Cron2

Tekrardan cron dosyaların ve ayarlarına bakalım.

Bu yöntemimizde ise /usr/local/bin/compress.sh dosyasını manipüle edeceğiz. Yukarıdaki çıktıda görüyorsunuz ki PATH değerlerinde /home/user değeri bulunmakta. Herhangi bir dosya çalıştırılacağında PATH değerinde bulunan pathler kontrol edilir. Gördüğümüz üzere /home/user path değeri diğer değerlerden önce bulunuyor. Eğer biz /home/user altında compress.sh adında bir dosya oluştursak /usr/local/bin/compress.sh dosyasının önüne geçer ve zararlı komutları çalıştırmış oluyoruz.

Oluşturacağımız dosyanın içeriğini şu şekilde oluşturuyoruz.

Bundan sonra compress.sh dosyası çalışıcağı zaman /home/user altında bulunan dosya üzerinden çalıacak ve /bin/bash binaryisini /tmp/rootbash olarak kopyalıyor.

/tmp klasörü altında oluşan rootbash dosyasını silmeyi ve root yetkisinden çıkmayı unutmayalım.

Cron3

Sahip olduğumuz /usr/local/bin/compress.sh dosyasına dokunmadan yetki yükselttik peki bu dosya ne iş yapıyor.

Bu komut user dizini altındaki dosyaların hepsini alıp tar ile arşivliyor (zip gibi). Bu konuma yeni bir dosya oluşturacağız ve bu dosyanın çalıştırılmasını sağlayacağız.

Bu komut ile /bin/bash binaryisini /tmp klasörüne bash isminde bir dosya olarak kopyalıyoruz. Bu komutları içere dosyayı da /home/user/ altında runme.sh adıyla oluşturuyoruz.

Bu komuttan sonra iki farklı dosya oluşturmamız gerekiyor. Dosya oluşturmak için touch komutu kullanılıyor. Oluşturacağımız dosyaların isimleri normal dosya isimlerine göre biraz farklı olacak.

Bu oluşturduğumuz dosyalar şu işe yarar, öncelikle --checkpoint=1 bu parametre, bir kontrol noktasının nasıl ve ne zaman ayarlanacağını belirler --checkpoint-action=exec=sh runme.sh bu dosya , programı belirli bir aşamaya geldiğinde otomatik olarak bir komut çalıştırmak için kullanışlıdır.

Bizim örneğimizde 1 dosya yedekledikten sonra oluşturduğumuz zararlı yazılım olan runme.sh dosyasını çalıştıracak ve bu sayede root yetkisine sahip olacağız.

SUID ve SGID

SUID bit ayarlandığında, bir dosya çalıştırıldığında bu dosya, çalıştıran kullanıcının kimliği yerine dosyanın sahibinin kimliği ile çalışır. Bu, kullanıcının sahip olmadığı bazı ayrıcalıklara sahip olabileceği anlamına gelir.

SGID bit ayarlandığında, bir dosya çalıştırıldığında bu dosya, çalıştıran kullanıcının grup kimliği yerine dosyanın grup kimliği ile çalışır. Bu, dosyanın sahibi değil de, dosyanın grubuna atanmış haklar üzerinden çalışmasını sağlar.

Sistemde bulunan SUID ve SGID bitlerine sahip olan uygulamaları bulmak için şu komutu yazmalıyız.

Karşımızı çıkan sonuçlardan bazılarında zafiyet bulunabilir. Örnek senaryomuzda /usr/sbin/exim-4.84.3 uygulamasında zafiyet bulunmakta.

Bu zafiyeti /home/user/tools/suid/exim altında bulunan cve-2016-1531.sh dosyası bizim root yetkilerine sahip olmamız için kullanacağız.

SUID/SGID Shared Object

Sistemde çalışan uygulamalar sistemde bulunan bazı küütphaneleri kullanır. Bu kütüphanleri görmek için strace komutu kullanılır. Bizim burada yapacağımız şey uygulamanın kullandığı kütüphaneleri kontrol edip kendi kütüphanemizi ekleyebiliriz.

Komutuyla sistemde bulunan hangi kütüphanelerin kullanıldığını görebiliyoruz. /usr/local/bin/suid-so dosyası aşşağıdaki dosyaları kullanır.

En altta /home/user/.config/libcalc.so adında bir kütüphaneden bahsediyor. Ama böyle bizim böyle bir dosyamız bulunmuyor. /home/user altında .config diye bir klasör oluşturuyoruz. /home/user/tools/suid/ altında bulunan libcalc.c dosyasını derleyip libcalc.so adıyla kaydetmemiz gerekiyor.

SUID/SGID Path

Bu sefer uygulamaların kullandığı kütüphanelerin mutlak bir yol şeklinde belirtilmemesinden dolayı programları kötüye kullanılabiliriz.

Bu örneğimiz için /usr/local/bin/suid-env uygulamasını kullanacağız.

string /usr/local/bin/suid-env belirtilen dosya içindeki okunabilir karakter dizilerini ekrana yazdırmak için kullanılır.

En alt satırda bulunan service kelimesi /usr/sbin/service bu şekilde belirtilmesi gerekiyordu. Eğer biz service isminde başka bir dosya düzenlersek ve PATH değerine service dosyasının bulunduğu dizin değerini verirsek başarıyla root oluruz.

History & Config Files

Bazı senaryolarda kullanıcılar komut satırında daha öncesinde şifrelerini kullanmış olabilirler. Bizim bu senaryomuzda da bu durum söz konusu.

Ayrıca hedef sistemimizde myvpn.ovpn dosyası var ve bu dosyayı okuyabiliyoruz.

/etcc/oopenvpn/auth.txt dosyasında büyük ihtimalle bağlanırken kullandığımız kullanıcı adı ve şifre bulunuyor.

SSH key

Sistemlere SSH anahtarlarıyla bağlanabiliriz. Bu SSH keyleri kullanıcın /home dosyaları altında gizli dosya olarak bulunur ya da / (kök) altında gizli dosya olarak bulunur.

Öncelikle sistemin / (kök) altında sahip olduğu bütün dosyaları görelim.

/ (kök) altında .ssh adında bir dosya var içinde de root_key adında bir dosya var. Bu dosya sayesinde hedef sisteme root yetkileriyle bağlanabiliriz.

Bu key değerini kendi bilgisayarımıza id_rsa adıyla kayıt ediyoruz. SSH bağlantısı yaparken -i parametresiyle bu dosyayı bildireceğiz ve giriş yapacağız. Yeni bir dosya açıp SSH ile bağlanmaya çalıştığımızda sistem bize hata vericektir. Dosya olarak oluşturduğumuz key değerini herkesin görmemesi gerektiğini söyleyip dosya üzerinde izinleri değiştirmemiz gerekiyor.

Kernel Exploit

Kernel exploit, sistemi kararsız bir durumda bırakabilir; bu nedenle bunları yalnızca son çare olarak çalıştırmalısınız.

Kullandığımız çekirdeğin zafiyetli olup olmadığını öğrenmek için öncelikle hangi çekirdek versiyonunu kullandığımızı öğrenmemiz gerekiyor.

Google'da 2.6.32-5 linux kelimesini arattığımızda karşımıza Dirty Cow adında bir exploit çıkıyor. Exploiti /home/user/tools/kernel-exploits/dirtycow dizini altında c0w.c adıyla bulunuyor.

Komutuyla derledikten sonra ./c0w diyerek çalıştırıyoruz. Komut tamamlandıktan sonra passwd komutuyla root yetkilerine sahip oluyoruz.

Hazır Scriptler

Hedef sistemlerde yaptığımız bu manuel taramaları yazılmış çeşitli otomatik araçlarla yapabiliriz.

Bu yazı Yavuz Kuk tarafından hazırlanmıştır.

Last updated