Karışımızda tek bir bilgisayar (genel anlamda herhangi bir ağ cihazı olabilir, ama kısaca bilgisayar veya cihaz diyelim) var, IP adresi 192.168.1.1 olsun ve bu bilgisayarın sık kullanılan portlar üzerinden bir taramasını yapmak istiyoruz. Kullanacağımız komut:
nmap 192.168.1.1
Starting Nmap 7.31 ( https://nmap.org ) at 2017-10-24 09:05 Turkey Standard Time
Nmap scan report for 192.168.1.1
Host is up (0.027s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
80/tcp open http
MAC Address: XX:YY:ZZ:WW:QQ:AA (üretici)
Nmap done: 1 IP address (1 host up) scanned in 2.16 seconds
gibi bir sonuç döner. Bir çok güzel bilgi var. 1000 tane port taramış, 997 tanesinin kapalı olduğunu, 3 tanesinin ise açık olduğunu söylüyor: 22, 23 ve 80. En altta gizlediğim MAC adresi var, yanında parantez içinde de üretici bilgisi yer alıyor. Birden fazla cihazı isim veya IP adreslerini boşlukla ayrılmış bir şekilde aynı satıra yazarak da taratabiliriz. IP aralığı vermek için 192.168.1.1-10 veya tüm oktet yerine * karakterini kullanarak 192.168.1.* veya CIDR notasyonu ile 192.168.1.1/24 de yazabiliriz.
Genel olarak taramanın iki aşaması var; ilk aşama cihaz keşfi (host discovery). Bu aşamada verilen IP aralığındaki açık ve taranabilir cihaz listesi çıkartılıyor, açık olduğuna dair hiçbir iz olmayan IP adreslerinin portlarını tarayarak vakit kaybetmemek için. İkinci aşama port taraması (port scanning). Bu aşamada da hedef bilgisayarların açık olan portlarını bulmaya çalışıyor. Sadece cihaz keşfi yapıp, port taraması yapmamak için -sn anahtarını, tam tersi durumda cihaz keşfi yapmadan doğrudan verilen tüm IP adreslerini port taramasına sokmak için -Pn anahtarını kullanabiliriz.
Cihaz Keşfi
Port taramasını tamamen atlayıp sadece ping taraması gerçekleştirmek için:nmap -sn 192.168.1.*
Sadece belli bir aralıktaki cihazların ters DNS sorgularını yapıp toplam sayıyı almak için (bilgisayarlara hiçbir paket gönderilmeden)
nmap -sL 192.168.1.*
SYN flag set edilmiş TCP paketi ile ping yapmak için (port taramasız):
nmap -sn -PS 192.168.1.*
SYN biti 1 olan bir paket alındığında, eğer o portu dinleyen bir hizmet yoksa RST biti 1 olan bir paket ile cevap verilir. Eğer dinleyen bir hizmet varsa da hedef makine bir sonraki aşamaya geçerek SYN/ACK bitleri 1 olan bir paket ile cevar verir. Bu da yine karşıdaki cihazın açık olduğunu anlamamıza yarar.
ACK flag set edilmiş TCP paketi ile ping yapmak için (port taramasız):
nmap -sn -PA 192.168.1.*
ACK biti 1 olan bir pakette ise var olan bir TCP bağlantısında alınan veriye ait alındı cevabı gönderiliyormuş gibi yapılır. Bu cevabı alan hedef makine ise RST biti 1 olan bir paket ile cevap verir ki bu da aynı şekilde hedef makinenin açık olduğunu gösterir.
Yukarıdaki iki yöntem varsayılan olarak TCP 80 portunu kullanır. Bu durumu değiştirmek için komut satırında -p20 gibi bir port belirtebiliriz.
UDP taraması yapmak için (port taramasız):
nmap -sn -PU 192.168.1.*
varsayılan olarak UDP taramasında 40125 portu kullanılır, kullanılan bir porta denk gelmesi için. Kullanmayan bir porta UDP paketi gönderildiğinde ICMP port erişilemiyor cevabının gönderilir. Bu da karşıdaki bilgisayarın açık olduğunu gösterir. Kullanımda bir UDP portuna denk gelirsek hiçbir cevap dönülmez. Bu sebeple varsayılan olarak 40125 gibi kullanılma ihtimali az olan bir port seçilmiş.
Bir de SCTP kullanarak yukarıdaki denemenin yapılması var:
nmap -sn -SY 192.168.1.*
Denemeleri yaparken dikkat edilecek bir konu; yerel ağdaki bir hedefi tarıyorken bir de WireShark'ta gönderilen paketleri inceliyorsanız sadece ARP protokolünün kullanıldığını, ne TCP SYN ne de ACK kullanıldığını görünce şaşırabilirsiniz. Bu durum yerel ağdaki cihazların açık olduğunu ARP ile anlamanın daha kolay olmasından kaynaklanıyor. nmap bu kolay yöntemi kullanıyor. ARP'yi kapatmak için komut satırından --disable-arp-ping 'i kullanabilirsiniz, şöyle:
nmap -sn -PS 192.168.1.* --disable-arp-ping
Tam tersine, yerel ağdaki cihazları sadece ARP sorgularıyla tespit etmek istiyorsak ARP ping kullanmalıyız:
nmap -sn -PR 192.168.1.*
ARP protokolü düşük TCP stack'inde düşük seviyede çalışan bir protokoldür. İşletim sisteminin güvenlik duvarı ile "genelde" engellenmezler. Basit olarak gönderilen "Kim 192.168.1.5 adresine sahip?" sorgusuna, bu adrese sahip cihaz tarafından cevap verilir. Bunu aslında 192.168.1.5 adresine ping atıp daha sonra ARP cache'ine bakarak da bulabiliriz. Ama nmap'in bu işi işletim sisteminin algoritmalarına kıyasla, çok sayıda hedef cihaz üzerinde daha optimize bir şekilde yaptığı belirtilmiş.
Port Taraması
nmap'in -P ile başlayan anahtarları cihaz keşfi ile ilgili olanlardı. Port taraması ile ilgili olanlar ise -s ile başlar.Yine SYN biti 1 olan bir paket ile port taraması yapmak için
nmap -sS -p80 192.168.1.1
SYN paketi gönderip gerisini getirmeden bağlantıyı sonlandırmak için işletim sistemi tarafından sunulan standart ağ rutinlerinin dışında özel paketler göndermek gerekir. Bu da root/administrator yetkisi ister çoğu durumda. Bu duruma alternatif işletim sisteminin standart rutinleri ile işi gerçekleştirmek için TCP Connect taraması tercih edilebilir.
nmap -sT -p80 192.168.1.1
SYN taraması çoğu durumda loglara girmez, dikkat uyandırmaz. Ama çok sayıda TCP Connect taraması loglara girer ve dikkat uyandırır. Dahası yavaştır ve aynı bilgiyi elde etmek için daha fazla paket gönerilmesini gerektirir. Ama mecbur kalınınca kullanılabilir.
UDP kullanan portlar üzerinden tarama yapmak için ise
nmap -sU 192.168.1.1
Cihaz keşfini atlayıp sadece 53 UDP portunu kontrol etmek istersek
nmap -Pn -sU -p53 192.168.1.1
SCTP ile port taraması yapmak için -sY kullanılablir. Şu sayfada çok faydalı bir yöntem olarak vurgulanmış.
nmap -sY 192.168.1.1
Cihaz keşfinde kullanılan ACK bitini port taramasında da kullanabiliyoruz. Ama burada durum biraz daha farklı. -sA ile TCP ACK scan yapmak mümkün. Ama bu taramayla portların tam durum bilgisini edinmek mümkün değil. Daha çok firewall kurallarını tahmin etme, stateful mu değil mi öğrenmek için kullanılabilir.
Bunun dışında TCP Null (-sN), TCP FIN (-sF) ve Xmas (-sX) taramaları var, ama kullanım alanları biraz daha kısıtlı.
Hedef bilgisayarın verdiği cevaplara göre hangi işletim sistemine sahip olduğunu tahmin edebiliriz:
nmap -O 192.168.1.1
Hedef bilgisayarın bir güvenlik duvarı ile korunup korunmadığını bulmak için
nmap -sA 192.168.1.1
Son olarak port bazında dönülen open, closed ve filtered durumlarına açıklama getireyim. Bir port açıksa ve gönderilen örneğin SYN paketine SYN veya SYN/ACK ile cevap veriyorsa port open olarak listelenir. Bağlantıya karşılık RST ile cevap veriyorsa port kapalı olarak listelenir. Gönderilen pakete hiç cevap gelmiyorsa filtered olarak görülür.
Şu sayfada verilen cheat-sheet faydalı olabilir:
Scripting Engine
smb-os-discovery
Tüm yetenekleri bunlar değil elbette. Çok faydalı bulduğum özelliklerinden biri de hazır gelen, veya genişletilebilen scriptler ile ileri seviye bazı taramalar yapabiliyor olması. Örneğin SMB protokolü üzerinde işletim sistemi ve diğer bazı özellikleri edinebileceğimiz aşağıdaki tarama çok faydalı bilgiler içeriyor. Bu bilgilerin edinilebilmesi için cihazın SMB (veya linux SAMBA) protokolünü destekliyor olması gerek.nmap -p 445 --script smb-os-discovery 192.168.1.0/24
Nmap scan report for pc1.domain (192.168.1.1)
Host is up (0.066s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
MAC Address: xx:xx:xx:xx:xx:xx (Manufacturer)
Host script results:
| smb-os-discovery:
| OS: Windows 7 Professional 7601 Service Pack 1 (Windows 7 Professional 6.1)
| OS CPE: cpe:/o:microsoft:windows_7::sp1:professional
| Computer name: pc1
| NetBIOS computer name: pc1\x00
| Domain name: domain
| Forest name: domain
| FQDN: pc1.domain
|_ System time: 2017-11-29T10:51:37+03:00
ssl-enum-ciphers
HTTPS üzerinden hizmet veren bir web sunucunun hangi protokolleri desteklediğini bulmak için bu da çok faydalı. SSLv1 ve SSLv2 kullanan "riskli" sunucuların tespit edilebilmesi için kullanılabilir.
nmap --script
ssl-enum-ciphers -p 443 www.example.com
Starting Nmap 7.31 ( https://nmap.org ) at 2017-11-29 11:10 Turkey Standard Time
Nmap scan report for www.example.com (192.168.1.9)
Host is up (0.00013s latency).
Other addresses for www.example.com (not scanned):
192.168.1.9rDNS record for www.example.com: bosbdata.bosb.lc
PORT STATE SERVICE
443/tcp open https
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C
| compressors:
| NULL
| cipher preference: server
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| Ciphersuite uses MD5 for message integrity
| TLSv1.0:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 1024) - A
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C
| compressors:
| NULL
| cipher preference: server
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| Ciphersuite uses MD5 for message integrity
| Key exchange (dh 1024) of lower strength than certificate key
|_ least strength: C
MAC Address: xx:xx:xx:xx:xx:xx (Manufacturer)
Nmap done: 1 IP address (1 host up) scanned in 3.38 seconds
En altta yazdığı gibi en düşük güvenlik seviyesi C. Yukarıda da kırmızı ile bu güvenlik seviyesindeki protokoller var. Bunların kapatılması gerekebilir.
[1] https://nmap.org/book/man
[2] https://nmap.org/book/man-host-discovery.html
[3] https://nmap.org/book/man-port-scanning-techniques.html
[4] https://hackertarget.com/7-nmap-nse-scripts-recon/
[5] https://nmap.org/nsedoc/
[6] https://www.computerhope.com/unix/nmap.htm
[7] https://www.tecmint.com/use-nmap-script-engine-nse-scripts-in-linux/
[8] https://bencane.com/2013/02/25/10-nmap-commands-every-sysadmin-should-know/