# Nmap
Nmap (Network Mapper yani "Ağ haritalayıcı"), bilgisayar ağları uzmanı Gordon Lyon (Fyodor) tarafından geliştirilmiş bir güvenlik tarayıcısıdır. Taranan ağın haritasını çıkarabilir ve ağ makinalarında çalışan servislerin durumlarını, işletim sistemlerini, portların durumlarını gözlemleyebilir.
Nmap kullanarak ağa bağlı herhangi bir bilgisayarın işletim sistemi, çalışan fiziksel aygıt tipleri, çalışma süresi, yazılımların hangi servisleri kullandığı, yazılımların sürüm numaraları, bilgisayarın güvenlik duvarına sahip olup olmadığı, ağ kartının üreticisinin adı gibi bilgiler öğrenilebilmektedir.
Nmap tamamen özgür GPL lisanslı yazılımdır ve istendiği takdirde sitesinin ilgili bölümünden kaynak kodu indirilebilmektedir. Nmap'in kullanılabildiği işletim sistemleri Linux, Windows, MacOS, Solaris, *BSD ve AmigaOS olarak sıralanabilir fakat popülerliği öncelikle Linux daha sonrasında Windows'tadır.


### Nmap kullanım alanları.
  - Ağ Keşfi: Taranan ağ üzerindeki sistemler hakkında bilgi sahibi olunması (port, üzerinde koşan uygulama vb. bilgileri öğrenmek gibi).
  - Ağ topolojisinin çıkarılması.
  - Port Tarama: Hedef sistemlerdeki açık portları tespit. Hangi servislerin çalıştığını ve hangi portların açık olduğunu belirlemek amacıyla yapılır.
  - Servis Tespiti: Tespit edilen açık portların ardındaki servislerin belirlenmesi ve bu servislerin sürümlerinin tespiti.
  - İşletim Sistemi Tanıma: Hedef sistemlerin işletim sistemini belirlemek için IP paketlerinin yanıtlarının analizi.
  - Sızma testlerinin gerçekleştirilmesi.
  - Scripting: Özelleştirilmiş taramalar ve testler yapmak için kullanıcıların yazdığı ya da indirdiği betikleri çalıştırma.


## Nmap grafiksel kullanıcı arabirimi.
   - YÖNLENDİRME , Adriano Monteiro Marques tarafından UMIT grafiksel kullanıcı arabiriminden faydalanılarak geliştirilmiş şu anki resmi kullanıcı arabirimdir. NMap paketinin içinde gelmektedir.
   - YÖNLENDİRME , Zach Smith tarafından geliştirilmiş Nmap'in ilk resmi grafiksel kullanıcı arabirimi olma niteliğindedir. Nmap'in 2.2 ve 4.2 sürümleri arasında kullanılmıştır.
  - Son olarak MacOS için geliştirilmiş XNmap ise proje olarak artık ölü durumdadır.


## Nmap ile tarama.
Nmap herhangi bir istemci veya sunucuyu birçok farklı şekilde tarama yeteneğine sahiptir. Nmap'i güçlü kılan farklı tarama tekniklerine sahip olmasıdır. Protokol temelli (TCP, UDP, vb.) tarama yapılabileceği gibi, belirli aralıklardaki IP adresleri, alt ağlar (subnet) ve üzerlerinde çalışan port ve servisleri de taranabilir.
Tarama sonuçlarında ortaya çıkabilecek port durumları aşağıdaki gibidir:
Open (Açık): Portun erişilebilir durumda olduğunu ve port üzerinde bir uygulamanın TCP bağlantılarını ya da UDP datagramlarını kabul ettiği anlamına gelmektedir.
Closed (Kapalı): Portun erişilebilir olduğunu (Paketleri almakta ve geri paket göndermekte) fakat üzerinde herhangi bir uygulamanın olmadığı anlamını taşımaktadır.
Filtered (Filtreli): Dönen tepkiler bir paket filtreleme mekanizması tarafından engellenir. Nmap portun açık olduğuna karar veremez.
Unfiltered (Filtresiz): Portlar erişilebilir ancak Nmap portların açık veya kapalı olduğuna karar veremez. (Sadece ACK scan için)
Open|filtered (Açık|Filtreli): Nmap portların açık veya filtrelenmiş olduğuna karar veremez. (UDP, IP Protocol, FIN, Null, Xmas Scan için)
Closed|filtered (Kapalı|Filtreli): Nmap portların kapalı ya da filtreli olduğuna karar veremez. (Sadece Idle Scan için)


## Nmap tarama türleri.
### TCP Syn (half open) Scan.
Kaynak makinanın hedef makinaya TCP SYN bayraklı segment göndererek başlattığı, yarı açık veya prematüre bir tarama türüdür. Portların kapalı olduğu durumlarda hedef makine cevap olarak RST + ACK bayraklı segmenti döndürür. Portların açık olduğu durumlarda ise hedef makine SYN + ACK bayraklı segment döndürür. Daha sonra kaynak makina RST bayraklı segment göndererek bağlantıyı koparır ve böylelikle TCP üçlü el sıkışma (TCP three-way handshaking) tamamlanmaz. Bu tarama türünde TCP üçlü el sıkışma gerçekleşmediği için bu tarama türü hedef sistemlerinde herhangi bir şekilde iz bırakmaz.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sS -v [Hedef_IP]


### TCP Connect Scan.
Kaynak makinanın gerçekleştireceği TCP Connect Scan, kapalı portlara yapıldığı zaman RST + ACK bayraklı segment dönecektir. Ancak açık portlara yapıldığı durumlarda hedef makinanın göndereceği SYN + ACK bayraklı segmenti, kaynak makine ACK bayraklı segment göndererek cevaplar ve üçlü el sıkışmayı tamamlar.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sT -v [Hedef_IP]


### FIN (stealth) Scan.
Hedef makinaya TCP bağlantı isteği olmadan gönderilen segmentle tarama yapılır. Kaynak makinanın göndereceği FIN bayraklı segment, hedef makinanın kapalı bir portuna gelirse hedef makina RST + ACK bayraklı segment döndürecektir. Eğer açık portuna gelirse hedef makinadan herhangi bir tepki dönmeyecektir.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sF -v [Hedef_IP]


### Xmas Scan.
Bu tarama türünde kaynak bilgisayarın TCP segmentine URG, PSH ve FIN bayraklarını set edeceği ("1" yapılacağı) segment hedef makinaya gönderilir.
Eğer Kaynak makinanın göndereceği URG, PSH ve FIN bayraklı segment, hedef makinanın kapalı bir portuna gelirse hedef makine RST + ACK bayraklı segment döndürecektir. Eğer port açık olursa hedef makinadan herhangi bir tepki dönmeyecektir.
Bu tarama türünde TCP başlığı içerisinde yer alan toplam altı adet bayraktan üç tanesi set edildiği ("1" yapıldığı) için, gönderilen segment yılbaşı ağacının yanan lambalarına benzetilmiştir. Bundan dolayı da bu tarama türüne Xmas (Christmas) Scan denmiştir.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sX -v [Hedef_IP]


### Null Scan.
Hiçbir bayrağın bulunmayacağı bu tarama türü, gerçek hayatta karşımıza çıkmayan bir durumdur. Kaynak makinanın göndereceği bayraksız segmentler karşısında hedef makinanın vereceği tepkiler FIN Scan ile aynıdır.
Kaynak makinanın göndereceği bayraksız segment, hedef makinanın kapalı bir portuna gelirse hedef makine RST + ACK bayraklı segment döndürecektir. Eğer port açık olursa hedef makinadan herhangi bir tepki dönmeyecektir.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sN -v [Hedef_IP]


### Ping Scan.
Bu tarama türünde kaynak makina hedef makinaya tek bir ICMP Echo istek paketi gönderir. IP adresi erişilebilir ve ICMP filtreleme bulunmadığı sürece, hedef makina ICMP Echo cevabı döndürecektir. Eğer hedef makina erişilebilir değilse veya paket filtreleyici ICMP paketlerini filtreliyorsa, hedef makinadan herhangi bir cevap dönmeyecektir.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sP -v [Hedef_IP]


### UDP Scan.
Kaynak makinanın hedef makinaya göndereceği UDP datagramına, ICMP Port Unreachable cevabı döndürülüyorsa hedef makine kapalı kabul edilecektir. Herhangi bir tepki döndürmeyen hedef makine open|filtered kabul edilecektir. UDP datagramıyla cevap döndüren hedef makinaya ait port ise açık kabul edilecektir.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sU -v [Hedef_IP]


### IP Protocol Scan.
Bu tarama türü standart NMAP tarama türlerinden biraz farklıdır. Bu tarama türünde hedef makinaların üzerlerinde çalışan IP tabanlı protokoller tespit edilmektedir. Bu yüzden bu tarama türüne tam anlamıyla bir port taraması demek mümkün değildir. Hedef makine üzerinde, taramasını yaptığımız IP protokolü aktif haldeyse hedef makinadan bu taramaya herhangi bir cevap gelmeyecektir. Hedef makine üzerinde, taramasını yaptığımız IP protokolü aktif halde değilse hedef makinadan bu taramaya, tarama yapılan protokolün türüne göre değişebilen RST bayraklı (RST bayrağı "1" yapılmış) bir segment cevap olarak gelecektir.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sO -v [Hedef_IP]


### ACK Scan.
Bu tarama türünde kaynak makina hedef makinaya TCP ACK bayraklı segment gönderir. Eğer hedef makina ICMP Destination Unreachable mesajını dönerse ya da hedef makinada bu taramaya karşılık herhangi bir tepki oluşmazsa port “filtered” olarak kabul edilir. Eğer hedef makina RST bayraklı segment döndürürse port “unfiltered” kabul edilir.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sA -v [Hedef_IP]


### Window Scan.
Window Scan, ACK Scan türüne benzer ancak bir önemli farkı vardır. Window Scan portların açık olma durumlarını yani “open” durumlarını gösterebilir. Bu taramanın ismi TCP Windowing işleminden gelmektedir. Bazı TCP yığınları, RST bayraklı segmentlere cevap döndüreceği zaman, kendilerine özel window boyutları sağlarlar. Hedef makinaya ait kapalı bir porttan dönen RST segmentine ait window boyutu sıfırdır. Hedef makinaya ait açık bir porttan dönen RST segmentine ait window boyutu sıfırdan farklı olur.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sW -v [Hedef_IP]


### IdleScan.
Bu tarama türü, kaynak makinanın hedef makineyi tarama esnasında aktif olarak rol almadığı bir türdür. Kaynak makina “zombi” olarak nitelendirilen makinalar üzerinden hedef makineyi tarayarak bilgi toplar.
Bu taramayı gerçekleştirmek için aşağıdaki komut kullanılmalıdır:
 - nmap -sI -v [Zombie_IP] [Hedef_IP]


## Nmap betik motoru.
Nmap betik motoru (Nmap scripting engine - NSE), Nmap'in en güçlü ve kullanışlı özelliklerinden birisidir. NSE'yi; normal Nmap komutlarıyla yapılamayan ya da yapılması çok zor olan işlemlerin daha kolay bir şekilde yapılmasının sağlandığı bir betikler bütünü olarak tarif edebiliriz. Nmap ile birlikte birçok betik kütüphanesi hazır olarak gelmektedir. Fakat NSE aynı zamanda kullanıcıların ihtiyaç duydukları betikleri kendilerinin de yazabilmelerini ve bunları paylaşabilmelerini de sağlar. NSE'de yer alan betikler aynı anda paralel olarak da çalıştırılabilirler.
NSE kullanarak temel olarak yapılabilecekler aşağıda listelenmiştir:
  - Ağ keşifleri: Hedef etki alanlarının (domain) whois veritabanı sorguları yapılabilir. Hedef sistemlerin SNMP sorguları yapılabilir ve mevcut NFS/SMB/RPC paylaşım ve servisleri listelenebilir.
  - Karmaşık versiyon tespiti: Normal Nmap komutlarıyla hedef sistemlerin versiyonları belirlenebilmektedir. NSE ile hedef sistemlerin versiyonları çok daha ayrıntılı bir şekilde tespit edilebilmektedir.
  - Zafiyet (Vulnerability) tespiti: Normal Nmap komutlarıyla hedef sistemlerin zafiyetleri tam anlamıyla tespit edilememektedir. NSE ile bu zafiyetler daha kolayca belirlenebilmektedir. Nmap ile hazır gelen birçok zafiyet tespit betiği bulunmaktadır. Fakat Nmap'in temel işlevinin bir zafiyet tarayıcısı olmadığının bilinmesi gerekir.
  - Arka kapı (Backdoor) tespiti: NSE bazı arka kapı programlarını da tespit edebilmektedir.
  - Zafiyet sömürmesi (Vulnerability exploitation): NSE ile sadece hedef sistemlerin zafiyetleri tespit edilmekle kalmayıp bu zafiyetlerin bazıları kullanılarak hedef sistemlere sızılması da mümkün olmaktadır. Fakat Nmap'in temel amacı Metasploit gibi bir zafiyet sömürü programına dönüşmek değildir. Buna rağmen NSE ile hedef sistemlerdeki bazı zafiyetlerin sömürülmesi de mümkündür.
NSE ile temel olarak bu işlemlerin yapılması hedeflenmekle beraber NSE'nin geliştirilmesine devam edilmektedir.


### NSE örnekleri.
NSE kullanmak için nmap komutunun sonuna "--script=example.nse" parametresi eklenir.
Aşağıdaki nmap komutuyla hedef sistemin başlık (banner) bilgisi alınabilmektedir:
 - nmap -sS 192.168.61.61 --script=banner.nse
Aşağıdaki nmap komutuyla hedef sistemin http başlık (http header) bilgi alınabilmektedir:
 - nmap -sS 192.168.61.61 --script=http-header.nse
"nmap -sC" komutu kullanılarak NSE kütüphanesinde bulunan temel bazı betiklerin çalıştırılması sağlanır. Bu komut nmap—script=default" komutuyla aynı görevi yapmaktadır.