[COLOR="LemonChiffonMerhaba arkadaşlar,
vsFTPdnin 2.3.4 versiyonunda bulunan command execution açığı ile ilgili bir çok videoya, anlatıma basit bir Google araması ile ulaşabilirsiniz.
Bu konuda, bu açığı sömüren bir program yazmaya çalışacağız, her ne kadar asıl mesele açığı keşfetmek olsa da.
Métasploit için yazılmış modül: [url]https://github.com/rapid7[/url]
GitHub: [url]https://github.com/blackvkng/vsFTPd-v2.3.4-Exploit[/url]
Bu yazıyı, bir nevi [URL="https://tik.lat/fiSLQ"] şuranın[/URL] çevirisi olarak görebilirsiniz.
En başta, gerekli gördüğümüz modülleri içeri aktarıyoruz. Kullanmak üzere içeri aktardığımız en önemli modül, "socket" modülü. Bu modül ile hedefe bağlanacağız.
Kullanıcıya scripti nasıl kullanabileceğini göstermek için, "usage" fonksiyonunu yazdık. Buna göre, programa verilen ilk argüman "hedef" ikincisi ise "port" değişkenleri olacak.
Bu fonksiyon, önemli bir fonksiyon. Önce, oluşturduğumuz "check" adındaki soket objesi ile verilen hedefe, verilen port üzerinden bağlanmaya çalışıyor. Bağlanırsa, bağlandığını belirtip diğer işlemlere devam ediyor. Eğer bağlanamazsa, bunu belirtip, direk "False" değerini döndürüp fonksiyonu bitiriyor.
Bağlanabildiği senaryo üzerinden devam edelim. Bağlandığımıza göre, önce serverdan gelen ilk cevabı "banner" değişkenine atıyoruz, genelde bu gelen değer, port üzerinde çalışan servis ile alakalı bilgi verir, ki vsFTPd servisinde bu böyle. Bu değeri ekrana yazdırdıktan sonra, bir if sorgusu çalıştırıyoruz. Bu sorguda, gelen değer içinde, "vsFTPd 2.3.4" olup olmadığını kontrol ediyoruz. Eğer yoksa, direk "False" değerini döndürüp fonksiyonu bitiriyor.
Diyelim ki, banner değişkeninde "vsFTPd 2.3.4" bulunuyor, hemen servere rastgele bir username ve password değeri gönderiyoruz. Ardından, oluşturduğumuz soket objesini kapatıyoruz ve "True" değerini döndürtüp fonksiyonu bitiriyoruz.
Bu fonksiyon, programda çalışacak olan ilk fonksiyon. İlk olarak, "target" ve "port" değişkenlerini "sys.argv" listesinden alıyor. Eğer bir sorun ile karşılaşırsa, kullanımı yazdırıp programı kapatıyor.
Sonrasında gelen if bloğunda, eğer fonksiyonun döndürdüğü değer "True" değilse programdan çıkmasını sağlıyor. Az önce yukarıda anlattığım fonksiyon bu.
Şimdi "shellSocket" adında yeni bir socket nesnesi oluşturduk, shelle bağlanmak için kullanacağız. Bir sonraki satırda bulunan, "shell" değişkeni gereksiz bir değişken. Silmeyi unutmuşum
Oluşturdğumuz "shellSocket" nesnesi ile hedefe 6200. port üzerinden bağlanıyoruz, bu port üzerinden veri aktarımı olacak. Eğer bir hata oluşmazsa, artık komut girmeye başlayabiliriz. Program, çalıştırılmak istenen komut "exit" olmadıkça verilen komutu servere gönderiyor ve geri dönütü ekrana yazdırıyor.
Dikkat ederseniz, bağlantı sağlandıktan hemen sonra böyle bir satır var "shellSocket.settimeout(3)", bunun önemi çok büyük. Serverin geri dönüş yapması için en fazla 3 saniye beklemesini sağlıyor programın. Diyelim ki, siz herhangi bir çıktısı olmayacak bir komut gönderdiniz servera(cd, mv, ...), eğer bir çıktı olmazsa, program normalde bağlantı kopana kadar serverdan dönüt bekler. Bir kere dizin değiştirdiniz mi bir daha komut çalıştıramazsınız, eğer bu 3 saniye sınırı olmasaydı.
Artık hazır, hemen test edelim,
Başarılı bir şekilde çalıştı. Okuduğunuz için teşekkür ederim, bir yanlışım olduysa özür dilerim.[/COLOR]
vsFTPdnin 2.3.4 versiyonunda bulunan command execution açığı ile ilgili bir çok videoya, anlatıma basit bir Google araması ile ulaşabilirsiniz.
Bu konuda, bu açığı sömüren bir program yazmaya çalışacağız, her ne kadar asıl mesele açığı keşfetmek olsa da.
Métasploit için yazılmış modül: [url]https://github.com/rapid7[/url]
GitHub: [url]https://github.com/blackvkng/vsFTPd-v2.3.4-Exploit[/url]
Bu yazıyı, bir nevi [URL="https://tik.lat/fiSLQ"] şuranın[/URL] çevirisi olarak görebilirsiniz.
En başta, gerekli gördüğümüz modülleri içeri aktarıyoruz. Kullanmak üzere içeri aktardığımız en önemli modül, "socket" modülü. Bu modül ile hedefe bağlanacağız.
Kullanıcıya scripti nasıl kullanabileceğini göstermek için, "usage" fonksiyonunu yazdık. Buna göre, programa verilen ilk argüman "hedef" ikincisi ise "port" değişkenleri olacak.
Bu fonksiyon, önemli bir fonksiyon. Önce, oluşturduğumuz "check" adındaki soket objesi ile verilen hedefe, verilen port üzerinden bağlanmaya çalışıyor. Bağlanırsa, bağlandığını belirtip diğer işlemlere devam ediyor. Eğer bağlanamazsa, bunu belirtip, direk "False" değerini döndürüp fonksiyonu bitiriyor.
Bağlanabildiği senaryo üzerinden devam edelim. Bağlandığımıza göre, önce serverdan gelen ilk cevabı "banner" değişkenine atıyoruz, genelde bu gelen değer, port üzerinde çalışan servis ile alakalı bilgi verir, ki vsFTPd servisinde bu böyle. Bu değeri ekrana yazdırdıktan sonra, bir if sorgusu çalıştırıyoruz. Bu sorguda, gelen değer içinde, "vsFTPd 2.3.4" olup olmadığını kontrol ediyoruz. Eğer yoksa, direk "False" değerini döndürüp fonksiyonu bitiriyor.
Diyelim ki, banner değişkeninde "vsFTPd 2.3.4" bulunuyor, hemen servere rastgele bir username ve password değeri gönderiyoruz. Ardından, oluşturduğumuz soket objesini kapatıyoruz ve "True" değerini döndürtüp fonksiyonu bitiriyoruz.
Bu fonksiyon, programda çalışacak olan ilk fonksiyon. İlk olarak, "target" ve "port" değişkenlerini "sys.argv" listesinden alıyor. Eğer bir sorun ile karşılaşırsa, kullanımı yazdırıp programı kapatıyor.
Sonrasında gelen if bloğunda, eğer fonksiyonun döndürdüğü değer "True" değilse programdan çıkmasını sağlıyor. Az önce yukarıda anlattığım fonksiyon bu.
Şimdi "shellSocket" adında yeni bir socket nesnesi oluşturduk, shelle bağlanmak için kullanacağız. Bir sonraki satırda bulunan, "shell" değişkeni gereksiz bir değişken. Silmeyi unutmuşum
Oluşturdğumuz "shellSocket" nesnesi ile hedefe 6200. port üzerinden bağlanıyoruz, bu port üzerinden veri aktarımı olacak. Eğer bir hata oluşmazsa, artık komut girmeye başlayabiliriz. Program, çalıştırılmak istenen komut "exit" olmadıkça verilen komutu servere gönderiyor ve geri dönütü ekrana yazdırıyor.
Dikkat ederseniz, bağlantı sağlandıktan hemen sonra böyle bir satır var "shellSocket.settimeout(3)", bunun önemi çok büyük. Serverin geri dönüş yapması için en fazla 3 saniye beklemesini sağlıyor programın. Diyelim ki, siz herhangi bir çıktısı olmayacak bir komut gönderdiniz servera(cd, mv, ...), eğer bir çıktı olmazsa, program normalde bağlantı kopana kadar serverdan dönüt bekler. Bir kere dizin değiştirdiniz mi bir daha komut çalıştıramazsınız, eğer bu 3 saniye sınırı olmasaydı.
Artık hazır, hemen test edelim,
Başarılı bir şekilde çalıştı. Okuduğunuz için teşekkür ederim, bir yanlışım olduysa özür dilerim.[/COLOR]



