Metasploit | Metasploit Mimarisi ve Yapı Taşları

Merhaba

Metapsloit ile Modüle Geliştirme” isimli blog serisinin ikinci yazısı olan bu yazıda “Neden ruby ?” sorusu ile başlayıp Metasploit’in mimarisini ve yapı taşlarını ele alacağız. Eğer yazı serisine yeni başlıyorsaniz serinin ilk yazısı olan Metasploit | Geliştirme Ortamının Kurulması bölümünü okumanızı şiddetle tavsiye ederim. Zira ileriki yazılarda ele alınacak konular ve uygulamalar bu yazıda yapılan işlemler üzerinden devam edecektir.

Güzel bir soru: Neden Ruby ?

Bildiğiniz üzere Metasploit çatısı Ruby programlama dili ile geliştirilmiştir. Eminim bu yazıyı okuyan bir çok kişi aynı soruyu kendisine sormuştur; “Neden Ruby ? Özellikle Python gibi bir programlama dili varken neden Ruby ?”  bu soruyu soran ilk ve son kişi olmadığınızı belirtmek isterim. Çünkü aynı soru bir çok kere metasploit ekibine yöneltildi.Sonuç olarakta metasploit ekibi, aşağıda özetlediğim nedenlerden ötürü Ruby dilini seçtiklerini belirtti.

1 – Ehl-i keyfe, keyif verir kahvenin kaynaması

Metasploit’in Ruby ile yazılmasında ki en büyük etken, ekibin Ruby ile kod yazmaktan zevk alıyor olması. Profesyonel açıdan bakıldığında ( her ne kadar şu anda işlerini son derece profesyonel olarak yapıyor olsalarda ) bu yaklaşım biraz rahatsız edici olsada, aslında insanın kendisini en rahat hissettiği platformu kullanması son derece mantıklı. “Biz Ruby biliyoruz ve seviyoruz, bu nedenlede Ruby kullanarak bu işi yapacağız” demelerine son derece saygıyla bakıyorum.

2 – Indentation

Python programlama dili indentation adı verilen “girinti” sistemini kullanmaktadır. Bu özellik Metasploit ekibinin sevmediği bir şey(miş). Bunun yanı sıra python’un ana sınıf kurucu fonksiyonları ile olan ilişkileri ve geri dönük interpreter destepi ile ilgili Metasploit ekibinin şüphelerinin olmasıda önemli bir etken.

3 – C++

Metasploit ekibinin ciddi olarak değerlendirdiği bir diğer programlama dili ise C++ olmuş. Burada da compiler bir dil olan C++’ın Metasploit gibi bir proje için teşkil ettiği problemler öngörülmüş. Platform bağımsız bir derleme işlemi ve hatta derlemenin kendisi Metasploit ekibi tarafından değerlendirilmiş olan dezavantajlar.

Sonuç olarak Ruby interpreter bir dil, indentation özelliği yok, sınıf mimarisi ve kullanımı daha esnek ve Metasploit ekibinin en tecrübeli olduğu programlama dili olduğu için tercih edilinerek projeye start alınmış.

Metasploit’in Mimarisi

Metasploit en başından beri olabildiğince modüler bir proje olarak kodlanmıştır. Bu sayede DRY ( don’t repeat yourself )  ilkesine mümkün mertebe en fazla şekilde sadık kalınmış. Bu modüler mimari neticesinde Rex, Core gibi bir çok yapı kullanılarak metasploit için belli başlı yapı taşları oluşturulmuştur.

Bu yapı taşlarını temel düzeyde anlamak, ileride geliştirmek isteyeceğimiz herhangi bir X modülü için nasıl bir yaklaşım izlememiz gerektiğine karar vermemiz adına önemlidir.

Rex

Rex yani Ruby Extension Library metasploit’in en önemli parçalarından bir tanesidir. Rex kütüphaneleri, default Ruby haricinde hiçbir şeye bağımlılığı olmadan çalışan kütüphanelerdir. Rex  kütüphaneleri ile protokoller, loglama sistemleri, exploitation sınıfları ve benzer ihtiyaçlar karşılanabilir. Daha öncede belirttiğim gibi en önemli özelliği Ruby’nin kendisi hariç hiçbir ek paket/sınıf ihtiyacı olmadan çalışabilen yapılardır ve metasploit projesinin içerisinde git submodül’ü olarak tanımlanır.

Örneğin https://github.com/rapid7/rex/tree/master/lib/rex/proto adresinde REX ile tanımlanmış protokoller bulunmaktadır. Örnek olarak Samba protokolü bağlantı gerçekleştirip username,password ikilisini göndererek giriş yapmak istediğinizde aşağıdaki gibi ufak bir kod yazabilirsiniz.

#!/usr/bin/env ruby

#Jacob Hammack
#Jacob.Hammack@hammackj.com
#An Example for connecting to a Windows Share.

require 'rubygems'
require 'rex'

host = ARGV[0]
username = ARGV[1]
password = ARGV[2]
#hostname is interesting, new windows require the actual hostname of the box 
#to connect so this may not work on 7
hostname = "*SMBSERVER" 
domain = ""

begin
	sock = Rex::Socket::Tcp.create('PeerHost' => host, 'PeerPort' => 139)
	smb = Rex::Proto::SMB::SimpleClient.new(sock)

	puts "[*] Logging in to #{host}"
	smb.login(hostname, username, password, domain)
	smb.connect("Admin$")
		
	if smb.client.auth_user
		puts "[*] Connected to Admin$"
	else
		puts "[!] Unable to Connect to Admin$"
	end
	
	sock.close
rescue Exception => e
	puts "#{e.message}\n#{e.backtrace}\n\n"

Burada ki 19,20 ve 23,24. satırlara baktığınızda SMB protokolünü tanımlayan REX modülü çağırılarak kullanılmıştır.

Metasploit Core

Metasploit framework’ü daha öncede belirttiğim üzere modüler bir mimariye sahiptir. Bu mimarinin en ufak yapı taşı Metasploit Core ‘dur. Temel amacı exploit, session, plugins gibi modüller için interface oluşturmaktır. https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core.rb adresine göz gezdirerek tanımlanmış Metasploit Core yapılarını görebilirsiniz

Metasploit Base

Metasploit Core kütüphanelerinin extend edilmesiyle Metasploit Base yapıları oluşmaktadır. Metasploit Base sınıfları ile basit rutinler ve belli başlı bakış açılarındaki ihtiyaçlar giderilebilir. Örneğin serializer modülüne bakarsak ifade etmek istediğim şeyi çok daha net anlayabilirsiniz. https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/base/serializer/readable_text.rb readable_text.rb dosyasındaki kodlara baktığınızda herhangi bir exploitation veya “güvenlik testi” ile ilgili kodlardan ziyade, console plain-text olarak basılacak yazıların formatını belirlemek adına kullanılmaktadır.

UI

En sonunda ise Metasploit Base‘in extend edilmesiyle UI oluşmaktadır. Metasploit UI yapısı komut satırı veya web arayüzü gibi farklı kullanım platformları için kullanılmaktadır.

Örneğin metasploit’i her başlattığımızda karşımıza farklı bir banner gelmektedir. Aynı zamanda msfconsole komut satırında banner komutunu vererekte farklı bir banneri ekrana yazdırabilirsiniz. Bu işlemden sorumlu kod kısmı Metasploit UI sınıfı içerisinde bulunur. Bu sınıfın kaynak kodlarına baktığımızda ( https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/ui/banner.rb ) görmekteyiz ki logos_directory path’ine gidip dosya içeriği okumaktadır. Pekii logos_directory’nin tanımlandığı yer size neresidir ? Tabikide Metasploit Base.  UI yapısı Metasploit Base’i extend ettiğini belirtmiştim. https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/base/config.rb

Metasploit Modül

Modüller adını sıkça duyduğumuz ve kullandığımız exploit, encoder, payload, NOP generator veya auxiliary’e ihtiva eder. Gene örnek üzerinden anlatmak gerekirse, en çok bilinen zafiyetlerden birisi olan ms08-67 için metasploit içerisinde bir adet modül bulunmaktadır. Bu modül Smb ve RPC yapılarını kullanarak hedef sisteme saldırı düzenlemektedir. Bahsi geçen bu yapılar daha önce belirttiğim ve Metasploit katılım sisteminin en tepesinde bulunana REX’e kadar uzanmaktadır. Yani şöyle ki ms08-67 exploit modülü, metasploit tarafından sağlanan ve Metasploit Core’da bulunan Exploit::Remote::SMB modülünü kullanmatakdır. Bu modül ise daha önce belirttiğim REX yapısından SAMBA Rex’ini kullanmaktadır.

Katılım Ağacı

Tüm bu anlattıklarımı özetlemek gerekirse aşağıdaki gibi bir chart oluşturmaktadır.

msf-kalilitim-agaci

Peki biz neresindeyiz bu chart’ın ? diye sorarsanız, cevap genellikle en alttaki modül kısmıdır. Saldırı gerçekleştirilebilecek uygulamaların hemen hemen hepsinin kullandığı ( tamamının değil ) protokoller zaten Metasploit içerisinde bulunmaktadır. Örneğin bir web uygulaması için modül geliştirmek istiyorsak, zaten hali hazırda metasploit içerisinde bulunan  HTTP kütüphanesi kullanılabilir. Veya TCP üzerinden çalışan bir sunucu servisi için modül geliştirmek istiyorsak zaten hali hazırda bulunan TCP modülünü kullanabiliyoruz. Bu nedenle çok nadir durumlar hariç metasploit’in sunduğu REX ve Base modüller bizim isteyeceğimiz her şey için yeterli olacaktır. Bu nedenle genellikle modül geliştirme noktasında olacağımızı şimdiden belirtmekte fayda var.