Shodan ile İnternet Üzerindeki Açık Sistem ve Servislerin Keşfi
İnternet bağlantılı her sistemin bir dijital ayak izi bıraktığını biliyor muydunuz? Shodan, tam da bu ayak izlerini takip eden, açıkta kalan servisleri ve cihazları indeksleyen özelleşmiş bir arama motorudur. Normal arama motorları web sayfalarını tararken, Shodan port taraması yaparak banner bilgilerini toplar ve bunları aranabilir hale getirir. Güvenlik araştırmacıları, sistem yöneticileri ve sızma testi uzmanları için vazgeçilmez bir araç haline gelen Shodan’ı doğru kullanmak, hem saldırgan bakış açısını anlamak hem de kendi sistemlerinizi korumak açısından kritik önem taşır.
Shodan Nedir ve Nasıl Çalışır?
Shodan, John Matherly tarafından 2009 yılında geliştirilen bir internet tarayıcısıdır. Ancak klasik web tarayıcılarından temel farkı, HTTP trafiği yerine tüm TCP/UDP portlarını tarayarak servis banner’larını yakalamasıdır. Yani bir web sunucusunun “Apache 2.4.51 üzerinde çalışıyor” demesi, bir IoT cihazının “Telnet açık” olduğunu ilan etmesi ya da bir endüstriyel kontrol sisteminin kendini dünyaya tanıtması, Shodan tarafından kayıt altına alınır.
Shodan’ın çalışma mantığı şu şekilde işler: Tarayıcıları düzenli aralıklarla IPv4 adres uzayını dolaşarak belirli portlara bağlantı dener. Bağlantı kurulduğunda dönen yanıt (banner), meta verilerle birlikte veritabanına işlenir. Bu meta veriler arasında IP adresi, port numarası, protokol, coğrafi konum, organizasyon bilgisi, ASN numarası ve zaman damgası bulunur.
Bir sistem yöneticisi olarak Shodan’a iki farklı perspektiften bakmanız gerekir. Birincisi, kendi altyapınızın dışarıdan nasıl göründüğünü anlamak için. İkincisi ise test ortamlarında veya CTF çalışmalarında saldırgan perspektifini benimsemek için. Bu yazıda her iki kullanım senaryosunu da ele alacağız.
Shodan CLI Kurulumu ve Temel Kullanım
Shodan’ın web arayüzü kullanışlı olsa da asıl güç, komut satırı aracında gizlidir. Python tabanlı olan Shodan CLI’yi kurmak oldukça basittir.
# Python pip ile kurulum
pip3 install shodan
# API anahtarını ayarla (shodan.io'dan kayıt olarak alabilirsiniz)
shodan init YOUR_API_KEY_HERE
# Hesap bilgilerini kontrol et
shodan info
API anahtarı aldıktan sonra temel arama yapmak için shodan search komutunu kullanabilirsiniz. Ücretsiz hesapla sınırlı sayıda arama yapılabildiğini, indirme özelliği için ücretli plan gerektiğini hatırlatmak isterim.
# Basit bir arama
shodan search "apache"
# Belirli bir IP hakkında bilgi alma
shodan host 8.8.8.8
# Arama sonuçlarını sadece IP adresleri olarak listele
shodan search --fields ip_str "nginx"
# Belirli bir ülkedeki açık Redis sunucularını bul
shodan search --fields ip_str,port,org "product:Redis country:TR"
Çıktıyı ham JSON formatında almak istediğinizde --format json parametresini ekleyebilirsiniz. Bu özellikle sonuçları başka araçlarla işleyeceğiniz durumlarda çok işe yarar.
Shodan Arama Filtreleri: Sorgularınızı Güçlendirin
Shodan’ın gerçek gücü, zengin filtre seçeneklerinden gelir. Doğru filtreleri bilmeden Shodan kullanmak, Google’ı sadece URL alanına “şey” yazarak kullanmak gibidir.
Temel filtreler ve kullanımları:
- country: Ülke kodu ile filtreleme.
country:TRTürkiye’deki sistemleri getirir - city: Şehire göre filtreleme.
city:Istanbul - org: Organizasyon adına göre.
org:"Turk Telekom" - port: Belirli bir port numarasına göre.
port:22 - product: Servis/ürün adına göre.
product:Apache - version: Versiyon numarasına göre.
version:2.4.51 - os: İşletim sistemine göre.
os:Windows - hostname: Hostname ile filtreleme.
hostname:.gov.tr - net: IP aralığına göre.
net:192.168.1.0/24 - before / after: Tarih filtresi.
after:2023-01-01 - vuln: CVE numarasına göre açık sistemler.
vuln:CVE-2021-44228
# Türkiye'deki açık MongoDB veritabanlarını bul
shodan search "product:MongoDB country:TR port:27017"
# .edu.tr uzantılı sitelerde çalışan Tomcat sunucuları
shodan search "product:Apache Tomcat hostname:.edu.tr"
# Log4Shell açığı olan sistemler
shodan search "vuln:CVE-2021-44228 country:TR"
# Varsayılan credential kullanan kameralar (araştırma amaçlı)
shodan search "has_screenshot:true port:554 country:TR"
Bu filtreleri kombine etmek, son derece özelleştirilmiş aramalar yapmanızı sağlar. Örneğin bir pentest görevi sırasında hedef organizasyonun sahip olduğu tüm açık servisleri tek bir komutla listeleyebilirsiniz.
Python API ile Gelişmiş Shodan Kullanımı
CLI yeterli gelmediğinde Python kütüphanesi devreye girer. Özellikle toplu sorgular, otomatik raporlama ve SIEM entegrasyonları için Python API kullanımı kaçınılmazdır.
import shodan
import json
# API bağlantısı kur
api = shodan.Shodan('YOUR_API_KEY')
# Kendi IP adresinizi kontrol edin
try:
my_ip = api.tools.myip()
host_info = api.host(my_ip)
print(f"IP: {host_info['ip_str']}")
print(f"Organizasyon: {host_info.get('org', 'Bilinmiyor')}")
print(f"Açık portlar: {[item['port'] for item in host_info['data']]}")
for item in host_info['data']:
print(f"nPort: {item['port']}")
print(f"Banner: {item.get('data', 'Veri yok')[:100]}")
except shodan.APIError as e:
print(f"Hata: {e}")
import shodan
import csv
from datetime import datetime
api = shodan.Shodan('YOUR_API_KEY')
def search_and_export(query, filename):
"""Arama sonuçlarını CSV dosyasına aktar"""
results = api.search(query)
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['IP', 'Port', 'Organizasyon', 'Ülke', 'Banner'])
for result in results['matches']:
writer.writerow([
result['ip_str'],
result['port'],
result.get('org', 'N/A'),
result.get('location', {}).get('country_name', 'N/A'),
result.get('data', '')[:200].replace('n', ' ')
])
print(f"Toplam {results['total']} sonuç bulundu")
print(f"İlk {len(results['matches'])} sonuç {filename} dosyasına aktarıldı")
# Örnek kullanım
search_and_export("product:nginx country:TR port:80", "nginx_tr_results.csv")
Bu script’i bir cron job’a bağlayarak düzenli tarama raporları üretebilirsiniz. Özellikle kurumsal ortamlarda “shadow IT” tespiti, yani IT ekibinin bilgisi dışında kurulan sistemlerin keşfi için çok değerlidir.
Gerçek Dünya Senaryosu: Kendi Altyapınızı Shodan’dan Koruyun
Bir gün müşterimizin sunucu altyapısında güvenlik denetimi yaparken Shodan üzerinden yaptığım taramada şoke edici bir şey gördüm. Şirketin geliştirme ortamındaki bir Elasticsearch instance’ı, yanlış yapılandırılmış güvenlik duvarı kuralı nedeniyle dünyaya açık kalmıştı ve üzerinde müşteri verileri bulunuyordu. Shodan bu sunucuyu zaten indekslemişti.
Bu tür durumları proaktif olarak tespit etmek için aşağıdaki yaklaşımı kullanabilirsiniz:
#!/bin/bash
# kendi_altyapim_kontrol.sh
# Organizasyonunuza ait IP bloklarını Shodan'da kontrol eder
ORG_NAME="Sirket Adiniz"
API_KEY="YOUR_API_KEY"
echo "=== Shodan Altyapı Kontrol Raporu ==="
echo "Tarih: $(date)"
echo ""
# Organizasyona ait açık servisleri listele
shodan search --fields ip_str,port,product,version
"org:"$ORG_NAME"" 2>/dev/null |
while IFS=$'t' read -r ip port product version; do
echo "[!] $ip:$port - $product $version"
done
# Kritik portları kontrol et
CRITICAL_PORTS="21 23 3389 5900 27017 6379 9200 5432 3306"
for port in $CRITICAL_PORTS; do
COUNT=$(shodan count "org:"$ORG_NAME" port:$port" 2>/dev/null)
if [ "$COUNT" -gt "0" ]; then
echo "[UYARI] Port $port üzerinde $COUNT açık sistem bulundu!"
fi
done
Bu script’i haftalık çalıştırarak altyapınızdaki değişiklikleri takip edebilirsiniz. Özellikle cloud ortamlarında yanlışlıkla public yapılan servisler için erken uyarı sistemi görevi görür.
Shodan Monitörü ile Sürekli İzleme
Shodan’ın bir diğer güçlü özelliği, belirttiğiniz IP aralıklarını sürekli monitör etmesidir. Web arayüzünden “Monitor” bölümünü kullanabileceğiniz gibi, API üzerinden de bu işlemi otomatize edebilirsiniz.
import shodan
import smtplib
from email.mime.text import MIMEText
api = shodan.Shodan('YOUR_API_KEY')
def check_new_ports(ip_address, known_ports):
"""Yeni açılan portları tespit et ve bildirim gönder"""
try:
host = api.host(ip_address)
current_ports = set([item['port'] for item in host['data']])
new_ports = current_ports - set(known_ports)
if new_ports:
alert_message = f"""
GÜVENLIK UYARISI!
IP: {ip_address}
Yeni açık portlar tespit edildi: {new_ports}
Zaman: {__import__('datetime').datetime.now()}
Detaylar:
"""
for item in host['data']:
if item['port'] in new_ports:
alert_message += f"nPort {item['port']}: {item.get('product', 'Bilinmiyor')}"
alert_message += f"nBanner: {item.get('data', '')[:100]}n"
print(alert_message)
# Burada e-posta veya Slack bildirimi gönderebilirsiniz
return new_ports
return set()
except shodan.APIError as e:
print(f"API Hatası: {e}")
return set()
# Bilinen güvenli portlar
bilinen_portlar = [80, 443, 22]
ip_listesi = ["203.0.113.1", "203.0.113.2"] # Örnek IP'ler
for ip in ip_listesi:
yeni_portlar = check_new_ports(ip, bilinen_portlar)
if yeni_portlar:
print(f"UYARI: {ip} adresinde yeni portlar: {yeni_portlar}")
Shodan Dorks: Tehlikeli Yapılandırmaların Keşfi
Google Dorks’a benzer şekilde, Shodan’da da belirli açıkları veya yanlış yapılandırmaları hedefleyen özel sorgular mevcuttur. Bunları kendi sisteminizi test etmek için kullanabilirsiniz.
Yaygın Shodan Dork örnekleri:
- Açık Redis sunucuları:
product:Redis Authentication disabled - Varsayılan şifreli Mongo:
product:MongoDB -authentication - Açık Elasticsearch:
product:Elasticsearch port:9200 - Cisco IOS cihazlar:
cisco-ios - Açık FTP servisleri:
product:ProFTPD port:21 country:TR - Wordpress admin panelleri:
http.title:"WordPress" port:80 country:TR - Açık VNC servisleri:
product:VNC has_screenshot:true
# Açık Kubernetes API server'ları (kendi ortamınızı test için)
shodan search "product:"Kubernetes" port:6443 country:TR"
# Açık Docker API'leri - son derece tehlikeli
shodan search "Docker Containers port:2375 country:TR"
# Default credentials kullanan Grafana instance'ları
shodan search "product:Grafana http.title:"Grafana" country:TR"
# Açık printer servisleri
shodan search "port:9100 product:"HP JetDirect""
Bu sorguları çalıştırdığınızda ne tür sonuçlar gördüğünüzü gözlemleyin. Özellikle Docker API’sinin 2375 portunda açık olduğu sistemler, tam root erişimine eşdeğer bir güvenlik açığı barındırır.
Penetrasyon Testi İş Akışına Shodan’ı Entegre Etmek
Shodan, bir pentest engagement’ının reconnaissance aşamasında inanılmaz zaman tasarrufu sağlar. Hedef sistemler hakkında aktif tarama yapmadan pasif bilgi toplamanıza olanak tanır. Bu özellikle IDS/IPS sistemlerini tetiklemeden bilgi toplama (OSINT) açısından değerlidir.
Tipik bir pentest recon akışı şu şekilde olabilir:
#!/bin/bash
# pentest_recon.sh - Pasif keşif scripti
# UYARI: Sadece yetkili olduğunuz sistemlerde kullanın!
TARGET_ORG="$1"
TARGET_DOMAIN="$2"
OUTPUT_DIR="recon_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"
echo "[*] Organizasyon bazlı Shodan taraması başlatılıyor: $TARGET_ORG"
# IP ve port bilgilerini topla
shodan search --fields ip_str,port,product,version,org
"org:"$TARGET_ORG"" > "$OUTPUT_DIR/services.txt"
echo "[*] Açık veritabanı servisleri kontrol ediliyor..."
for port in 3306 5432 27017 6379 9200 1521 1433; do
shodan search --fields ip_str,port,product
"org:"$TARGET_ORG" port:$port" >> "$OUTPUT_DIR/databases.txt"
done
echo "[*] Domain bazlı tarama: $TARGET_DOMAIN"
shodan search --fields ip_str,port,product,http.title
"hostname:.$TARGET_DOMAIN" > "$OUTPUT_DIR/domain_services.txt"
echo "[*] SSL sertifika bilgileri toplanıyor..."
shodan search --fields ip_str,ssl.cert.subject.cn,ssl.cert.expires
"ssl.cert.subject.cn:"$TARGET_DOMAIN"" > "$OUTPUT_DIR/ssl_certs.txt"
echo "[+] Recon tamamlandı. Sonuçlar: $OUTPUT_DIR/"
ls -la "$OUTPUT_DIR/"
Bu script çıktısını subfinder, amass gibi araçlarla birleştirdiğinizde kapsamlı bir attack surface haritası çıkarabilirsiniz. Ancak tekrar vurgulayayım: Bu araçları sadece yazılı yetki aldığınız sistemlerde kullanın.
Shodan Kullanımında Etik ve Yasal Sınırlar
Shodan’ın pasif bir araç olduğunu, yani sisteminize dokunmadan sadece halihazırda indekslenmiş bilgileri gösterdiğini unutmayın. Ancak bu bilgileri kullanarak aktif saldırı gerçekleştirmek başka bir konudur.
Yasal kullanım senaryoları:
- Kendi organizasyonunuzun altyapısını denetlemek
- Yetki belgesiyle gerçekleştirilen penetrasyon testleri
- Güvenlik araştırması ve akademik çalışmalar
- Bug bounty programları kapsamında araştırma
Kesinlikle yapılmaması gerekenler:
- İzinsiz sistemlere erişim denemesi
- Bulunan açıkları kötüye kullanmak
- Üçüncü taraf sistemleri hakkında toplanan bilgileri paylaşmak
- Shodan verilerini sosyal mühendislik için kullanmak
Türkiye’de Bilişim Suçları Kanunu kapsamında yetkisiz erişim ciddi hukuki sonuçlar doğurur. “Shodan’da gördüm, kamuya açık bilgiydi” savunması, aktif bir saldırıyı meşrulaştırmaz.
Nessus ve Shodan Entegrasyonu
Kurumsal ortamlarda Shodan verilerini Nessus veya OpenVAS gibi güvenlik açığı tarayıcılarıyla birleştirmek, çok daha kapsamlı bir güvenlik görünümü sağlar.
import shodan
import subprocess
import json
api = shodan.Shodan('YOUR_API_KEY')
def get_targets_for_nessus(org_name, output_file):
"""Shodan'dan IP listesi al, Nessus için hedef dosyası oluştur"""
results = api.search(f'org:"{org_name}"')
ip_set = set()
for result in results['matches']:
ip_set.add(result['ip_str'])
with open(output_file, 'w') as f:
for ip in ip_set:
f.write(f"{ip}n")
print(f"{len(ip_set)} hedef {output_file} dosyasına yazıldı")
return list(ip_set)
# Hedef IP'leri al
targets = get_targets_for_nessus("Hedef Organizasyon", "nessus_targets.txt")
# Nessus CLI ile tarama başlat (nessuscli mevcut ise)
# Bu sadece örnek amaçlıdır
print(f"Nessus taraması için {len(targets)} hedef hazırlandı")
print("Nessus'a import edebilirsiniz: nessus_targets.txt")
Sonuç
Shodan, doğru ellerde son derece güçlü bir güvenlik aracıdır. Kendi altyapınızın dışarıdan nasıl göründüğünü anlamak, saldırganlardan önce açıkları tespit etmek ve internet üzerindeki genel güvenlik durumunu kavramak için bu aracı mutlaka öğrenmelisiniz.
Pratik olarak yapmanızı önerdiklerim şunlar: Önce kendi organizasyonunuzun IP bloklarını ve domain adlarını Shodan’da aratın. Gördükleriniz sizi şaşırtabilir. Ardından düzenli kontroller için bu yazıdaki script’lerden birini cron job’a bağlayın. Son olarak geliştirme ekibinize Shodan’ın varlığını hatırlatın; test ortamının da dışarıdan erişilebilir olabileceğini unutuyorlar.
Güvenlik reaktif değil, proaktif bir disiplindir. Shodan’ı saldırganlar zaten kullanıyor. Soru şu: Siz de kullanıyor musunuz?
