Nmap ile ilk tarama
- Nmap ile canlı makineleri bulmayı, port durumu ve servis sürümü okumayı, NSE betiklerini güvenle koşmayı ve taramayı kayıtlarda yakalamayı öğrenirsin.
- Tarama yalnız yazılı izinli hedefte yapılır; savunma ekibi aynı aracı kendi yüzeyini görmek için kullanır.
- Bu derste host keşfini, sürüm tespitini, betikleri, çıktı dosyalarını ve taramanın güvenlik duvarı kaydındaki izini öğrenirsin.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Nmap, ağdaki makineleri ve açık portları bulan açık kaynak bir tarayıcıdır. Hedefe paket yollar, dönen cevabı ağ derslerinde öğrendiğin kurallarla yorumlar ve okunur bir tablo basar. Aynı tablo hem sızma testçisine hem savunmacıya konuşur.
Sızma testinin ilk günü çoğu zaman bir Nmap çıktısıyla başlar. Savunma ekibi de kendi ağını düzenli tarar ve beklemediği bir servisi saldırgandan önce görür. Aracın gücü, tek bir komutla koca bir ağın haritasını çıkarabilmesindedir. Bu derste o haritayı çıkarmayı, okumayı ve tarayanı kayıtlarda yakalamayı öğrenirsin.
Keşif ve izin
Bu güç yalnız izinle kullanılır. İzinsiz tarama ülkeye göre hukuki sorumluluk doğurabilir ve karşı tarafın kayıtlarına saldırı girişimi olarak düşer. Türk Ceza Kanunu'nun 243. maddesi bilişim sistemine hukuka aykırı girmeyi suç sayar.
Taramanın ardından denenen her giriş bu sınırı kolayca aşar. Gürültülü bir tarama üretimdeki servisi de aksatabilir. Başlamadan önce hedefin sahibinden yazılı izin, yani kapsam belgesi alırsın.
Belge hangi adreslerin, hangi saatlerde ve hangi yoğunlukta taranabileceğini yazar. Altay Kargo'nun güvenlik ekibiyle imzaladığın belge, iç ağdaki 10.0.0.0/16 bloğunu taramaya açıyor. Hedeflerden biri, 10.0.0.5 adresli web sunucusudur.
Nmap port taramadan önce hedefin ayakta olup olmadığına bakar, buna host keşfi denir. Yetkili kullanıcıda varsayılan keşif dört sondadan oluşur: ICMP echo isteği, 443 portuna SYN, 80 portuna ACK ve ICMP zaman damgası isteği. Bu dört sonda, ping'i engelleyen ama web portlarını açık tutan makineleri de yakalar.
-sn yalnız bu keşfi yapar ve port taramaz, sadece canlı makineleri listeler. -Pn ise keşfi tümden atlar ve pinge cevap vermeyen makineyi de tarar. Yerel Ethernet ağında Nmap, -Pn verilse bile ARP sondası kullanır, çünkü ARP aynı segmentteki komşuyu bulmanın hem en hızlı hem en kesin yoludur.
Host keşfini asıl taramadan ayırmak bir alışkanlıktır. Önce -sn ile koca bir bloğu tarayıp hangi adreslerin cevap verdiğini öğrenir, sonra yalnız o adreslere yönelirsin. Böylece hem zaman kazanır hem gereksiz gürültüyü azaltırsın.
Büyük bir ağda 65535 portu binlerce ölü adrese denemek saatler alır, oysa canlı liste çoğu zaman avuç içi kadardır. Keşif çıktısındaki gecikme değeri de bir ipucudur: çok düşük gecikme hedefin yakın, yani aynı yerel ağda olduğunu gösterir.
$ sudo nmap 10.0.30.8 Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 3.04 seconds $ sudo nmap -Pn -p 443 10.0.30.8 PORT STATE SERVICE 443/tcp open https
Çıktıdaki notu dikkatle oku. Nmap keşif sondalarına cevap alamadığı için makineyi kapalı saydı ve port taramasına hiç geçmedi. Hedef başka bir alt ağda olduğu için ARP de devreye girmedi. Oysa ICMP'yi ve web sondalarını düşüren bir duvarın arkasındaki sunucu da tam böyle görünür.
Hedefin ayakta olduğunu biliyorsan -Pn ile keşfi atlar, taramayı doğrudan yaptırırsın. İkinci komutta 443 portunun açık çıkması bunu kanıtlar. Sızma testlerinde en sık kaçan bulgu da budur: kapalı sanılıp hiç taranmayan makine.
Etkinlik 1 / 7
10.0.0.0/24 ağında yalnız ayakta olan makineleri, port taramadan listele.
Port seçmek ve sürüm okumak
Varsayılan tarama en sık kullanılan 1000 TCP portunu dener. Tek port için -p 443, liste için -p 22,80, aralık için -p 1-1024 yazarsın. -p- ise bütün 65535 portu tarar ve doğal olarak uzun sürer.
Portları daraltmak hem taramayı hızlandırır hem hedefe binen yükü azaltır. Yetkili kullanıcıda Nmap varsayılan olarak SYN taraması yapar, yani -sS. Yetkisiz kullanıcıda ise işletim sisteminin bağlantı çağrısını kullanan connect taramasına düşer, çünkü ham paket yollamak yetki ister.
Asıl değer sürüm bilgisindedir. -sV bayrağı açık porta bağlanır, servisin kendini tanıttığı karşılama metnini (banner) okur ve nmap-service-probes veritabanındaki eşleşmelerle sürümü çıkarır. -sV olmadan SERVICE sütunu yalnız port numarasına bakarak bir tahmin yazar, yani 3306'yı gördüğünde okumadan MySQL der.
-sC varsayılan betik kümesini çalıştırır ve başlık, sertifika, dizin gibi ek bilgiyi ekler. -O işletim sistemini tahmin eder, -A ise bunların çoğunu tek bayrakta birden açar. Yönetici karşılama metnini elle değiştirmiş olabilir, bu yüzden kritik bir sürümü ikinci bir yöntemle doğrularsın.
Sürüm tespitinin ne kadar derine ineceğini --version-intensity ayarlar; değeri 0 ile 9 arasındadır ve varsayılan 7'dir. Yüksek yoğunluk daha çok sonda yollar, nadir servisleri de tanır ama taramayı yavaşlatır. İşletim sistemi tahmini ise TCP/IP başlıklarındaki küçük farklara bakar ve her zaman kesin değildir.
Güvenlik duvarının arkasındaki bir makine için Nmap çoğu zaman birkaç aday sıralar. Bu yüzden çıktıyı mutlak gerçek değil, doğrulanacak bir hipotez olarak okursun. Karşılama metnini kapatan ya da değiştiren bir servis, sürüm satırını boş ya da yanıltıcı bırakabilir.
$ nmap -sV -p 22,80,443 10.0.0.5 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4 (protocol 2.0) 80/tcp open http nginx 1.10.3 443/tcp filtered https
Çıktıda dört sütun vardır. PORT numarayı ve protokolü, STATE durumu, SERVICE servis adını, VERSION ise okunan sürümü gösterir. 22 ve 80 portları açık, sürümleri de belli. 443 satırında sürüm yok, çünkü Nmap servise hiç ulaşamadı ve durumu filtreli yazdı.
Eski bir sürüm numarası, yayımlanmış zafiyet kayıtlarıyla eşleştirilir ve yama önceliğini belirler. Örneğin eski bir OpenSSH ya da nginx sürümü, o yazılıma ait bilinen açıkların bu sunucuda hâlâ kapatılmadığını düşündürür. Sürümü bilmek, hangi zafiyetin bu servisi etkilediğini araştırmanın ilk adımıdır.
Etkinlik 2 / 7
10.0.0.5 hedefinde yalnız 22 ve 80 portlarını sürüm tespitiyle tara.
Açık, kapalı, filtreli
Nmap altı port durumu tanır ama çoğu çıktıda üçünü görürsün. open, portta bağlantı kabul eden bir uygulama olduğunu söyler. closed, portun cevap verdiğini ama arkasında dinleyen bir servis olmadığını gösterir. filtered ise bir paket filtresinin sondayı engellediğini ve durumun belirlenemediğini anlatır.
SYN taramasında SYN-ACK açık, RST kapalı, cevapsızlık ya da ICMP ulaşılamaz hatası filtreli demektir. UDP taramasında cevapsız port open|filtered olarak yazılır, çünkü sessizlik iki anlama birden gelir.
Seçtiğin tarama tipi, hedefte bıraktığın ize doğrudan etki eder. Yarı açık tarama el sıkışmayı hiç bitirmediği için karşıdaki uygulama çoğu zaman tam bir bağlantı görmez, çünkü işletim sistemi soketi uygulamaya hiç devretmez. Tam bağlantı taraması ise soketi sonuna kadar açar ve bağlantıyı uygulamaya teslim eder; birçok servis bunu veri göndermeden kapanan bir istemci olarak günlüğüne yazar. Bu yüzden gizlilik ile yetki arasında bir seçim yaparsın.
Yarı açık tarama daha az iz bırakır ama kök yetkisi ister. Tam bağlantı yetki istemez ama daha görünürdür. Ağ tespit sistemi ise ikisini de görür, çünkü SYN paketleri iki yöntemde de teldedir.
Etkinlik 3 / 7
SYN taramasında dönen cevabı port durumuna göre ayır.
Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.
0/4 seçenek yerleşti.
Etkinlik 4 / 7
Doğru mu, yanlış mı?
-sT taraması TCP el sıkışmasını tamamladığı için hedef uygulamanın günlüğüne, -sS taramasından daha çok düşer.
Betikler, hız ve çıktı
Nmap yalnız port bulmakla kalmaz, betik motoruyla (NSE, Nmap Scripting Engine) servisleri daha derin yoklar. Betikler kategorilere ayrılır: default, safe, discovery, auth, vuln, exploit, dos ve daha fazlası. --script default varsayılan kümeyi çalıştırır ve -sC ile aynı işi görür. safe kategorisi servisi bozmamak, çok kaynak harcamamak ve açık sömürmemek üzere seçilmiştir.
vuln kategorisi bilinen zafiyetleri yoklar, exploit ise onları sömürmeye çalışır; dos kategorisindeki betikler servisi hizmet dışı bırakabilir. Bu son üçü hedefi bozma riski taşıyabilir, Nmap en riskli betikleri ayrıca intrusive kategorisiyle işaretler. Kapsam belgesi açıkça izin vermiyorsa hedefe veri yazan ya da servisi zorlayan betikleri koşmazsın.
$ sudo nmap -sV -sC -p- -T4 -oA tarama 10.0.0.5 Nmap scan report for 10.0.0.5 Host is up (0.00052s latency). Not shown: 65532 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4 (protocol 2.0) | ssh-hostkey: | 2048 3a:1f:6c:0d:92:e4:5b:77:a1:08:c3:5e:2f:90:bb:9c (RSA) |_ 256 b4:07:d2:61:5a:3e:c8:19:f0:7b:44:a6:0e:d3:29:e2 (ED25519) 80/tcp open http nginx 1.10.3 |_http-title: Altay Kargo Takip |_http-server-header: nginx/1.10.3 443/tcp filtered https Nmap done: 1 IP address (1 host up) scanned in 41.27 seconds
Komutu parça parça oku. -sV sürümü, -sC varsayılan betikleri, -p- bütün portları seçer. -T4 hızlı zamanlama kullanır, -oA tarama ise sonucu tarama adlı üç dosyaya yazar. Not shown satırı 65532 portun RST ile kapalı döndüğünü söyler, bu yüzden tabloda yer kaplamaz. | ile başlayan satırlar betik çıktısıdır.
ssh-hostkey sunucunun anahtar parmak izini verir. Aynı adreste parmak izi değişirse ya sunucu yeniden kurulmuştur ya da araya biri girmiştir. http-title sayfa başlığını, http-server-header ise sunucunun kendini tanıttığı başlığı gösterir. Sürüm sütunu ile bu başlık aynı Server satırından beslenir, yani bağımsız iki kanıt değildir.
Hız da senin elindedir. -T0 ile -T5 arasındaki şablonlar zamanlamayı ayarlar. -T4 hızlıdır, -T2 hedefi yormamak için yavaşlar. --max-rate saniyedeki paket sayısına tavan koyar ve üretimdeki bir sunucuyu korur.
-oA ile kaydedilen üç biçimin her birinin işi ayrıdır: okunur .nmap, araçlara verilen .xml ve satır bazlı .gnmap. grep open tarama.gnmap ile açık portları tek satırda süzersin. Haftalar sonra aynı hedefi yeniden tarayıp ndiff eski.xml yeni.xml ile iki sonucu karşılaştırırsın. Yeni açılan port, satırın başında artı işaretiyle görünür.
$ ls tarama.* tarama.gnmap tarama.nmap tarama.xml $ grep open tarama.gnmap Host: 10.0.0.5 () Ports: 22/open/tcp//ssh//OpenSSH 7.4 (protocol 2.0)/, 80/open/tcp//http//nginx 1.10.3/, 443/filtered/tcp//https/// Ignored State: closed (65532)
Etkinlik 5 / 7
Nmap bayrağını yaptığı işle eşleştir.
Savunma: taramayı görmek
Savunma tarafında tarama belirgin bir iz bırakır. Tek bir kaynak adres kısa sürede aynı hedefin çok sayıda farklı portuna SYN yollar. Kapalı portlardan RST döner, filtreli portlarda duvar paketi düşürür ve her denemeyi kaydeder. Tespit kuralı bu yüzden kaynak başına benzersiz hedef port sayısını bir zaman penceresinde sayar.
Normal bir istemci genelde bir ya da iki porta bağlanır, onlarca porta art arda dokunan tek kaynak kuralı tetikler. Pencereyi uzun tutan kural, hızını bilerek düşüren sinsi taramayı da yakalar. MITRE ATT&CK dışarıdan gelen taramayı T1595 Active Scanning, ağa girmiş birinin içeriden yaptığı keşfi ise T1046 Network Service Discovery olarak ayırır. İçeriden gelen tarama daha ciddidir, çünkü bir makinenin ele geçtiğini düşündürür.
Asıl önlem tespitten önce gelir: saldırı yüzeyini küçültmek. Gereksiz servisi kapatır, yönetim portlarını yalnız yönetim ağına açar, veritabanını internete hiç göstermezsin. Dışarıdan görünen her açık port, internete verdiğin bir sözdür ve her söz bakım ister.
Kendi sunucunu dışarıdan düzenli tararsan, beklemediğin bir satır gördüğünde o servisin gerçekten açık olması gerekip gerekmediğini erkenden sorarsın. Bir servisi standart dışı bir porta taşımak onu gizlemez, yalnız erteler; sürüm tespiti yapan tarayıcı 2222'deki SSH'yi de tanır. Kapatılan her gereksiz port, hem tespit yükünü hem saldırganın seçeneklerini azaltır.
Derinleş:Bir tespit kuralının anatomisi
Ağ tespit sistemleri taramayı eşik kuralıyla yakalar. Suricata gibi bir motorda kural iki parçadan oluşur: başlık ve seçenekler. Başlık eylemi, protokolü ve yön bilgisini taşır, örneğin alert tcp any any -> $HOME_NET any. Seçenekler ise imzayı ve sınırı yazar.
Tam bu iş için threshold anahtarı vardır. threshold: type threshold, track by_src, count 20, seconds 60 satırı, aynı kaynaktan 60 saniye içinde 20 eşleşmeye ulaşılınca alarm üretir. track by_src saymayı kaynak adrese bağlar; count ile seconds ise pencereyi kurar.
type limit alarm sayısına tavan koyar. type both ise ikisini birleştirir: eşik aşılınca pencere başına tek alarm üretir ve gürültüyü keser. Böylece tek tek bağlantılar değil, yalnız tarama örüntüsü alarma dönüşür. Kuralı fazla dar yazmak yanlış alarmı, fazla geniş yazmak ise kaçan taramayı getirir; denge işin ustalığındadır.
Etkinlik 6 / 7
Güvenlik duvarı kaydında port taraması olarak işaretleyeceğin satırları seç.
Şüpheli satırlara tıkla. Birden fazla olabilir.
Kaydı okumak işin yarısıdır, ikinci yarısı doğru düzeltmeyi seçmektir. Bir taramada beklenmedik bir servis göründüğünde ilk refleks o servisi kapatmak değil, onun neden dışarıya açık olduğunu sormaktır.
Bulguların çoğu, yalnız yerelde çalışması gereken bir servisin yanlışlıkla bütün ağ arayüzlerinde dinlemesinden doğar. Böyle bir serviste doğru hamle, onu kapatmak yerine dinlediği adresi 127.0.0.1 ile sınırlamaktır. Servis iş görmeye devam eder ama dışarıya kapanır.
Etkinlik 7 / 7
Web sunucunun dış taramasında 443/tcp open ve 3306/tcp open mysql çıktı. Uygulama veritabanına aynı makineden bağlanıyor. En doğru düzeltme hangisidir?
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.