Sana çok samimi bir itirafla başlayayım: Bundan yaklaşık altı yıl önce, evdeki o meşhur 'akıllı' ampullerden birini aldığımda kendimi çok zeki hissediyordum. Ampulü kurdum, telefonumdan renklerini değiştirdim, hatta bir otomasyon bile yazdım. Ancak unuttuğum küçük bir detay vardı. Test laboratuvarımda denemeler yaparken, o dönem üzerinde çalıştığımız bir projede kullanılan IoT gateway cihazını doğrudan dış dünyaya açık bırakmıştım. Hem de üzerinde 'admin:admin' kombinasyonuyla! Sadece yirmi dakika sonra Shodan üzerinden cihazımı bulduğumda, bir botnet ağının çoktan kapımı tıkladığını fark ettim. O an anladım ki; IoT dünyasında 'küçük cihaz' demek, 'küçük risk' demek değilmiş. Aksine, bazen en zayıf halka tam da o cebindeki akıllı priz olabiliyor.
Bugün seninle bu 'nesnelerin interneti' denen vahşi batıya bir yolculuğa çıkalım. Ama merak etme, sadece sorunları değil, o sorunları nasıl analiz edeceğimizi ve nasıl önlem alacağımızı konuşacağız. Çayını kahveni al, 'testCompany' çatısı altında bir Red Team operasyonundaymışız gibi düşün.
IoT Neden Bu Kadar Kırılgan?
Aslında cevap basit: Maliyet ve zaman baskısı. Bir firma akıllı bir su ısıtıcısı üreteceği zaman, güvenliğe ayıracağı bütçeyi genellikle en sona bırakır. Donanım kısıtlıdır; işlemci gücü düşüktür, RAM azdır. Bu yüzden de TLS/SSL gibi 'ağır' protokoller yerine düz metin (cleartext) üzerinden haberleşen MQTT veya CoAP tercih edilir. Üstelik bu cihazların güncellenmesi tam bir kabustur. Kullanıcıdan firmware dosyasını indirip, bir kabloyla bağlayıp güncellemesini beklemek? Hadi ama, kimse bunu yapmaz.
Bir Saldırgan Gözüyle IoT Cihazı Analizi
Bir Red Team operasyonunda karşımızda bir IoT cihazı varsa, genellikle şu üç aşamadan geçeriz:
- Ağ Keşfi ve Protokol Analizi: Cihaz hangi portları açıyor? Dış dünya ile nasıl konuşuyor?
- Firmware Analizi (Tersine Mühendislik): Cihazın 'beynine' inip içinde ne sakladığını görmek.
- Fiziksel Saldırılar: UART, JTAG gibi portlar üzerinden cihazla 'konuşmak'.
Gel, bu aşamalara teknik bir gözle bakalım.
1. Ağdaki Sessiz Misafir: Nmap ve Keşif
Cihazı ağa bağladığında ilk yapacağın şey, onun ne kadar 'geveze' olduğunu anlamaktır. Genellikle bu cihazlar UPnP üzerinden kendilerini duyururlar. Basit bir tarama ile başlayalım:
# Cihazın IP'si 192.168.1.50 olsun (zararsızlaştırılmış örnek)
nmap -sV -p- 192.168.1.50
Eğer şanslıysan (veya üretici şanssızsa), karşında 23 (Telnet), 80 (HTTP) veya 1883 (MQTT) portlarını göreceksin. Özellikle MQTT portu bir altın madenidir. MQTT, hafif bir mesajlaşma protokolüdür ve genellikle şifresiz kullanılır. Eğer cihaz 'Topic'leri doğru yetkilendirmemişse, tüm trafiği dinleyebilirsin.
# MQTT trafiğini dinlemek için basit bir komut
# Not: example.com ve 1883 temsilidir.
mosquitto_sub -h 127.0.0.1 -t "#" -v
Bu komutu çalıştırdığında, ağdaki tüm cihazların birbirine gönderdiği "Sıcaklık 22 derece", "Kapı kilidi açıldı" gibi mesajları patır patır görebilirsin. Kötü niyetli birinin bu mesajları manipüle ettiğini düşünsene? mosquitto_pub ile kapı kilidini açma komutu göndermek sadece bir saniye sürer.
2. Firmware İçinde Define Avı
Cihazın web arayüzünden veya üreticinin sitesinden firmware dosyasını indirdiğini varsayalım. Bu dosya genellikle sıkıştırılmış bir dosya sistemidir. İçinde ne var? Hardcoded şifreler, API anahtarları, belki de geliştiricinin unuttuğu bir SSH anahtarı...
Bunu analiz etmek için favori aracımız binwalk:
# Firmware dosyasını analiz et ve içindekileri dışarı aktar
binwalk -e firmware_v1.bin
Dosya sistemini açtıktan sonra /etc/shadow veya /etc/passwd dosyalarına bakmak ilk işindir. Eğer orada bir root kullanıcısı ve hashlenmiş bir şifre varsa, John the Ripper veya Hashcat ile bu şifreyi kırmak sadece dakikalar alabilir. Genellikle bu şifreler 123456, password veya markanın adı gibi komik şeyler çıkar. Gülme, gerçekten öyle!
3. Kod Seviyesinde Güvenlik: Örnek Bir Açık
Birçok IoT cihazı, web arayüzünden aldığı veriyi doğrudan sistem komutlarına gönderir. İşte sana klasik bir Command Injection örneği (Pseudo-code):
# ZAFİYETLİ KOD ÖRNEĞİ
@app.route('/set_wifi')
def set_wifi():
ssid = request.form.get('ssid')
# Girdiyi temizlemeden doğrudan shell'e gönderiyor
os.system(f"wifi_connect.sh {ssid}")
return "Bağlanıyor..."
Eğer bir saldırgan SSID kısmına ; rm -rf /; gibi bir girdi verirse ne olur? Geçmiş olsun. Bunun yerine her zaman girişleri sanitize etmeli veya subprocess gibi daha güvenli kütüphaneler kullanmalısın.
Nasıl Korunacağız? (Defensive Mindset)
Tamam, saldırmak eğlenceli ama bizim asıl işimiz korumak. 'testCompany' olarak müşterilerimize her zaman şu tavsiyeleri veriyoruz:
- VLAN Ayrımı: IoT cihazlarını ana ağından ayır. Akıllı buzdolabın, içinde hassas verilerinin olduğu bilgisayarla aynı ağda olmamalı. Olası bir sızmada 'lateral movement' (yanal ilerleme) riskini minimize edersin.
- UPnP'yi Kapat: Yönlendiricindeki (Router) UPnP özelliğini kapat. Cihazların kafasına göre dış dünyaya port açmasına izin verme.
- Default Şifreleri Değiştir: Bunu söylemekten dilimde tüy bitti ama hala en büyük sorun bu. Cihazı kutusundan çıkardığın an şifresini değiştir.
- Firmware Güncelliği: Cihazların güncellemelerini takip et. Eğer bir üretici 2 yıldır güncelleme yayınlamıyorsa, o cihaz artık bir 'zombi' olma adayıdır.
Son Söz
IoT güvenliği, sadece karmaşık şifreleme algoritmalarıyla ilgili değil; daha çok temel hijyen kurallarıyla ilgili. Bir Red Teamer olarak şunu söyleyebilirim ki; kapıyı kilitleseniz bile pencereleri açık unuttuğunuz sürece güvende değilsiniz. Ve o küçük, masum görünümlü akıllı ampul, bazen en büyük penceredir.
Bir sonraki yazıda, bu cihazların donanımsal portlarına (UART/JTAG) nasıl 'sızacağımızı' daha detaylı konuşuruz belki. Şimdilik ağını temiz, cihazlarını güncel tut!
