Nikto ile Web Sunucu Güvenlik Taraması

Pentest işlerinde yıllardır Nikto kullanıyorum ve her seferinde şunu fark ediyorum: Çoğu sistem yöneticisi bu aracı ya hiç duymamış, ya da “eski bir araç” diye kenara atmış. Oysa Nikto, doğru kullanıldığında web sunucunuzdaki açıkları bulmakta hâlâ son derece etkili. Bugün size gerçek üretim ortamlarında neler gördüğümü, nasıl kullandığımı ve hangi sonuçları aldığımı anlatacağım.

Nikto Nedir ve Neden Hâlâ Geçerli?

Nikto, açık kaynaklı, Perl tabanlı bir web sunucu güvenlik tarayıcısıdır. 6000’den fazla potansiyel güvenlik açığı ve yanlış yapılandırma kontrolüyle gelir. “Eski” damgası yemesinin nedeni 2002’den beri var olması, ama bu aynı zamanda onun olgunluk göstergesi. Sürekli güncellenen veritabanıyla Apache, Nginx, IIS ve diğer web sunucularındaki yaygın sorunları tespit eder.

Nikto’nun asıl gücü şu alanlarda öne çıkıyor:

  • Sunucu başlık bilgileri: Gereksiz açıklanan sürüm bilgileri
  • Varsayılan dosya ve dizinler: /phpmyadmin, /admin, /backup gibi
  • Tehlikeli HTTP metodları: PUT, DELETE, TRACE gibi açık bırakılan metodlar
  • SSL/TLS yanlış yapılandırmaları: Eski protokoller, zayıf şifreler
  • CGI güvenlik açıkları: Klasik ama hâlâ karşılaşılan sorunlar
  • XSS ve enjeksiyon vektörleri: Temel düzeyde kontrol

Bir müşteri ortamında daha önce Nessus ve OpenVAS geçirilmiş bir web sunucusu vardı, temiz çıkmıştı. Nikto çalıştırdık, /server-status endpoint’i herkese açık bulundu ve Apache’nin iç durum bilgilerini dışarıya sızdırıyordu. Bu tür küçük ama kritik detaylar Nikto’nun uzmanlık alanı.

Kurulum

Kali Linux kullanıyorsanız Nikto zaten kurulu gelir. Değilse:

# Debian/Ubuntu tabanlı sistemler
sudo apt update && sudo apt install nikto

# RHEL/CentOS/Rocky Linux
sudo yum install nikto
# ya da
sudo dnf install nikto

# Kaynak koddan kurulum
git clone https://github.com/sullo/nikto
cd nikto/program
perl nikto.pl -Version

Perl bağımlılıklarını kontrol etmek için:

perl -MNET::SSLeay -e 'print "SSL desteği mevcutn"' 2>/dev/null || 
  cpan NET::SSLeay

Temel Kullanım ve İlk Tarama

En basit kullanım şekliyle başlayalım:

nikto -h http://hedef-sunucu.com

Ama bu komutu üretimde bu haliyle kullanmıyorum. Genellikle şu parametrelerle çalışırım:

nikto -h https://hedef-sunucu.com 
      -port 443 
      -ssl 
      -output /tmp/nikto_rapor.html 
      -Format html 
      -Tuning 123bde

Önemli parametreleri açıklayayım:

  • -h: Hedef host veya IP adresi
  • -port: Varsayılan dışında bir port kullanılıyorsa belirtilir
  • -ssl: SSL/TLS üzerinden tarama yapar
  • -output: Raporu dosyaya yazar
  • -Format: Çıktı formatı (htm, csv, txt, xml, json)
  • -Tuning: Hangi test kategorilerinin çalıştırılacağını belirler
  • -timeout: Bağlantı zaman aşımı süresi (saniye)
  • -useragent: Özel User-Agent başlığı tanımlar
  • -id: HTTP kimlik doğrulaması için kullanıcı adı ve şifre

Tuning Parametresi ile Hedefli Tarama

-Tuning parametresi bence Nikto’nun en az bilinen ama en değerli özelliği. Saatlerce sürebilecek tam tarama yerine, neyi aradığınıza göre taramayı özelleştirebilirsiniz.

Tuning kategorileri şöyle:

  • 0: Dosya yüklemesi
  • 1: İlginç dosyalar ve loglar
  • 2: Yanlış yapılandırmalar
  • 3: Bilgi açıklama
  • 4: Enjeksiyon (XSS, SSI, HTML)
  • 5: Uzak dosya alma
  • 6: Uygulama seviyesi testler
  • 7: Remote shell
  • 8: Komut çalıştırma / XSS
  • 9: SQL enjeksiyonu
  • a: Kimlik doğrulama atlatma
  • b: Software identification
  • c: Remote source inclusion
  • d: WebService testleri
  • e: Parmak izi

Yanlış yapılandırma ve bilgi açıklama odaklı hızlı tarama için:

nikto -h https://hedef.com -Tuning 23b

Sadece SSL ve kimlik doğrulama sorunlarına bakmak için:

nikto -h https://hedef.com -Tuning 2a -ssl

Gerçek Dünya Senaryosu: Orta Ölçekli E-Ticaret Sitesi

Geçen yıl bir e-ticaret şirketinin güvenlik denetimini yaptık. Siteyi önce manuel inceledik, sonra Nikto’yu çalıştırdık. Tarama komutu:

nikto -h https://magazaadi.com 
      -ssl 
      -port 443 
      -Tuning 1234ab 
      -output /opt/pentest/nikto_magazaadi_$(date +%Y%m%d).xml 
      -Format xml 
      -timeout 30 
      -useragent "Mozilla/5.0 (compatible; SecurityAudit/1.0)"

Nikto ne buldu?

  • X-Frame-Options başlığı eksikti, clickjacking riski
  • X-Content-Type-Options ayarlanmamıştı
  • /phpinfo.php dosyası herkese açıktı, PHP konfigürasyonu, yollar, modüller… Hepsi dışarıya sızıyordu
  • Apache sürüm bilgisi Server başlığında gözüküyordu
  • /admin/ dizini 403 döndürüyordu ama varlığı teyit edilmişti
  • TRACE metodu aktifti

Bu bulgular kendi başına kritik exploit değil, ama birleşince saldırı yüzeyini ciddi şekilde genişletiyor. phpinfo.php durumu müşteriye anlattığımızda şok oldular, “o dosyayı biz koymadık” dediler. Eski bir geliştirici test için koymuş, kimse silmemişti.

Proxy Üzerinden Tarama ve Anonim Çalışma

Bazen taramayı bir proxy üzerinden yönlendirmek gerekiyor. Kendi iç testlerinizde bile trafik analizi yapmak için Burp Suite ile birlikte kullanmak çok işe yarıyor:

# Burp Suite proxy üzerinden
nikto -h https://hedef.com 
      -useproxy http://127.0.0.1:8080 
      -ssl

# SOCKS proxy ile
nikto -h https://hedef.com 
      -useproxy socks5://127.0.0.1:9050

Burp ile birlikte kullanmak özellikle değerli çünkü Nikto’nun attığı her isteği Burp’te görüp analiz edebiliyorsunuz. Hangi isteklerin hangi bulgulara yol açtığını anlamak için bunu sık kullanıyorum.

IDS/IPS Atlatma Teknikleri

Şimdi ilginç kısma gelelim. Nikto varsayılan ayarlarla tarama yaptığında, modern WAF ve IDS sistemleri bunu hemen tanır ve bloklar. Kimi zaman kendi sistemlerinizi test ederken WAF’ın ne kadar iyi çalıştığını görmek istersiniz, kimi zaman ise gerçekçi bir saldırgan simülasyonu yapmak.

# Zaman gecikmeli tarama - imza tabanlı tespiti zorlaştırır
nikto -h https://hedef.com 
      -Pause 2 
      -timeout 20

# Evasion teknikleri ile tarama
# -evasion parametresi 1-9 arası değer alır
nikto -h https://hedef.com 
      -evasion 1 
      -ssl

# Birden fazla evasion tekniği
nikto -h https://hedef.com 
      -evasion 135 
      -ssl

Evasion teknikleri neler:

  • 1: Rastgele URL kodlaması (non-UTF8)
  • 2: Dizin ayracı olarak slash yerine nokta kullanımı
  • 3: Null byte ekleme
  • 4: Büyük/küçük harf değiştirme (IIS için etkili)
  • 5: Ters slash kullanımı (Windows IIS)
  • 6: Tab kullanımı
  • 7: URL formatında karakter kodlaması
  • 8: Windows ayracı kullanımı
  • 9: Session sabitleme

Gerçek bir testte bir müşterinin WAF’ı standart Nikto taramasını saniyeler içinde blokladı. Evasion 1, 3, 5 kombinasyonuyla tekrar denedik, bu sefer tarama tamamlandı ve 12 bulgu geldi. Bu WAF için hem iyi hem kötü bir haberdi: Standart imzaları tanıyordu ama encode edilmiş saldırılara karşı körleşiyordu.

Kimlik Doğrulama Gerektiren Alanlarda Tarama

Login arkasındaki sayfaları taramak için oturum bilgisi vermek gerekiyor:

# HTTP Basic Authentication
nikto -h https://hedef.com/admin/ 
      -id admin:sifre123 
      -ssl

# Cookie ile oturum devralma
nikto -h https://hedef.com 
      -cookies "PHPSESSID=abcdef1234567890; security=low" 
      -ssl

# Custom header ile token tabanlı auth
nikto -h https://hedef.com/api/ 
      -useragent "Mozilla/5.0" 
      -ssl 
      -vhost api.hedef.com

Cookie yöntemini sık kullanıyorum. Önce tarayıcıda veya curl ile giriş yapıp session cookie’yi alıyorum, sonra Nikto’ya veriyorum. Bu şekilde sadece giriş sayfasını değil, tüm authenticated alanı tarayabiliyorsunuz.

Toplu Tarama: Birden Fazla Hedef

Bir organizasyonun tüm web varlıklarını taramak istediğinizde tek tek komut çalıştırmak yetersiz kalır. Nikto dosyadan hedef listesi okuyabiliyor:

# hedefler.txt dosyası oluşturun
cat > /opt/tarama/hedefler.txt << EOF
http://www.sirket.com
https://portal.sirket.com
https://api.sirket.com
https://admin.sirket.com:8443
http://192.168.1.10
http://192.168.1.11:8080
EOF

# Toplu tarama başlat
nikto -h /opt/tarama/hedefler.txt 
      -output /opt/tarama/rapor_$(date +%Y%m%d_%H%M).csv 
      -Format csv 
      -Tuning 123b 
      -timeout 15

Bu yaklaşımı özellikle aylık periyodik taramalarda kullanıyorum. Bir bash scripti ile otomatize edip cron’a bağlamak mümkün:

#!/bin/bash
# /opt/scripts/nikto_haftalik_tarama.sh

TARIH=$(date +%Y%m%d_%H%M)
HEDEF_DOSYA="/opt/tarama/hedefler.txt"
RAPOR_DIZIN="/opt/tarama/raporlar"
LOG="/var/log/nikto_tarama.log"

mkdir -p "$RAPOR_DIZIN"

echo "[$TARIH] Nikto taraması başladı" >> "$LOG"

nikto -h "$HEDEF_DOSYA" 
      -output "$RAPOR_DIZIN/nikto_${TARIH}.xml" 
      -Format xml 
      -Tuning 1234b 
      -timeout 20 
      -nointeractive 2>> "$LOG"

BULGU_SAYISI=$(grep -c "OSVDB|+ " "$RAPOR_DIZIN/nikto_${TARIH}.xml" 2>/dev/null || echo "0")

echo "[$TARIH] Tarama tamamlandı. Yaklaşık bulgu: $BULGU_SAYISI" >> "$LOG"

# Mail bildirimi (mailutils kurulu ise)
if command -v mail &> /dev/null; then
    echo "Nikto haftalık tarama tamamlandı. Rapor: $RAPOR_DIZIN/nikto_${TARIH}.xml" | 
    mail -s "Nikto Tarama Raporu - $TARIH" [email protected]
fi

Cron’a eklemek için:

# Her Pazartesi sabah 03:00'te çalıştır
0 3 * * 1 /opt/scripts/nikto_haftalik_tarama.sh

Nikto Raporlarını Analiz Etmek

Ham Nikto çıktısını okumak başta kafa karıştırıcı olabilir. Örnek bir çıktıya bakalım ve nasıl yorumlanması gerektiğini anlatalım:

+ Server: Apache/2.2.34 (Unix)
+ OSVDB-3268: /icons/: Directory indexing found.
+ OSVDB-3233: /icons/README: Apache default file found.
+ /admin/: This might be interesting...
+ OSVDB-5290: /phpmyadmin/: phpMyAdmin is accessible without a login.
+ OSVDB-3092: /backup/: This might be interesting...
+ TRACE HTTP verb is active, suggesting the host is vulnerable to XST
+ Retrieved x-powered-by header: PHP/5.6.40
+ Cookie PHPSESSID created without the httponly flag
+ The anti-clickjacking X-Frame-Options header is not present.

Bu çıktıyı önceliklendirirken şu sıralamayı uyguluyorum:

  • Kritik: phpMyAdmin açık erişim, TRACE aktif, eski PHP/Apache sürümleri
  • Yüksek: Dizin listeleme, yedek dosya dizinleri, httponly flag eksikliği
  • Orta: Bilgi açıklama başlıkları, varsayılan dosyalar
  • Düşük: Eksik güvenlik başlıkları (clickjacking, HSTS vs.)

OSVDB numaraları artık resmi olarak aktif değil ama Nikto hâlâ kullanıyor. Bu numaraları CVE veritabanında aramak veya doğrudan Google’da aramak genellikle daha iyi sonuç veriyor.

Sık Karşılaşılan Yanlış Pozitifler

Nikto zaman zaman yanlış pozitif üretiyor. Bunları ayırt etmek önemli:

Örneğin /admin için 403 alıyorsanız Nikto bunu bulgu olarak işaretler, ama 403 döndürmesi aslında sunucunun o dizini koruduğu anlamına gelir. Gerçek sorun 200 veya redirect ile erişim verilen durumlardır.

Benzer şekilde bazı başlık eksiklikleri, WAF veya reverse proxy katmanında eklenmiş olabilir. Nikto doğrudan sunucuya baktığı için CDN arkasındaki bir sunucuyu test ettiğinizde bazı başlıkları göremeyebilirsiniz.

Her Nikto bulgusunu manuel olarak doğrulamak için curl kullanmak iyi bir alışkanlık:

# TRACE metodunu doğrula
curl -X TRACE https://hedef.com -v

# Başlık kontrolü
curl -I https://hedef.com | grep -i "x-frame|x-content|server|x-powered"

# phpinfo.php erişimini doğrula
curl -o /dev/null -s -w "%{http_code}" https://hedef.com/phpinfo.php

Nikto’yu Diğer Araçlarla Entegre Kullanmak

Nikto tek başına değil, bir güvenlik araç seti içinde kullanıldığında gerçek değerini gösteriyor. Ben genellikle şu sırayla ilerliyorum:

Önce Nmap ile port ve servis tespiti:

nmap -sV -p 80,443,8080,8443 hedef.com -oN nmap_web.txt

Sonra Nikto ile web servis taraması, ardından bulunan endpoint’leri Dirb veya Gobuster ile daha derin tarıyorum:

gobuster dir -u https://hedef.com 
             -w /usr/share/wordlists/dirb/common.txt 
             -o gobuster_cikti.txt

nikto -h https://hedef.com 
      -ssl 
      -Tuning 123b 
      -output nikto_cikti.xml 
      -Format xml

Bu üçlü kombinasyon çoğu web güvenlik değerlendirmesinde sağlam bir başlangıç noktası oluşturuyor.

Yasal ve Etik Kullanım Uyarısı

Bunu yazmadan geçemeyeceğim çünkü bu konuda Türkiye’de ciddi yanılgılar var. Nikto, kendi sistemlerinizde veya yazılı izin aldığınız sistemlerde kullanılmalıdır. İzinsiz tarama, Türk Ceza Kanunu’nun 243 ve 244. maddeleri kapsamında suç teşkil eder. Pentest projesine başlamadan önce mutlaka kapsam belgesi ve yetkilendirme mektubu alın. “Açık sistemleri test etmek serbest” gibi bir kavram yasal açıdan geçersizdir.

Sonuç

Nikto, web güvenlik testlerinde temel bir araç olmayı sürdürüyor. Özellikle şunları sağlıyor: hızlı yanlış yapılandırma tespiti, bilgi açıklama bulgularının otomatize edilmesi ve periyodik taramalarda baz çizgi oluşturma. Tek başına yeterli değil, Nmap, Gobuster, Burp Suite gibi araçlarla birleştiğinde değeri katlanıyor.

En önemli tavsiyem: Nikto’yu sadece sızma testi projesinde değil, kendi sunucularınıza karşı da düzenli çalıştırın. Ayda bir tarama alışkanlığı edinmek, üçüncü bir gözün sisteminizi sürekli denetlemesine benziyor. O /phpinfo.php dosyası veya açık kalan /backup/ dizini, siz farketmeden önce başkası farkedebilir.

Güvenlik, bir kerelik eylem değil sürekli bir süreç. Nikto bu sürecin küçük ama güvenilir bir parçası olmayı hak ediyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir