Yusuf Bilal Batır tarafından yazılmıştır.
Merhaba arkadaşlar, bu yazımızda tryhackme.com sitesinde bulunan “Vulnversity” adlı basit level odayı çözeceğiz. Odamız; keşif, GoBuster aracını kullanarak dizinleri bulma, web sitesine reverse shell yükleme ve yetki yükseltme bölümlerinden ibaret. Haydi hemen başlayalım.
Not: Odaya başlamadan önce TryHackMe ağına bağlanmayı ve makineyi çalıştırmayı unutmayın! Eğer TryHackMe ağına nasıl bağlanılacağını bilmiyorsanız öncelikle OpenVPN odasına bakınız.
Hedef makineden bilgi toplamak için bir ağ tarama aracı olan Nmap’i kullanacağız.
Nmap Cheatsheet
Hemen bir tarama yapalım: nmap -sV
Nmap Results
Yaptığımız taramada -sV parametresi ile makinede çalışan servislerin versiyonlarını tespit etmeyi, -A parametresi ile hedef makinede çalışan işletim sistemini tespit etmeyi, -p- parametresi ile de hedef makinede çalışan tüm portları taramayı belirttik. Son olarak da hedef IP adresi yazdık. Ardından taramayı başlattık. Tarama internet hızına ve bilgisayar performansına göre uzun ya da kısa sürebilir. Şimdi aşağıdaki soruları bu sonuca göre cevaplayacağız.
Gördüğünüz üzere 6 açık portumuz var.
Tarama sonuçlarına baktığımız zaman bu servisin versiyonunun 3.5.12 olduğunu görebiliyoruz.
Nmap kullanırken taranacak portları veya port sayısını kullanırken -p parametresini kullanırız. -p-400 parametresini kullanarak hedefin ilk 400 portunu tarayacağımızı belirtebiliriz.
Nmap’de -n parametresi aracın DNS resolution işlemini atlamasını sağlar. DNS resolution dediğimiz işlem bir arama yaptığımız vakit DNS sunucularının domain name’leri IP adreslerine çevirdiği işlemdir. Nmap’in daha hızlı çalışmasını sağlamak için -n parametresiyle bu işlem atlanır. Nmap’in man page’ine bakarak da cevabı bulabilirsiniz:
Man Page
Man Page Nmap -n
Taramanın sonuçlarında hedef makinede Ubuntu adlı işletim sisteminin çalıştığına dair sonuçları gözlemleyebiliyoruz.
Yine taramanın çıktısında web sunucusunun 3333’üncü portunda çalıştığını görebiliyoruz.
Bu aşamada hedef makinenin 3333’üncü portunda çalışan web sunucusunda bulunan gizli dizinleri keşfedeceğiz. Bu işlemi yaparken GoBuster adlı URI’ları (dizin ve belgeleri) brute force tekniğiyle keşfeden aracı kullanacağız.
Brute force saldırı tekniğini kullanırken elimizde hedef makinede bulunması mümkün dizinlerin adlarını içeren bir wordlist’imiz olması lazım. Bunun için ben Kali Linux’da mevcut olan /usr/share/wordlists/dirb/common.txt konumundaki wordlist’i kullanacağım.
GoBuster Cheatsheet
Haydi o zaman GoBuster’ı çalıştıralım: gobuster dir -u http://<ip>:3333 -w <word list location>
GoBuster results
Bu komutta dir arayacağımız şeyin bir dizin olduğunu ifade etmekte. Ardından gelen -u parametresinden sonra URL’i yazacağımızı belirtiyoruz. URL’i yazarken dikkat etmemiz gereken şey IP adresinden sonra iki nokta ) işaretinden sonra web sunucusunu çalıştıran portu (bu durumda 3333 sayısını) yazmamız. Son olarak da -w ile bilgisayardaki wordlist’in tam yolunu yazıyoruz. Ve aracı çalıştırıyoruz.
Sonuçlarda /internal dizinine gittiğimizde bir yükleme sayfası bizi karşılıyor:
internal
Bir önceki bölümde sitede dosya yükleyebileceğimiz bir dizin bulduk ve bu bölümde buraya bir reverse shell yükleyerek web sunucusuna sızacağız.
Az önce de bahsettiğim gibi asıl amacımız sunucuya bir reverse shell yükleyip sunucuya sızmak olduğu için yükleyeceğimiz dosya türü web sunucusunun çalıştırabileceği bir dosya türü olmalı. PHP uzantısı web alanında oldukça sık kullanıldığı için öncelikle bunu denedim ve sunucunun bunu reddettiğini gözlemledim.
php yükleme ekranı1
php yükleme ekranı2
Bu kısımda oda bizden BurpSuite aracını kullanarak engellenen PHP uzantısını uzantının farklı çeşitleri ile (php3, php4, php5 ve phtml) bypass etmemizi istiyor fakat ben bu kısımda BurpSuite kullanırken bir sıkıntı yaşadım. Araç tüm dosyalar normal bir şekilde karşıya yükleniyor gibi bir sonuç verdi. Bu yüzden ben kendim bir dosya oluşturdum ve az önce bahsettiğim uzantıları kullanarak dosya ismini teker teker değiştirerek dosyayı sunucuya yüklemeyi denedim. Sonunda sadece .phtml uzantılı dosya başarılı bir şekilde yüklendi.
Şimdi sunucuya istediğimiz türde bir dosya yükleyebileceğimizi anladık ve artık sıra sunucuya reverse shell yükleyip bilgisayarımız ve sunucu arasında bir bağlantı oluşturmada.
reverse shell yükleme
execute
6. Bağlantı kuruldu!
Şimdi aşağıda bulunan ekran fotoğrafındaki adımları takip ederek flag’e ulaşıyoruz!
user.txt
Home dizininin altında bill adlı kişi.
Ekran fotoğrafındaki adımları takip edip flag’e ulaşabilirsiniz!
Bu bölümde sızdığımız web sunucusunda yetkilerimizi yükselterek root kullanıcısına erişeceğiz. Bu yetki yükseltme işlemini yaparken SUID adlı Linux’ta bulunan bir çeşit özel izin metodunu kullanacağız.
Linux’ta “read (r veya 4), write (w veya 2) ve execute (x veya 1)” adlı bir kullanıcının bir dosya üzerinde ne tür işlem yapabileceğine dair izinler vardır. Bu izinler chmod veya chown gibi komutlarla yetkili kullanıcı tarafından değiştirilebilir. Linux’ta ekstra olarak bu makinede kullanacağımız SUID izinleri vardır. SUID izinleri bir dosya kullanılırken o dosyayı çalıştıran kullanıcının izinleri yerine bahsi geçen dosya sahibinin izinlerinin geçici olarak kullanılmasını sağlar.
Örnek: Ping komutunu kullanırken bilgisayarın IP paketi göndermek ve uzak bir sunucudan IP paketi alması için bilgisayar soket dosyası ve soket portu açması gerekir. Normal izinlere sahip olan bir kullanıcı bu işlemleri gerçekleştirecek yetkiye sahip değildir. İşte burada bu komuta/dosyaya SUID biti tanımlanır ve herhangi bir kullanıcı bu komutu çalıştırırken root yetkilerine sahip olur böylece işlemleri yapabilir hale gelir.
Not: SUID izninin simgesi “s” ve numarası 4’tür. Bir dosyaya SUID biti tanımlanıp tanımlanmadığını kontrol etmek istersek “ls -l” komutunu kullanabiliriz:
SUID biti tanımlanmadan önce:
ls -l
total 8
-rwxr–r– 1 xyz xyzgroup 148 Dec 22 03:46 file1.txt
SUID biti tanımlanmadan sonra:
ls -l
total 8
-rwsr–r– 1 xyz xyzgroup 148 Dec 22 03:46 file1.txt
Root izinleri kısmında bulunan “execute (x)” izni “SUID (s)” ile değiştirilmiş ise bu dosyaya SUID biti tanımlanmış demektir.
SUID
Kaynak: https://www.linuxnix.com/suid-set-suid-linuxunix/
Şimdi de az önce öğrendiğimiz SUID’yi kullanarak yetkilerimizi yükseltip root kullanıcısına erişeceğiz.
SUID biti tanımlanmış dosyaları bulmak için “find” komutunun “-perm” parametresinden yararlanabiliriz
find komutu hedef sunucu
Olağandışı olan dosyayı bulmak için kendi sistemimde de aynı aratmayı yaptım:
Find komutu kendi pc
Farklı olan dosya /systemctl dosyası.
Bu kısımda privilege escalation konusunda çok iyi bir kaynak olan GTFOBins sitesinden yararlandım. Bu sitede systemctl’e SUID biti tanımlandığı zaman yetkimizi nasıl yükselticeğimize dair bir yazı var ve kullanacağımız kodun nasıl çalıştığına dair bilgi de mevcut. Ben sadece değiştirmemiz gerek birkaç yerden bahsedeceğim.
Burada /bin/bash komutuna SUID biti tanımlamak için ExecStart satırında bulunan “id > /tmp/output” komutu yerine “chmod +s /bin/bash” komutunu yazdık. Ardından komutun sonunda bulunan systemctl’lin hedef makinedeki absolute path’ini yazdık.
Bu komutları elde ettiğimiz düşük yetkili terminalde çalıştırdıktan sonra /bin/bash’in yetkilerine SUID biti tanımlamış olduk. Bunu “ls -l /bin/bash” komutu ile kontrol edebiliriz.
komut copy-paste
ls -l /bin/bash
Terminale “bash -p” komutunu yazdıktan sonra nihayet root yetkisine ulaşmış bulunmaktayız. Artık “/root/root.txt” dosyasını cat komutu ile okuyabiliriz.
root.txt
Evet arkadaşlar odamızın dolayısıyla yazımızın sonuna geldik. Okuduğunuz için teşekkür ederim. Yorumlarınızı bekliyorum. Bir dahaki yazıda görüşmek üzere
[TR] Vulnversity TryHackMe WriteUp
Merhaba arkadaşlar, bu yazımızda tryhackme.com sitesinde bulunan “Vulnversity” adlı basit level odayı çözeceğiz. Odamız; keşif, GoBuster aracını kullanarak dizinleri bulma, web sitesine reverse shell yükleme ve yetki yükseltme bölümlerinden ibaret. Haydi hemen başlayalım.
Not: Odaya başlamadan önce TryHackMe ağına bağlanmayı ve makineyi çalıştırmayı unutmayın! Eğer TryHackMe ağına nasıl bağlanılacağını bilmiyorsanız öncelikle OpenVPN odasına bakınız.
Reconnaissance (Keşif)
Hedef makineden bilgi toplamak için bir ağ tarama aracı olan Nmap’i kullanacağız.
Nmap Cheatsheet
Hemen bir tarama yapalım: nmap -sV
Nmap Results
Yaptığımız taramada -sV parametresi ile makinede çalışan servislerin versiyonlarını tespit etmeyi, -A parametresi ile hedef makinede çalışan işletim sistemini tespit etmeyi, -p- parametresi ile de hedef makinede çalışan tüm portları taramayı belirttik. Son olarak da hedef IP adresi yazdık. Ardından taramayı başlattık. Tarama internet hızına ve bilgisayar performansına göre uzun ya da kısa sürebilir. Şimdi aşağıdaki soruları bu sonuca göre cevaplayacağız.
SORULAR:
Scan the box, how many ports are open? (Hedefi tara, kaç tane port açık?)
Gördüğünüz üzere 6 açık portumuz var.
What version of the squid proxy is running on the machine? (Makinede çalışan squid proxy servisinin versiyonu nedir?)
Tarama sonuçlarına baktığımız zaman bu servisin versiyonunun 3.5.12 olduğunu görebiliyoruz.
How many ports will nmap scan if the flag -p-400 was used? (Eğer -p-400 parametresi kullanılırsa nmap kaç tane port tarar?)
Nmap kullanırken taranacak portları veya port sayısını kullanırken -p parametresini kullanırız. -p-400 parametresini kullanarak hedefin ilk 400 portunu tarayacağımızı belirtebiliriz.
Using the nmap flag -n what will it not resolve? (Eğer -n parametresi kullanılırsa neyin çözümlenmesi gerçekleşmeyecek?)
Nmap’de -n parametresi aracın DNS resolution işlemini atlamasını sağlar. DNS resolution dediğimiz işlem bir arama yaptığımız vakit DNS sunucularının domain name’leri IP adreslerine çevirdiği işlemdir. Nmap’in daha hızlı çalışmasını sağlamak için -n parametresiyle bu işlem atlanır. Nmap’in man page’ine bakarak da cevabı bulabilirsiniz:
Man Page
Man Page Nmap -n
What is the most likely operating system this machine is running? (Makinede çalışan işletim sistemi yüksek ihtimalle hangi işletim sistemidir?
Taramanın sonuçlarında hedef makinede Ubuntu adlı işletim sisteminin çalıştığına dair sonuçları gözlemleyebiliyoruz.
What port is the web server running on? (Web sunucusu kaçıncı portta çalışıyor?)
Yine taramanın çıktısında web sunucusunun 3333’üncü portunda çalıştığını görebiliyoruz.
Locating directories using GoBuster (GoBuster aracını kullanarak dizinleri bulma)
Bu aşamada hedef makinenin 3333’üncü portunda çalışan web sunucusunda bulunan gizli dizinleri keşfedeceğiz. Bu işlemi yaparken GoBuster adlı URI’ları (dizin ve belgeleri) brute force tekniğiyle keşfeden aracı kullanacağız.
Brute force saldırı tekniğini kullanırken elimizde hedef makinede bulunması mümkün dizinlerin adlarını içeren bir wordlist’imiz olması lazım. Bunun için ben Kali Linux’da mevcut olan /usr/share/wordlists/dirb/common.txt konumundaki wordlist’i kullanacağım.
GoBuster Cheatsheet
Haydi o zaman GoBuster’ı çalıştıralım: gobuster dir -u http://<ip>:3333 -w <word list location>
GoBuster results
Bu komutta dir arayacağımız şeyin bir dizin olduğunu ifade etmekte. Ardından gelen -u parametresinden sonra URL’i yazacağımızı belirtiyoruz. URL’i yazarken dikkat etmemiz gereken şey IP adresinden sonra iki nokta ) işaretinden sonra web sunucusunu çalıştıran portu (bu durumda 3333 sayısını) yazmamız. Son olarak da -w ile bilgisayardaki wordlist’in tam yolunu yazıyoruz. Ve aracı çalıştırıyoruz.
Sonuçlarda /internal dizinine gittiğimizde bir yükleme sayfası bizi karşılıyor:
internal
Compromise the web server (Web sunucusunu ele geçirme)
Bir önceki bölümde sitede dosya yükleyebileceğimiz bir dizin bulduk ve bu bölümde buraya bir reverse shell yükleyerek web sunucusuna sızacağız.
SORULAR:
Try upload a few file types to the server, what common extension seems to be blocked? (Sunucuya birkaç dosya tipi yüklemeyi deneyin, hangi tip uzantılar engellenmiş?)
Az önce de bahsettiğim gibi asıl amacımız sunucuya bir reverse shell yükleyip sunucuya sızmak olduğu için yükleyeceğimiz dosya türü web sunucusunun çalıştırabileceği bir dosya türü olmalı. PHP uzantısı web alanında oldukça sık kullanıldığı için öncelikle bunu denedim ve sunucunun bunu reddettiğini gözlemledim.
php yükleme ekranı1
php yükleme ekranı2
Run this attack, what extension is allowed? (Atağı çalıştır, hangi uzantı engellenmeden yüklendi?)
Bu kısımda oda bizden BurpSuite aracını kullanarak engellenen PHP uzantısını uzantının farklı çeşitleri ile (php3, php4, php5 ve phtml) bypass etmemizi istiyor fakat ben bu kısımda BurpSuite kullanırken bir sıkıntı yaşadım. Araç tüm dosyalar normal bir şekilde karşıya yükleniyor gibi bir sonuç verdi. Bu yüzden ben kendim bir dosya oluşturdum ve az önce bahsettiğim uzantıları kullanarak dosya ismini teker teker değiştirerek dosyayı sunucuya yüklemeyi denedim. Sonunda sadece .phtml uzantılı dosya başarılı bir şekilde yüklendi.
Şimdi sunucuya istediğimiz türde bir dosya yükleyebileceğimizi anladık ve artık sıra sunucuya reverse shell yükleyip bilgisayarımız ve sunucu arasında bir bağlantı oluşturmada.
- Bu linkteki shell’i indirin.
- Resimdeki gibi dosyanızı editleyin.
reverse shell edit- Dosyanın adını “php-reverse-shell.phtml” yapın.
- Sunucudan gelen isteği dinlemek için netcat aracını çalıştıracağız. nc -lvnp 1234 komutunu çalıştırın.
nc - Dosyayı yükleyin ve http://<ip>:3333/internal/uploads/ adresine gidin ve php-reverse-shell.phtml dosyasının üstüne tıklayın. Bu reverse shell’i çalıştıracak.
reverse shell yükleme
execute
6. Bağlantı kuruldu!
Şimdi aşağıda bulunan ekran fotoğrafındaki adımları takip ederek flag’e ulaşıyoruz!
user.txt
What is the name of the user who manages the web server? (Web sunucusunu yöneten kullanıcının adı nedir?)
Home dizininin altında bill adlı kişi.
What is the user flag?
Ekran fotoğrafındaki adımları takip edip flag’e ulaşabilirsiniz!
Privilege Escalation (Yetki Yükseltme)
Bu bölümde sızdığımız web sunucusunda yetkilerimizi yükselterek root kullanıcısına erişeceğiz. Bu yetki yükseltme işlemini yaparken SUID adlı Linux’ta bulunan bir çeşit özel izin metodunu kullanacağız.
SUID Nedir?
Linux’ta “read (r veya 4), write (w veya 2) ve execute (x veya 1)” adlı bir kullanıcının bir dosya üzerinde ne tür işlem yapabileceğine dair izinler vardır. Bu izinler chmod veya chown gibi komutlarla yetkili kullanıcı tarafından değiştirilebilir. Linux’ta ekstra olarak bu makinede kullanacağımız SUID izinleri vardır. SUID izinleri bir dosya kullanılırken o dosyayı çalıştıran kullanıcının izinleri yerine bahsi geçen dosya sahibinin izinlerinin geçici olarak kullanılmasını sağlar.
Örnek: Ping komutunu kullanırken bilgisayarın IP paketi göndermek ve uzak bir sunucudan IP paketi alması için bilgisayar soket dosyası ve soket portu açması gerekir. Normal izinlere sahip olan bir kullanıcı bu işlemleri gerçekleştirecek yetkiye sahip değildir. İşte burada bu komuta/dosyaya SUID biti tanımlanır ve herhangi bir kullanıcı bu komutu çalıştırırken root yetkilerine sahip olur böylece işlemleri yapabilir hale gelir.
Not: SUID izninin simgesi “s” ve numarası 4’tür. Bir dosyaya SUID biti tanımlanıp tanımlanmadığını kontrol etmek istersek “ls -l” komutunu kullanabiliriz:
SUID biti tanımlanmadan önce:
ls -l
total 8
-rwxr–r– 1 xyz xyzgroup 148 Dec 22 03:46 file1.txt
SUID biti tanımlanmadan sonra:
ls -l
total 8
-rwsr–r– 1 xyz xyzgroup 148 Dec 22 03:46 file1.txt
Root izinleri kısmında bulunan “execute (x)” izni “SUID (s)” ile değiştirilmiş ise bu dosyaya SUID biti tanımlanmış demektir.
SUID
Kaynak: https://www.linuxnix.com/suid-set-suid-linuxunix/
Yetki yükseltme
Şimdi de az önce öğrendiğimiz SUID’yi kullanarak yetkilerimizi yükseltip root kullanıcısına erişeceğiz.
On the system, search for all SUID files. What file stands out? (Hedef bilgisayarda SUID biti tanımlanmış dosyaları ve bunlar arasında göze çarpan dosyayı bulun)
SUID biti tanımlanmış dosyaları bulmak için “find” komutunun “-perm” parametresinden yararlanabiliriz
find komutu hedef sunucu
Olağandışı olan dosyayı bulmak için kendi sistemimde de aynı aratmayı yaptım:
Find komutu kendi pc
Farklı olan dosya /systemctl dosyası.
Become root and get the last flag (/root/root.txt) (Root ol ve son flag’i ele geçir):
Bu kısımda privilege escalation konusunda çok iyi bir kaynak olan GTFOBins sitesinden yararlandım. Bu sitede systemctl’e SUID biti tanımlandığı zaman yetkimizi nasıl yükselticeğimize dair bir yazı var ve kullanacağımız kodun nasıl çalıştığına dair bilgi de mevcut. Ben sadece değiştirmemiz gerek birkaç yerden bahsedeceğim.
Sitedeki kod:
TF=$(mktemp).service
echo ‘[Service]
Type=oneshot
ExecStart=/bin/sh -c “id > /tmp/output”
[Install]
WantedBy=multi-user.target’ > $TF
./systemctl link $TF
./systemctl enable –now $TF
Değişiklerden sonra kod:
TF=$(mktemp).service
echo ‘[Service]
Type=oneshot
ExecStart=/bin/sh -c “chmod +s /bin/bash”
[Install]
WantedBy=multi-user.target’ > $TF
/bin/systemctl link $TF
/bin/systemctl enable –now $TF
Burada /bin/bash komutuna SUID biti tanımlamak için ExecStart satırında bulunan “id > /tmp/output” komutu yerine “chmod +s /bin/bash” komutunu yazdık. Ardından komutun sonunda bulunan systemctl’lin hedef makinedeki absolute path’ini yazdık.
Bu komutları elde ettiğimiz düşük yetkili terminalde çalıştırdıktan sonra /bin/bash’in yetkilerine SUID biti tanımlamış olduk. Bunu “ls -l /bin/bash” komutu ile kontrol edebiliriz.
komut copy-paste
ls -l /bin/bash
Terminale “bash -p” komutunu yazdıktan sonra nihayet root yetkisine ulaşmış bulunmaktayız. Artık “/root/root.txt” dosyasını cat komutu ile okuyabiliriz.
root.txt
SON
Evet arkadaşlar odamızın dolayısıyla yazımızın sonuna geldik. Okuduğunuz için teşekkür ederim. Yorumlarınızı bekliyorum. Bir dahaki yazıda görüşmek üzere
Moderatör tarafında düzenlendi: