Gereksinimler ve Ön Hazırlık
Bu eğitime başlamadan önce sisteminizde Python 3.10 veya daha yeni bir sürümün yüklü olması gerekmektedir. Shodan API'sine erişmek için bir Shodan hesabı oluşturmalı ve API anahtarınızı (API Key) panelinizden almalısınız. API anahtarlarınızı asla kodun içerisinde açık metin olarak saklamayın; bunun yerine ortam değişkenlerini (environment variables) kullanın.
Kurulum için terminalinizde aşağıdaki komutu çalıştırarak kütüphaneyi yükleyin:
pip install shodan
Kurulumun başarılı olduğunu doğrulamak için Python terminalinde import shodan komutunu çalıştırın. Hata almadıysanız, kütüphane kullanıma hazırdır. Güvenlik gereği, API anahtarınızı .env dosyasına kaydedip python-dotenv kütüphanesi ile çağırmanız önerilir.
Shodan API Bağlantısı ve İlk Sorgu
Shodan ile etkileşime geçmek için öncelikle bir istemci (client) nesnesi oluşturmanız gerekir. Bu nesne, tüm sorgularınızın merkezini oluşturur. Aşağıdaki kod bloğu, bağlantının nasıl kurulacağını ve basit bir IP sorgusunun nasıl yapılacağını göstermektedir.
import shodan
import os
# API anahtarını güvenli bir şekilde çekin
SHODAN_API_KEY = os.getenv('SHODAN_API_KEY')
api = shodan.Shodan(SHODAN_API_KEY)
try:
# Belirli bir IP adresini sorgulama
host = api.host('8.8.8.8')
print(f"IP: {host['ip_str']}")
print(f"Organizasyon: {host.get('org', 'Bilinmiyor')}")
except shodan.APIError as e:
print(f"Hata oluştu: {e}")
Bu kodda, Shodan'ın host() metodu ile hedef IP'nin temel bilgilerini çekiyoruz. try-except bloğu, API limitlerine takılmanız veya geçersiz bir IP girmeniz durumunda programın çökmesini engeller.
Belirli Bir Ağ Bloğunda Tarama Yapma
Ağ güvenlik taraması yaparken genellikle tek bir IP yerine, bir organizasyona ait IP bloklarını (subnet) incelemek istersiniz. Shodan'ın arama fonksiyonu, belirli filtrelerle (ports, country, org) karmaşık sorgular yapmanıza izin verir.
# Belirli bir organizasyon ve port üzerinde arama
query = "org:\"Google\" port:443"
results = api.search(query)
print(f"Toplam sonuç sayısı: {results['total']}")
for result in results['matches']:
print(f"IP: {result['ip_str']} - Port: {result['port']}")
Burada api.search() fonksiyonunu kullanarak, Google'a ait ve 443 numaralı portu açık olan cihazları listeletiyoruz. Bu yöntem, geniş ağ yüzeylerinde zafiyet analizi yapmak için başlangıç noktasıdır.
Shodan Verileri ile Zafiyet Analizi
Shodan, cihazların üzerinde çalışan servislerin versiyon bilgilerini ve varsa bilinen zafiyetlerini (CVE - Common Vulnerabilities and Exposures) döner. Bu verileri işleyerek sistemlerinizdeki riskli yapılandırmaları tespit edebilirsiniz.
# Belirli bir IP üzerindeki zafiyetleri listeleme
ip_address = '1.1.1.1'
host = api.host(ip_address)
if 'vulns' in host:
for vuln in host['vulns']:
print(f"Zafiyet ID: {vuln}")
else:
print("Bu IP üzerinde bilinen bir zafiyet bulunamadı.")
Bu kod, host nesnesi içerisindeki vulns anahtarını kontrol eder. Eğer cihazda Shodan tarafından tespit edilmiş bir zafiyet varsa, bunları listeleyerek raporlama yapmanıza olanak tanır.
Veri Görselleştirme ve Raporlama
Topladığınız verileri anlamlı hale getirmek için JSON formatında dışa aktarmak veya bir tablo yapısında sunmak önemlidir. Aşağıdaki örnek, sorgu sonuçlarını basit bir tablo formatında düzenler.
import pandas as pd
data = []
for service in results['matches']:
data.append({
'IP': service['ip_str'],
'Port': service['port'],
'Servis': service.get('product', 'Bilinmiyor')
})
df = pd.DataFrame(data)
print(df.head())
pandas kütüphanesi, büyük veri setlerini analiz etmek için idealdir. Bu sayede ağınızdaki hangi portun hangi servis tarafından kullanıldığını hızlıca filtreleyebilirsiniz.
Kritik Güvenlik Uyarısı: Shodan üzerinden yaptığınız tüm aramalar, Shodan'ın kendi veritabanına karşı yapılır. Kendi ağınız dışındaki sistemlere yönelik tarama yaparken yasal sınırları ihlal etmediğinizden emin olun. Yetkisiz ağ taraması birçok ülkede yasal yaptırımlara tabidir.
Yöntem Karşılaştırma Tablosu
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Host Sorgusu | Hızlı ve detaylı bilgi | Tekil IP ile sınırlı |
| Search Filtreleri | Geniş ağ analizi | API kredi tüketimi yüksek |
| CVE Analizi | Zafiyet odaklı | Veri güncelliğine bağlı |
Sıkça Sorulan Sorular
Shodan API anahtarım neden çalışmıyor?
API anahtarınızın aktif olduğunu ve hesabınızda yeterli kredinizin bulunduğunu kontrol edin. Ayrıca, anahtarı kopyalarken başında veya sonunda boşluk kalmadığından emin olun.
Kendi ağımı Shodan'dan nasıl kaldırabilirim?
Shodan, internete açık olan verileri indeksler. Eğer cihazlarınızın görünmesini istemiyorsanız, güvenlik duvarı (firewall) kurallarınızı güncellemeli veya ilgili portları dış dünyaya kapatmalısınız.
Shodan taramaları yasal mı?
Shodan bir arama motorudur. Sadece halka açık verileri indeksler. Bu verileri izlemek yasaldır, ancak bu verileri kullanarak sistemlere sızmaya çalışmak veya izinsiz müdahalede bulunmak yasal suç teşkil eder.
API limitlerine takılırsam ne yapmalıyım?
Shodan'ın ücretsiz planı sınırlı sorgu hakkı sunar. Daha fazla veri için kurumsal planlara geçebilir veya sorgularınızı daha spesifik (filtreli) hale getirerek kredi tasarrufu yapabilirsiniz.
Python ile tarama yaparken hızımı nasıl artırırım?
Döngü içerisinde çok fazla istek göndermek yerine, Shodan'ın sunduğu toplu (bulk) arama özelliklerini kullanın ve gereksiz API çağrılarını azaltmak için verileri yerel bir veritabanında önbelleğe alın.
Sorumluluk Reddi: Bu makalede paylaşılan kodlar yalnızca eğitim amaçlıdır. Yazılım geliştirme ve güvenlik testleri sırasında oluşabilecek veri kayıpları veya yasal sorunlardan kullanıcı sorumludur. Her zaman etik hacker kurallarına uyun.
Shodan Verilerini SQLite ile Kalıcı Hale Getirme
Shodan API üzerinden gelen verilerin anlık olarak işlenmesi, büyük çaplı taramalarda API limitlerine takılmanıza veya verilerin kaybolmasına neden olabilir. Bu nedenle, gelen JSON yanıtlarını yerel bir SQLite veritabanında saklamak, geçmişe dönük analiz yapmanıza ve ağınızdaki değişimleri (drift) izlemenize olanak tanır.
Aşağıdaki kod örneği, Shodan'dan gelen sonuçları otomatik olarak bir SQLite veritabanına kaydeden bir yapıyı göstermektedir:
import sqlite3
import shodan
def save_to_db(data):
conn = sqlite3.connect('shodan_data.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS devices
(ip TEXT, org TEXT, port INTEGER, product TEXT)''')
for item in data['matches']:
cursor.execute("INSERT INTO devices VALUES (?, ?, ?, ?)",
(item['ip_str'], item.get('org', 'N/A'), item['port'], item.get('product', 'N/A')))
conn.commit()
conn.close()
# API kullanımı ve veritabanına aktarım
api = shodan.Shodan('API_ANAHTARINIZ')
results = api.search('org:"KurumAdı"')
save_to_db(results)
print("Veriler başarıyla veritabanına kaydedildi.")
İleri Seviye Hata Ayıklama ve İstisna Yönetimi
Shodan API ile çalışırken ağ kesintileri, geçersiz API anahtarları veya limit aşımları gibi durumlarla karşılaşmak kaçınılmazdır. Profesyonel bir tarama betiği, bu tür hataları yönetebilmeli ve işlemin yarıda kalmasını engellemelidir. shodan.APIError sınıfını kullanarak hataları yakalamak, sistemin kararlılığını artırır.
Hata Yönetimi İçin Örnek Yapı
Aşağıdaki kod bloğu, API çağrılarını bir try-except bloğu içerisine alarak, olası bağlantı hatalarını loglamanızı sağlar:
import shodan
import logging
logging.basicConfig(level=logging.INFO)
def secure_shodan_query(query):
api = shodan.Shodan('API_ANAHTARINIZ')
try:
results = api.search(query)
return results
except shodan.APIError as e:
logging.error(f"Shodan API hatası: {e}")
return None
except Exception as e:
logging.error(f"Beklenmeyen bir hata oluştu: {e}")
return None
data = secure_shodan_query('port:443')
if data:
print(f"Toplam {data['total']} cihaz bulundu.")
Dağıtık Tarama ve Performans Optimizasyonu
Eğer çok geniş bir IP bloğunu tarıyorsanız, tek bir thread üzerinden yapılan sorgular uzun sürecektir. Python'un concurrent.futures kütüphanesini kullanarak sorguları paralel hale getirebilirsiniz. Ancak, Shodan API'nin saniye başına sorgu (QPS) limitlerine dikkat etmeniz gerektiğini unutmayın.
| Yöntem | Avantajı | Dikkat Edilmesi Gereken |
|---|---|---|
| Senkron (Döngüsel) | Basit ve hatasızdır. | Yavaştır, büyük veride zaman aşımı olur. |
| Asenkron (Threading) | Hızlıdır, CPU'yu verimli kullanır. | API limitlerine takılma riski yüksektir. |
İpucu: API limitleriniziapi.info()metodunu kullanarak düzenli olarak kontrol edin. Eğer limitiniz dolmak üzereyse,time.sleep()fonksiyonu ile betiğinizi bir süreliğine bekletmek, hesabınızın geçici olarak engellenmesini önleyecektir.
Sonuç
Python ile Shodan kütüphanesini kullanarak ağ güvenliği taraması yapmak, savunma odaklı bir güvenlik stratejisi geliştirmenin en etkili yollarından biridir. Bu rehberde, bağlantı kurma, hedef odaklı tarama, zafiyet tespiti ve veri raporlama süreçlerini adım adım inceledik. Bir sonraki adım olarak, topladığınız verileri bir veritabanına (SQLite veya PostgreSQL) kaydederek, ağınızdaki değişiklikleri zaman içinde izleyen bir "Sürekli İzleme Sistemi" (Continuous Monitoring) geliştirmeyi deneyebilirsiniz.

Yorumlar (0)
Yorum Yaz