Post by Pesimistyle on Oct 18, 2017 18:07:46 GMT
Merhabalar bu makalede forumda eksik olduğunu gördüğüm konulardan birine değineceğim. Elbette çoğunuz NMAP’i duymuşsunuzdur, kullanmışsınızdır da lakin foruma aktarılanı bunun çok sığ bir kısmı. Ben bu sığ kısımlardan biraz açılmaya çalışacağım. Tabi işin esas kısmı mantığı. Pek çoğumuz bu toolu kullanıyor fakat arkasında yatan mantığı bilmiyor. Mantığını bilmediğiniz bir tool’u kullanmanın size tam anlamıyla bir fayda sağlıyacağını da şahsen düşünmüyorum. Konunun ilk kısımları size sıkıcı gelebilir, anlarım çünkü millet olarak işlerin temel -mantık- kısmıyla pek ilgilenmez direkt sonuç odaklı ilerleriz lakin ilerde “Siber Güvenlik” sektöründe çalışmak istiyorsanız meslek hayatınızda izole edilmiş durumlarda kalabilirsiniz. Mishal NMAP kullanamıyorsunuzdur, olayın mantığını bildiğinizden kendiniz bir tane NMAP yazarsınız. Merak etmeyin böyle dedim diye bir örnek vermeden geçmiyeceğim. Bir arkadaşımla beraber yazdığımız NMAP’in kabaca bir versiyonunu konunun ilerleyen kısımlarında paylaşacağım.
Peki biz bu konuda nelere değineceğiz? Şöyle kabaca bir haritasını önceden çıkaralım:
-NMAP çalışma mantığı
-El yapımı NMAP
-NMAP’in çeşitli parametreleri ve özellikleri
-NMAP ile gizlenerek bilgi toplama
İsteyen arkadaşlar birazdan anlatacağım ilk iki kısmı(Mantık ve El yapımı NMAP) atlayabilir. Ya ben mantık kısmını atlıyayım el yapımına da bakayım derseniz olmaz çünkü mantığını bilmeden yazılan kodları zaten anlamazsınız. Programlama bilginiz varsa kodları okuyabilirsiniz lakin olayların neden böyle ilerlediğini, ne olursa ne olacağını anlayamazsınız. İsteyenler direkt “parametreler” kısmından başlayabilir. Şimdi daha fazla vakit kaybetmeden işin elden geldikçe mantık kavramına değinelim.
1)NMAP’in Çalışma Mantığı:
NMAP’in çalışma mantığı kabaca TCP, UDP, ARP, ICMP’ye dayanır. “Genel olarak” NMAP’in kullanış şeklinde aslında TCP bazlıdır. Eğer aşağıda vereceğim parametrelerden faydalanıpta UDP taramasıda yaparsınız o zaman işin için UDP ve ICMP girer. Dilersiniz bu protokollere ve bunları NMAP’in nasıl kullandığına değinelim.
TCP:
Transmission Control Protocol olarak geçer. İki veya daha fazla cihazın haberleşmesi için kullanılan en yaygın protokollerden biridir. Aslında TCP/IP olarak entegre şekilde kullanılırlar. İki bilgisayar arasındaki iletişimin başlaması için gerekli protokollerden biridir. İki bilgisayar iletişime başlamadan önce nasıl insanlar tanışıyor selamlaşıyorsa bilgisayarlarda tanışıp selamlaşırlar. Buna Three way handshake=Üçlü el sıkışma denir. Bunu kabaca şu şekilde düşünebilirsiniz:
-Merhaba ben ‘Taipan
+Merhaba ben de hedef
-Tanıştığıma memnun oldum
Tabi bu tam olarak olayımızı karşılamıyor lakin ben hiç bilgisi olmayan arkadaşların anlaması için bu olayı en basit şekle indirgemeye çalıştım. Peki bunu bilgisayarlar nasıl yaparlar. İstemci hedef makine’ye içinde SYN bayrağı taşıyan bir paket yollar. Karşı tarafta port açıksa SYNACK bağrağı içeren bir paket yollar. İstemci de bunun kendisine ulaştığına dair ACK bayrağı içeren bir cevap paketi yollar ve böylelikle iletişim başlamış olur. Bu paketlerin tanınması, aynı anda birden fazla paket gelirse öncelik tanınması için içlerinde bulunan seq ve ack değerleri vardır. İstemcinin yolladığı SYN bayraklı pakette bir seq değeri bulunur ack bölümü ise boştur. Kaynak gelen paketteki sec değerini kendi ack değerine bir arttırarak ekler ve kendine özgü bir sec değeri ekleyerek SYNACK bayraklı paketi yollar. İstemci ise gelen bu paketin sec değerini kendi ack değerine +1 leyerek ekler ve yine kendine özgü bir sec değeri oluşturup (bu değer 0 dır)ACK bayraklı paketi yollar.
Anlatımın ikinci kısmı kafanızı karıştırmış olabilir. Bunu şu şekilde tablolaştırıp birde görselle özetliyeyim:
....................SEC....................ACK
SYN:..............x........................-(0)
.SYNACK:.......y.......................x+1
.ACK:..............z(0)..................y+1
Peki bu bizim ne gibi işimize yarıyacak? NMAP’in TCP portları açık mı kapalı mı diye tarama mantığı işte buna dayanır. Peki bunu nasıl belirler? Hedefe paketler yollıyarak yapar. Bunu sizde Piton kütüphanesi olan scapy ile kolaylıkla yapabilirsiniz. Ben size olasılıkları yazayım:
-->Karşıya port açıkken sin dışı bir şey yollanırsa; rst döner.
-->Karşıya port açıkken fin yollanırsa; rst döner.
-->Karşıya port açıkken rst yollanırsa; bir şey göndermez
-->Karşıya port kapalıyken sin yollanırsa; karşı taraf reset döner.
-->Karşıya port kapalıyken ack yollanırsa; rst döner.
-->Karşıya port kapalıyken fin yollarsak, finack döner.
-->Kapalı port’a rst yollarsak; cevap yollamaz
-->Rst haricinde bir flag yollarda drop alırsak Firewall varlığını anlarız. Port açıkken ve servis varken syn yollayıp cevap olarak ICMP alırsak firewall varlığı gözükür.
Arkadaşlar eğer karşıya yolladığınız bir pakete hedef olağan dışı bir cevap dönüyorsa yani normalde dönmemesi gereken(açıkta olsa kapalı da olsa) bir cevap dönüyorsa orada Firewall vardır. Firewall tespitini de yukarıda ki gibi yapabiliriz. Bunu da ayak üstü göstermiş olalım. NMAP’te işte dönen bu cevaplara göre port’un açık, kapalı veya filtreli olduğunu size söyler. Mantığı budur.
ARP:
ARP OSI’nın ikinci katmanında(kimileri 3 de diyor karışık burası biraz lakin bence de 2. katmanda) bulunan bir protokoldür. Adres çözümleme protokolü olarak geçer. TCP’deki selamlaşma faslında yeri büyüktür. ARP IP adresi bilinen bir cihazın MAC adresini öğrenmek için kullanılır. Günlük hayattan örnek verirsek: Size üniversitenin bir dersliğin de ismi ‘Taipan olan birinin olduğunu söylüyorlar lakin sınıfta tam konum olarak nerede olduğunu belirtmiyorlar. Siz bu durumda ne yaparsınız? Tabiki sınıfa gidip ‘Taipan diye bağırırsınız. Bu isme sahip olan kullanıcıda size “Naptın emmi” diye bağırır, yerini öğrenmiş olursunuz. Tabi burda sizinde görmüş olabileceğiniz üzere bir kontrol mekanizması yok. Tabi bu da çeşitli zaafiyetlere yol açıyor. Mesela başka birisi de gerçek ‘Taipan yerine “Naptın emmi” diye bağırabilir ve siz ‘Taipan’ı o sanabilirsiniz. Bu başlı başına başka bir konu o yüzden bunu da bu kadar örnekle kesiyoruz.
ICMP:
ICMP iletişim kontrol protokolüdür. Size oluşan yada oluşabilecek çeşitli hataları, iyileştirilebilecek durumları bildirir. Bu konuya farklı bir makalede daha ayrıntılı bir şekilde değinicem. O yüzden şimdilik atlıyorum.
UDP:
UDP, TCP’ye göre çok daha hızlı olan bir protokoldür. Yaklaşık olarak 3 kat kadar bir hız farkı var diye biliyorum. UDP’de kontrol kısmı OSI’nın son katmanı olan uygulama katmanın da olur. 3’lü el sıkışma yoktur. Saldım çayıra Mevlam kayıra şeklinde paketlerinizi yollarsınız. Genelde canlı yayın, görüntü iletimi gibi veri aktarımının hızlı ve paket kaybının önemli olmadığı(çok az miktarda) zamanlarda kullanılır. TCP’ye göre daha güvensizdir. Üzerinde de çeşitli servisler çalışır. DNS bunlardan en çok bilinenidir. Peki NMAP UDP taramasında neyi kullanır derseniz:
Port açıkken veri gönderirsek illa veri alacağız diye bir durum söz konusu değil. Eğer servisin cevap verme ihtiyacı varsa cevap verir eğer cevap verme ihtiyacı yoksa cevap vermez.
Port kapalıyken veri gönderirsek; ICMP ile port kapalı mesajı yollanır.(port unreachable)
UDP ye veri yolladığımızda cevap alamıyorsak ya firewall vardır yada servisinin işine yaramıyordur. ICMP cevabı alıyorsak Firewall yok port kapalı.
NMAP’te bu durumlardan faydalanarak UDP taraması yapar. Genel olarak NMAP’in çalışma mantığı bu anlattıklarımın üzerine kuruludur. Şimdi geçelim biz bunları bilerek kendi NMAP’imizi nasıl yazarız?
2)El Yapımı NMAP:
Kendi NMAP’imizi yapmamız için biraz piton bilgisi biraz araştırma ve yukarıda yazdıklarım yeterli. Programın genel mantığı piton’un bir kütüphanesi olan scapy ile hedef’e paketler yollayıp gelen yanıtlara göre port’un açık yada kapalı olduğunu belirlemek. Biz bu programı bir arkadaşımla beraber internetten de faydalanarak yazmıştık. Fl= olarak eklediğimiz kısımdaki RST kodunu netten bulduk yani sayı değerini. Yoksa tek tek deneme yanılma yapmamız lazımdı. Bu değer bir çeşit durum bilgisi içeriği, sabit bir değer. İnternette arayarak TCP taramak için hazır kodlar bulanilirsiniz biz kendimiz TCP ve ek olarak UDP içinde yazdık. Kodları inceleyebilir editleyebilir kendinize göre kullanabilirsiniz. Bizim yazdığımız statik bir yapıda siz bunu dinamikleştirebilirsiniz. Dinamikleştiren olursa bana da yollarsa sevinirim bizim zamanımız kısıtlıydı ondan en kısa yolu seçtik.
Biraz Scapy’den bahsedeyim. Scapy veri paketleri oluşturup bunları yollamanızı sağlayan bir piton kütüphanesidir. Yollamak istediğiniz paket türünde nelerin gerektiğini ls() komutu ile görebilirsiniz. Örnek olsun diye bir tane ekran görüntüsüne koydum. Programda sürekli ıp değeri girmemek için başta bir değişken atadık destination IP diye onuda belirteyim. Paketinizi oluşturduktan sonra send(paket ismi) şeklinde paketinizi yollıyabilirsiniz. Eğer yollıyacağınız paket birden fazla katman içeriyorsa sendp() kullanmanız lazım. Scapy’e de başka bir konuda değinecem şimdi ona girdik mi konu iyice uzar ondan şimdilik atlıyorum. Gelelim kodlara:
https://paste.ubuntu.com/25290363/
Scapy dışında geri kalanı en temel linux bilgileri aslında. Scapy’de çok basit bir şey eğer konumu beklemezseniz kendinizde googlelayarak çok rahat bir şekilde öğrenebilirsiniz.
DİPÇE: Arkadaşlar paylaştığım kodu biz kalide yazmıştık kalide çalışıyor lakin diğer işletim sistemlerinde bir sıkıntı var scapy’nin yüklü olmamasından kaynaklı olduğunu düşünüyorum ama nedeni tam ne bilmiyorum şahsen bende. Birde kodu kalide çalıştıran arkadaşlar UDP taraması da yaptığından işlem çok uzun sürüyor haberiniz olsun isterseniz UDP kısmını editleyebilir sadce TCP için kullanabilirsiniz ki kodu paylaşma amacım kullanmanız değil nasıl yazılabileceğine dair fikir edinmeniz zaten.
Şimdi gelelim hazırcı arkadaşlarımızın beklediği parametreler bölümüne...
3)NMAP’ın Çeşitli Parametreleri ve Özellikleri:
Şimdi eğri oturup doğru konuşalım çoğu kişi internetten öğrendiği kadarıyla NMAP’in kullanımını
nmap -sS -sV HEDEF
şeklinde öğrendi ve böyle kullandı. Fakat bu NMAP’in hakkını yemek, çok kısıtlı bir şekilde kullanmak demek oluyor. En azından şahsen ben öyle düşünüyorum. Bakın yukarıdaki görselde verdiğim NMAP’in parametrelerinin sadece bir kısmı hatta yarısı bile değil. Ben size elden geldiğince bildiğim parametreleri açıklıyayım.
Öncelikle NMAP’te tek bir hedef taramak zorunda değilsiniz mesela 192.168.15.30-65 şeklinde bir aralık belirtebilirsiniz yada 192.168.10.1/24 şeklinde de aralık belirtebilirsiniz. Mesela bir CTF’tesinizdir belli bir IP aralığındaki makinelere saldırmanız söylenir. Makinelerin hangisi ayakta hangisi ölü anlamak için tek tek değil bu şekilde IP aralığı belirterek de tarama yapabilirsiniz. Bir diğer pek bilinmeyen konu ise size yukarıda verdiğim koddaki gibi tarama yaparsanız NMAP default olarak en çok kullanılan ilk 1024 portu tarar. Lakin 65535 tane port bulunmakta. Peki bu aralığı nasıl belirteceğiz yada sadece istediğimiz portları nasıl taratabiliriz? Hadi parametre parametre inceleyelim.
-p: Hangi portların taranacağı hk.daki bilgiyi tutar. “-p 1-65535” yaparsanız 1 ile 65535 arasındaki portları tarar. Eğer “-p 1,65535” yaparsanız sadece 1 ve 65535. portu tarar. Virgül ile hangi portların taranmasını istediğinizi tek tek belirtebilirsiniz.
-sT: Bu parametre hedef cihazda Syn Proxy varsa ona karşı önlem almamızı sağlar.
-T(0-5): NMAP’te 6 çeşit tarama şekli vardır. NMAP default olarak T3 tarama şeklini kullanır -T(0-5) değer vererek tarama şeklinizi değiştirebilirsiniz.
-T0: Her bir paketi 5 dk'da gönderirir. Seri analiz yapar.(paranoyak)
-T1:Her bir paketi 15'sn de yollar. Seri tarama yapar.
-T2:Her bir paketi 0.4’sn de yollar. Seri tarama yapar.
-T3:Default olan parametredir. Paralel tarama yapar.
-T4:1.25 snden fazla gecikme beklemez. Paralel tarama yapar. Hızlı sonuç almak için
idealdir
-T5:insect modda tarar. Hiçbir hostu 15dk'dan fazla taramaz.15 dk tamamlanınca kaldığı
yerde bitirir. 0.3 sn içinde paket cevabı bekler. Paralel tarama yapar.
-o: Ekrana basılan çıktının başka bir formatta bilgisayara kaydedilmesini sağlar.
-oS: script kiddie formatı. E yerine 3 a yerine @ falan.
-oX:xml formatında verir.
-oG:çıktısı grep'e uygundur. Grep komutunun özelliği verdiğiniz dosyanın içinde satır satır
arama yapar her satır içinde eşleştiği değere göre çıktı üretir. Bu da tüm sonuçları tek
satır halinde oluşturur. Grep komutuyla daha rahat çalışabilmek için.
-oN: Normal şekilde basım yapar.
-oA: Bunların hepsini verir.
-v: Verbose. Detaylı çıktı verir.
--reason: Bulduğu sonuçları neden o şekilde bulduğunu açıklar. Açıksa neden açık, kapalıysa neden kapalı şeklinde.
-sU: UDP taraması yapmak için kullanılır. NMAP default olarak UDP taraması yapmaz TCP taraması yapar.
-PN: Normalde NMAP eğer bir IP aralığı verdiyseniz yada tek bir makineyse ayakta olan makineleri tarar çıktıyı verir, ayakta olmayan makinelerin çıktısını basmaz. Eğer bu parametreyi verirseniz makineler ayakta mı değil mi diye bakmaz.
-sP: Bütün verilen hostlara ping atıp hostlar ayakta mı diye kontrol eder. Bunu zaten defaultta yapıyor.
--traceroute: Belirtilen host’a giderken geçtiği routerları ifşalar. Yollarını belirtir.
-sA: Ack scan yapar host ayakta mı değil mi diye birde ack’tan kontrol eder.
-sF: Fin scan yapar.
-sN: Bayrakların hiçbiri kullanılmaz. Firewall varsa eğer daha önceden yapamadığımız sorguların sonradan yapılabilmesini sağlar.
-sX: Fin, push ve urg bayrakları aktif olarak tarama yapar.
-sM: fin ile ack bayrağı set edilir rst dönerse port kapalı bir şey dönmezse port açık. BSD'lerde işe yarar.
--scanflags: Farklı bayraklarla tarama yapılmak isteniyorsa kullanılır --scanflags bayrak(tüm bayraklar için ALL kullanılır.) Örn: “--scanflags FIN”
--badsum: Checksum'ı yanlış doldurur. Biz yanlış doldurunca karşı sistem paketi drop eder herhangi bir cevap dönmez. Firewall(IPS/IDS) olsaydı reset dönerdi. Anlaşıldığı üzere firewall tespiti için kullanılır.
-sS: Sin taraması yapar.
-sV: Versiyon taraması yapar. Eğer versiyon taraması yapmadan direkt sin scan yaparsanız nmap size defaultta çalışan servisleri gösterir. Yani mesela SSH defaullta 22. portta çalışır lakin adam 2022. portuna taşımıştır. Versiyon taraması yapmazsanız size SSH’ın 22 de çalıştığını, yaparsanız 2022’de çalıştığını gösterir.
-O1: Birinci jenerasyondan os taraması yapar.
-O2: İkinci jenerasyondan os taraması yapar.Önerim bu benimde şahsen. Önceden default’u O1 di lakin eskidiği için değiştirildi. Tam sonuç alabilmeniz için NMAP’in hedefte bir açık bir kapalı port bulabilmesi gereklidir. Her iki jenerasyon içinde. (Default olan)
-sC: Açık olan portta kullanılan servisin NMAP veritabanında kayıtlı olan bir açığı veya scripti varsa onu listeler. Kendi sömürüp alabildiği bilgileri size basar. NMAP’in scriptleri “/usr/share/nmap/scripts/” dosyasının içinde yer alır.
--max-rate: Saniyede max kaç paket yollanacağını belirler. NMAP’in hızını bununla da ayarlayabilirsiniz. Örn: “--max-rate 10” saniyede 10 paket yollanmasını sağlar.
Benim kendi bildiğim parametreler bunlar. Daha birçok parametresi var tabi nmap’in eğer ingilizceniz varsa “nmap –help” yaparak tüm parametreleri görüntüleyebilirsiniz.
4)NMAP ile Gizlenerek Bilgi Toplama:
Bu konuda tabiki yurt dışından sunucu kiralayıp yada başka bir kurban üstünden tarama yaparak bilgi toplayabilirsiniz lakin benim burda anlatacağım taktik direkt kendi makinemizden tarama yaparken nasıl gizlenebileceğimiz’e dair bir olay. Peki ne bu olay ona bakalım.
"-D RND:10" : Bu şekilde bir parametre verirseniz(10 değerini kendiniz değiştirebilirsiniz) karşı tarafa farklı farklı random ıplerden NMAP sorgu gönderir, araya da birkaç tane sizin IP adresinizden serpiştirir. Eğer karşıdaki kişi firewall loglarını kontrol ederse tek tek kontrol etme zahmetine girmez. Öbür türlü paso sizden gelen paketler tabiki dikkat çeker. Şimdi gelelim ben genelde hangi tarama şeklini kullanırım.
nmap -sS -sV hedef -sC -p 1-65535 -T4 -D RND:10
Ben genelde bunu kullanırım tabi ki her yiğidin yoğurt yiyişi farklıdır. Birde bu konuda bir video çektim dilerseniz onu da izleyebilirsiniz. Buraya kadar bıkmadan okuyan koca yürekli adamlara selam olsun İyi forumlar.
www.youtube.com/watch?v=i-tsDdETbYA