İleri Seviye Nmap Kullanımı

Posted by Umut on

Bu yazımda Penetration Test lerde(Sızma testleri) sıklıkla kullanılan “Nmap” adlı araçtan bahsetmek istiyorum. Ne işe yaradığından bahsedelim ilk önce.

Nmap, ağdaki cihazlara ve cihazların portlarına çeşitli paketler gönderip ve cevaplara bakarak cihazın açık olup olmadığını, açık olan portlar üzerinde hangi servislerin çalıştığını, cihazların hangi işletim sistemini kullandığını öğrenmemize olanak sağlayan open-source bir araçtır. Bu saydığım özelliklerin yanı sıra Nmap’in çok kullanışlı farklı özellikleri de bulunuyor. Firewall detection, Vullnerability Scanning (Zafiyet taraması), Exploitation (Zafiyetleri istismar etme) ve NSE Scriptleri sayesinde (Yazı sonunda değineceğim) daha bir çok özelliği içerisinde bulunduruyor.

Eğer kaynak kodlarına bakmak isterseniz buradan ulaşabilirsiniz.

Kurulum

Rethat, Debian ve Arch based linux dağıtımlarının paket depolarında nmap bulunuyor. Dağıtımın kendi package manager ından yükleyebilirsiniz.

Yum:

#yum install nmap

Apt-get:

#apt-get install nmap

Pacman:

#pacman -S nmap

Eğer paket yöneticinizle ilgili bir sorun varsa yada kendiniz kurmak isterseniz Nmap’in download sayfasından rpm halini indirip kendinizde kurabilirsiniz. Eğer Windows işletim sistemini kullanıyorsanız Nmap’in dowload sayfasından yükleme talimatlarına bakabilirsiniz.

Hedef Belirtme (Target Specification)

Nmap’i en basit olarak kullanmak için bir hedef belirtmememiz gerekiyor. Hedef olarak bir web adresi, IP adresi verebileceğinizin yanı sıra bir ağ da verebiliriz. Nmap’in kendi sayfasında yazana göre aslında büyük ağları taramak için tasarlanmış fakat tekli hedeflerde de son derece iyi bir sonuç veriyor. Çok uzatmadan bir hedefi nasıl belirteceğimize geçelim.

#nmap google.com

#nmap 192.168.1.1

#nmap 192.168.1.0/24

Hedef belirtmek için argüman olarak vermemiz yeterli. Eğer Nmap’ e sadece hedef verirseniz ve herhangi bir opsiyon belirtmezseniz Nmap default olarak en çok kullanılan 1000 porta SYN taraması yapar.

nmap default scan

Gördüğünüz gibi Nmap‘ e sadece hedef verdiğimizde en çok kullanılan ilk 1000 porta SYN taraması yaptı ve bize açık olan portları ve portlarda çalışan servisleri getirdi. Böyle teker teker bütün network ü taramak zahmetli bir iş. Bunun içinde Nmap le 192.168.1.0/24 subnet ini tek seferde “nmap 192.168.1.0/24” şeklinde tarayabiliyoruz.

Bütün subnet i tarattığımızda nmap bize açık olan makineleri ve açık olan makinelerdeki açık portları bize listeliyor.

Farzedinki elinizde açık olan hostların IP adreslerinin yazılı olduğu bir txt var. Nmap bunu da düşünmüş ve -iL parametresi ile elinizde bulunan hostların yazılı olduğu dosyayı hedef olarak nmap’ e verebiliyorsunuz.

Peki ya bütün ağı tararken taramasını istemediğiniz bir host varsa? Nmap te çareler tükenmez. “–exclude” ve “–excludefile” parametreleri ile nmap e taramasını istemediğiniz hedefleri belirtebilirsiniz.

nmap exclude host

Belirli aralıklardaki IP adreslerinide tarayabilirsiniz.

Yani bu komut sadece 192.168.1.39 ve 192.168.1.40 IP adreslerini tarayacaktır.

Hedef Keşfi (Host Discovery)

Nmap ile ağda bulunan hostları bulabiliyoruz ve Nmap bunu bize birden fazla seçenek ile yapabilme olanağı sunuyor. Birden fazla seçenek sunmasındaki neden bazı işletim sistemleri bazı tekniklere cevap vermemesidir. Örneğin güncel Windows işletim sistemleri ping taramasına cevap vermemektedir, bu yüzden hostun up olup olmadığını bulmak için farklı bir tarama yapmamız gerekiyor.

nmap host discovery options

Nmap bize ICMP echo request ile host keşfi yapabilme seçeneği sunarken aynı zamanda SYN/ACK/UDP paketlerini belli portlara göndererekte host keşfi yapabilmemizi sağlıyor.

Hiç bir parametre belirtmezsek (yani sadece hedef belirtirsek) nmap host keşfi için ICMP echo request, 443 portuna TCP SYN paketi, 80 portuna TCP ACK paketi ve ICMP timestamp request yaparak host keşfi yapıyor.

  • -sL: Herhangi bir paket göndermeden bütün IP adreslerini listeler. Açık olan olmayan bütün adresleri. Daha önce hiç işime yaramadı, belki sizin yarar.
  • -sn: Bu parametre nmap e host keşfi yaptıktan sonra port taraması yapmamasını söyler. Normalde nmap host u keşfettikten sonra açık olan hostlara port taraması yapar, bu parametre nmap e bunu yapmamasını söyler. Yetkisiz bir kullanıcı tarama yaptığında nmap sadece 80 ve 443 portlarına TCP SYN paketlerini gönderir. Yetkili bir kullanıcı ile yaptığınızda ARP istekleri gönderir.
  • -Pn: Host keşfini yapmaz (bütün hostları açık olarak kabul eder). Port taramasını hızlandırmak için bu seçeneği kullanabilirsiniz. Eğer açık olduğunu bildiğiniz bir host a nse scriptlerini kullanacaksanız -Pn ve -sn parametrelerini kullanarak işleminizi iyice hızlandırabilirsiniz.
  • -PS: Belirlenen portlara TCP SYN paketleri göndererek host keşfi yapar. Örneğin 22, 80 ve 443 portlarına SYN paketleri ile host discovery yapmak istersek şöyle bir komut kullanmamız gerekirdi : “nmap -PS 22,80,443 192.168.1.0/24
  • -PA: Bir önceki TCP SYN gibi bu sefer TCP ACK paketlerini belli portlara göndererek host discovery yapar. SYN ve ACK paketleri göndermek firewall ları geçme ihtimalinizi arttırır.
  • -PU: UDP paketleri göndererek host discovery yapar. Firewall ları geçme ihtimaliniz artar fakat UDP protokolü gereği paketinizin gittiği garanti olmadığı için hata ihtimali yüksek olur, çok gerekli olmadığı sürece önermem ben.
  • -PE; -PM; -PP: ICMP paketleri göndererek host discovery yapar.
  • -PA: Tüm ağa ARP request gönderir, eğer ARP response gelirse hostun up olduğu belli olur ve başka deneme yapması gerekmez.
  • -n: Nmap bazen DNS çözümleme yapar. Biz Nmap ten DNS çözümleme yapmasını engellemek istersek bu parametreyi kullanabiliriz. İşlemimizi hızlandırır.
  • -R: Bu seferde DNS çözümlemesi yapmasını istersek bu parametreyi kullanabiliriz.

Gördüğünüz gibi sadece host discovery ile ilgili bir sürü seçenek bulunuyor. Nmap’in avantajı gerektiği yerde gerektiği seçeneği kullanarak en doğru ve en kolay yoldan sonuca ulaşmaktır.

Bahsetmediğim bir-iki parametresi daha bulunuyor fakat onlar çokta önemli değil, eğer işiniz düşerse “nmap –help” yazarak bakabilirsiniz.

Port Taraması (Port Scanning)

Nmap‘in bunca özelliğinin içinde port taramasıda mevcuttur. Nmap ilk geliştirilmeye başlandığından itibaren bu özelliğinin bulunmasının yanı sıra artık nmap in ana özelliklerinden biri haline gelmiştir.

Nmap port tarama sonucunu sadece açık/kapalı yerine port tarama sonucunu 6 kategoriye ayırıyor. Bunlar: open/closed/filtered/unfiltered/open|filtered ve close|filtered

nmap port scan

  • open: Tarama sonuçlarında open port görmek bize o portta bir servis çalışıyor ve bu port üzerinde bir filtreleme işlemi olmadığını gösteriyor. Sızma testi sırasında filtreli bir port görmek istemeyiz bu yüzden durumu open olan bir port görmek bizim işimize yarar.
  • closed: Tarama sonucunda close port görmemiz o portun erişilebilir (Yanlış anlaşılmasın erişilebilir olmasından kastım paket gönderip cevap alabildiğimiz için) fakat o port üzerinde hiç bir servis/uygulama çalışmadığı için bir şey yapamayacağımız anlamına gelir. Tabiki Nmap bu özellikten şu şekilde faydalanıyor: eğer bir port closed durumundaysa bu o hostun açık olduğu anlamına gelir, yani nmap bu özelliği host discovery kısmında da kullanıyor.
  • filtered: Bunun anlamı Nmap’in o portun açık olup olmadığını anlayamadığıdır. Örneğin firewall o porta giden/gelen veriyi engelliyor da olabilir yada host açık değildir ve paketler ulaşmıyordur. Nmap doğrulamak için bir kaç paket daha göndermeyi dener, buda tarama hızını yavaşlatır.
  • unfiltered: Portun erişilebilir fakat Nmap’in portun açık yada kapalı olduğunu anlayamadığı zaman verdiği sonuçtur. Bunu çözmek için o porta SYN/FIN taraması yapabilirsiniz.
  • open|filtered: Nmap’in o portun açık yada filtered olduğunu anlayamadığı zaman verdiği sonuçtur.
  • closed|filtered: Nmap’in o portun kapalı yada filtered olduğunu anlayamadığı zaman verdiği sonuçtur.

Nmap te bazı taramaları kullanabilmeniz için yetkili bir kullanıcı ile çalıştırmanız gerekiyor, bunun sebebi nmap in raw packet kullanmasıdır.

Nmap, default olarak en çok kullanılan 1000 porta SYN taraması yapmaktadır. Siz bütün portlara yada belirli portlara istediğiniz taramayı yapmak isterseniz Nmap’in bize sunduğu birçok parametreyi kullanabilirsiniz. İlk önce port tarama türlerine bakalım.

  • SYN taraması (-sS) belirli portlara SYN flag i set edilip gönderilerek ve gelen cevaba bakarak yapılan bir taramadır. Sızma testlerinde bu tarama sıklıkla kullanılır. Bunun 2 tane sebebi var. İlk olarak SYN taramasında sadece bir paket gönderildiğinden tarama hızlı bir şekilde gerçekleşir, ikincisi ise 3 lü el sıkışma tamamlanmadığı için firewall/IPS gibi yapılar tarafından engellenmez ve loglarda kayıt bırakmaz (Üçlü el sıkışmanın ne olduğunu bilmiyorsanız buradaki yazımdan okuyabilirsiniz.).

nmap syn scan

  • TCP connect (-sT) taramasının SYN taramasından farkı ise üçlü el sıkışma tamamlanıyor. Bunun avantajı üçlü el sıkışma tamamlandığı için o port üzerinde çalışan servis bilgilerini daha detaylı/doğru bir şekilde alabiliyoruz. Dezavantajı ise log larda kayıt bırakıyoruz ve firewall/IPS tarafından engellenme ihtimalimiz artıyor.

  • UDP taramasında (-sU) nmap TCP yerine UDP protokolünü kullanıyor. Protokol gereği paketlerin gittiğinin garantisi olmadığı için bu tarama tipi yavaştır. Ama UDP portları çok umursanmadığı için bu portlar üzerinde çok güvenlik önlemi alınmaz. Bu da sızma testi uzmanına bir avantaj sağlar. Bu taramada mantık olarak şöyle oluyor: Nmap hedefteki portlara UDP paketleri gönderiyor. Eğer ICMP port unreachable error dönerse nmap portun kapalı olduğunu anlıyor. Diğer ICMP unreachable error lardan biri gelirse portu filtered olarak işaretliyor. Geri dönmeyen paket olursa nmap bir daha gönderiyor ve eğer yine geri dönüş olmaz ise open|filtered olarak gösteriliyor. UDP taramasındaki bir diğer önemli olay ise işletim sistemleri ICMP port unreachable mesajını belirli bir sayıda gönderiyor buda doğru bir sonuç almamızı engelliyor.

nmap udp scan

  • TCP NULL/FIN/Xmas (-sN/-sF/-sX) taramaları TCP protokolündeki flag lari değiştirerek portların open yada closed olduğunu anlamak için kullanılır. Bu taramaların kullanılmasındaki neden ise flag leri set ettiğinden göze batma olasılığını düşürüyor ve  beklenmedik bir yerden yaptığı için engellenme olasılığıda düşük. Sistemler taranırken SYN/RST/ACK bitlerini içermeyen herhangi bir paket bağlantı noktası kapatıldığında RST ile sonuçlanır, bağlantı noktası açıksa hiç bir yanıt alınmaz.Null scan de hiçbir bit set edilmez. (-sN)
    FIN scan de sadece FIN bit i set edilir. (-sF)
    Xmas scan de FIN, PSH ve URG flag leri set edilir. (-sX)

    nmap fin scan example

    Gördüğünüz gibi bir taraftan nmap FIN taraması yaptığımda sağ tarafta tcpdump çıktılarından “Flags” kısmında FIN flag inin set edildiğini görebiliyoruz.

  • TCP ACK (-sA) taramasında ise bu sefer ACK flag ini set edip gönderiyoruz. Bu taramayı portun açık yada kapalı olduğunu anlamak için değilde firewall gibi yapıların olup olmadığını anlamak için kullanıyoruz.

nmap ack scan

Görüldüğü gibi portun açık olup olmadığını belirlemedi.

  • –scanflags parametresiyle istediğimiz flag i set edip gönderebiliyoruz. Nmap bize gerçekten geniş bir tarama seçeneği sunuyor. İhtiyacımız ve doğru olan yöntemi seçmek ise bize kalıyor. Bu parametrenin detaylarına help ten ulaşabilirsiniz.
  • Idle scan (-sI ) sayesinde zombie hostlarınızdan tarama yapabilirsiniz. Gerçek IP adresinizi gizlemek için kullanılabilir.

Port tarama tekniklerimiz genel olarak böyle fakat dikkatinizi çekmiştirki biz hiç hangi portların taranacağını belirtmedik. Yani nmap hep 1000 portu taradı. Kurnaz bir sys admin servislerini kullanılmayan başka portlara taşıdıysa nmap taramasında bunu görmemiz zor olacak. Bununda önüne geçmek için biz elle nmap’in hangi portları taraması gerektiğini belirtebiliyoruz. Yine birkaç parametre ile işimiz kolaylaşıyor.

  • -p parametresi ile hangi portları tarayacağını elimizle belirtebiliyoruz.

Örnek olarak 1 den 100 e kadar olan portları taramak istersek “nmap 192.168.1.40 -p 1-100

Sadece 22,80 ve 443 portlarını taramak istersek “nmap 192.168.1.40 -p 22,80,443

  • –exclude-ports parametresi ile taramasını istemediğimiz portları taramadan çıkartabiliyoruz.

1 den 100 e kadar fakat 80. portu taramasını istemezsek “nmap 192.168.1.40 -p 1-100 –exclude-ports 80

  • -F parametresi ile nmap in default olarak en çok kullanılan 1000 portu taraması yerine en çok kullanılan 100 portu taramasını sağlayabiliriz. Tarama sonucunun hızlı olmasını istiyorsanız kullanılabilir fakat bütün portları taramayacağı için diğer sonuçları göremezsiniz.

nmap 192.168.1.40 -F

  • –top-ports parametresi sayesinde en çok kullanılan portlar arasından kaç tanesinin kullanılacağını seçebiliyorsunuz.

Örnek olarak en çok kullanılan 10 portu taramak isterseniz “nmap 192.168.1.40 –top-ports 10

  • -p- parametresi ile bütün portları tarayabilirsiniz. Tarama süresi uzayabilir fakat açık olan portu atlamamış olursunuz.

Port belirleme parametreleride bu kadardı. İsterseniz tarama seçenekleriyle port belirleme seçeneklerini karıştırarak örnek yapalım.

Farzedinki ben 192.168.1.40 IP adresindeki hostun up olduğunu biliyorum ve DNS çözümleme yapmasını istemiyorum. Tarama olarakta SYN scan olsun ve en çok kullanılan 5 portu tarayıp bana versin istiyorum. Bunun için -sS, -Pn, -n ve –top-ports parametrelerini kullanmam gerekiyor.

nmap example

Sonuçtanda görüldüğü gibi demekki en çok kullanılan ilk 5 port 21, 22, 23, 80 ve 443 müş. Nmap bizim için bu portlara SYN taraması yaptı ve açık ve kapalı olma durumlarına göre listeledi.

Sizinde bu parametreleri karıştırıp denemenizi öneririm.

Servis & Versiyon ve İşletim Sistemi Keşfi (Service & Version and OS Detection)

Nmap ile kolay bir şekilde servis ve o servisin versiyonunu keşfedebiliyoruz. Nmap o port üzerinde çalışan servisi /usr/share/nmap/nmap-services dosyasından buluyor. Fakat doğru bir sonuç olması için versiyon bilgilerini ve çalışan servisin doğrulamasını o port üzerinden gelen cevaba göre /usr/share/nmap/nmap-service-probes database inden karşılaştırarak buluyor. Dosyanın ne kadar büyük olduğunu wc komutu ile görebiliyoruz.

-l parametresi kaç satır olduğunu gösterir

Gelelim versiyon keşfinin nasıl yapıldığına.

-sV parametresi ile nmap daha önceden bahsettiğim /usr/share/nmap/nmap-service-probes database inden gelen cevaba göre karşılaştırıp versiyon bilgisini tahmin etmeye çalışıyor. Nmap dökümantasyonunda -A parametresini alternatif olarak kullanabileceğimiz yazılmış fakat -A parametresi, versiyon keşfinin yanı sıra işletim sistemi keşfi+script taraması da yaptığından eğer sadece versiyon taraması yapmak istersek işlemimizi bir hayli uzatacaktır. Burada değinmem gereken en önemli nokta nmap version taraması yaparken 3 lü el sıkışmayı tamamlamak durumunda kalıyor. Bu yüzden firewall lar tarafından engellenme ihtimalimiz artıyor ve bağlantı kurduğumuz için log larda gözüküyor.

nmap version detection (en fazla kullanılan ilk 100 porta versiyon taraması)

Nmap’in en bilindik özelliklerinden biri ise işletim sistemi keşfidir. Nmap bunu açık olan portların numaralarına + window size uzunluğuna  ve gelen paketlerdeki fingerprintlere bakarak bulmaya çalışıyor. Bu fingerprintler /usr/share/nmap/nmap-os-db database inde bulunuyor ve Nmap dökümantasyonunda yazana göre 2,600 den fazla bilindik işletim sistemi fingerprinti bulunuyor.

OS discovery’i -O parametresi ile yapabiliyoruz ve eğer nmap işletim sistemini bulamazsa yada hatalı bir şekilde bulursa verdiği linkten bunu bildirip geliştirilmesinde katkı sağlayabiliyoruz.

nmap os discovery

nmap os discovery

Nmap Scripting Engine (NSE)

Eveet, gelelim Nmap’in bize sağladığı en iyi özelliğe.

Yazının başında Nmap’in zafiyet taraması ve exploit edebilmesinden bahsetmiştim hatırladınız mı? İşte Nmap bunu NSE scriptleri ile yapıyor. Nmap’in içerisinde şuanlık 567 adet NSE scripti bulunmakta. Bunlar yardımı ile zafiyet taraması, discovery ve exploit işlemlerini yapabilirsiniz. Nmap’in güzel olaylarından birisi open-source olması. Bunun sayesinde kendimizde NSE scripti yazabiliyoruz. Bu scriptlere ulaşmak isterseniz /usr/share/nmap/scripts dizininden ulaşabilirsiniz.

Bu scriptlerin ne işe yaradıklarını istediğiniz bir editörle (vim, nano yada arayüzlü bir editör, tamamen size kalmış) açıp, açıklamaları okuyup ne işe yaradıklarını ve nasıl kullanıldıklarını öğrenebilirsiniz.

Örneğin os discovery için kullanılan smb-os-discovery.nse scriptine bakalım.

Açıklamaları okuduğumuzda bu scriptin smb protokolünü kullanarak işletim sistemi keşfi yaptığını öğrendik ve yukarıdaki fotoğraftan görüldüğü gibi nasıl kullanabileceğimizide gösteriyor. İsterseniz elimizi kirletip bir deneyelim.

  • Hangi script i kullanacağımızı nmapte –script parametresi ile belirtiyoruz.
  • Script argümanı olarak vereceklerimizi –script-args parametresi ile belirtiyoruz.
  • Daha detaylı olarak bakmak isterseniz buradan bakabilirsiniz.

 

nmap nse script

Görüldüğü üzere başarılı bir şekilde script çalışıp bize işletim sistemi bilgilerini getirdi.

İşinize yarayacak bir kaç scripti buradan bulabilirsiniz. NSE script konusunu fazla uzatmak istemiyorum çünkü tamamen ayrı bir yazı olabilecek nitelikte. Dediğim gibi eğer aradığınız bir script i bulamazsanız kendinize yazabilirsiniz.

İleri Düzey Kullanım (Advanced)

Bunca saydığım özelliklerin yanı sıra sızma testi sırasında işinize yarayacak, bazen hayati bir önem taşıyabilecek bir kaç özellikten daha bahsetmek istiyorum son olarak.

Bazen firewall gibi yapılar ardı ardına gelen paketleri kötü amaçlı gördüğünden engelleyebiliyor. Bunun önüne geçmek için nmap te tarama hızını (-T parametresi ile) ayarlayabiliyoruz. T parametresine 0′ dan 6′ ya kadar numara verebiliyoruz.

  • 0 (paranoid): Bu hıza ayarladığımızda paketler arasındaki süre 5 dakikaya kadar çıkar.
  • 1 (sneaky): Bu hızla paketler arası süre 15 saniyeye kadar çıkar.
  • 2 (polite): Paketler arası süre 0.4 saniye olur.
  • 3 (normal): Default olarak kullanılan mod.
  • 4 (aggressive): Agresif mod. Hızlı ve güvenilir bir ağda olduğunuzu varsayıp ona göre tahmin yapar.
  • 5 (insane): Bu mod doğru sonuç uğruna hızlı bir sonuç almanıza olanak sağlar. Yani mümkün olabilecek en hızlı şekilde size sonuç verir fakat sonuçlar tam olarak doğru olmayabilir.

nmap -T

  • -D parametresi ile yem verebilirsiniz. Nmap tarama yaparken aynı anda farklı IP adresleri ilede paket atıp, logları karıştırır.
  • -A parametresi os detection (-O) + version detection (-sV) + script scanning (-sC) ve traceroute (–traceroute) özelliklerinin birleşimi
  • –spoof-mac parametresi ile mac spoof yapabiliriz.
  • Firewall/IDS atlatma ile ilgili dökümantasyona buradan, çeşitli parametrelerede buradan ulaşabilirsiniz.

Umarım yeterince detaylı bir yazı olmuştur. Herhangi bir sorunuz olursa yorumdan yazabilirsiniz.

Bu parametreleri direk ezberlemeyi önermem, bunları kullana kullana öğreneceksiniz. Bir gün test yaparken bir şey lazım olacak ve dökümantasyondan bakıp teste devam edeceksiniz. Fakat bol bol pratik yapmanızı şiddetle öneriyorum.

**Nmap kullanımının yasal  olup olmadığını bilmiyorum bu yüzden sanal ortamda denemenizi öneririm.


Umut

http://www.umuttosun.com

Siber güvenlik alanında çalışan ve araştırmayı seven bir vatandaş ;)