Modbus TCP 0x05 (Write Single Coil) komutu ağda düz metin olarak uçmaya başladığında, o vana üzerindeki kontrolünü çoktan kaybetmişsindir; artık sadece fiziksel dünyanın dijital kaosa nasıl tepki vereceğini izlersin.
Selam millet, bugün biraz 'sahaya' iniyoruz. Ama öyle veri merkezi koridorlarındaki soğuk havadan değil, fabrikaların o gürültülü, tozlu ve 'eski toprak' PLC (Programmable Logic Controller) kokan havasından bahsediyorum. OT (Operational Technology) güvenliği denilince genelde insanların aklına çok komplike, imkansız saldırılar geliyor. Oysa gerçek şu ki; IT dünyasında 90'larda bıraktığımız o 'güvenliksiz tasarım' (security by design - or lack of it) hatası, OT dünyasında hala altın çağını yaşıyor.
OT ve IT: İki Farklı Gezegen
IT dünyasında 'CIA' (Confidentiality, Integrity, Availability) üçlüsünün tepesinde 'Confidentiality' (Gizlilik) vardır. Veri çalınmasın yeter. OT'de ise bu hiyerarşi takla atar. En tepede 'Availability' ve daha da önemlisi 'Safety' (Güvenlik/Emniyet) yer alır. Bir PLC'yi güncelleyeceğim diye sistemi kapatamazsın. O sistem 20 yıldır çalışıyordur ve kapatırsan bir daha açılıp açılmayacağı meçhuldür.
Bir Red Teamer olarak testCompany bünyesinde yaptığım çalışmalarda şunu gördüm: Endüstriyel ağlara sızmak, çoğu zaman bir Windows domainini ele geçirmekten çok daha zahmetsiz. Neden mi? Çünkü endüstriyel protokollerin %90'ında kimlik doğrulama (authentication) diye bir kavram yok. Paketi gönderen kim? Kaynak IP güvenilir mi? Payload içinde ne var? PLC bunların hiçbirine bakmaz. O sadece 'gelen komutu uygula' mottosuyla çalışır.
Protokollerin Karanlık Dünyası: Modbus Örneği
Modbus, endüstriyel dünyadaki 'İngilizce' gibidir; herkes bilir, herkes kullanır ama kimse şifrelemez. 502 portundan akan bu trafik, bir saldırgan için açık büfedir. Bir PLC'nin register'larına yazmak için karmaşık exploit'lere ihtiyacın yok. Sadece doğru paketi, doğru register adresine göndermen yeterli.
Bakın, aşağıda Scapy ile yazılmış, bir PLC'nin coil (bobin/anahtar) durumunu değiştirmeye yönelik 'zararsızlaştırılmış' bir Python script'i var. Bu kod, sahada görebileceğiniz saldırıların temel mantığını temsil ediyor:
# EĞİTİM AMAÇLI MOCK KOD - ZARARSIZLAŞTIRILMIŞTIR
from scapy.all import IP, TCP, send
# Hedef PLC IP'si (Zararsızlaştırılmış)
target_ip = "127.0.0.1"
target_port = 502
# Modbus TCP Header Yapısı
# Transaction ID: 0x0001, Protocol ID: 0x0000, Length: 0x0006, Unit ID: 0x01
# Function Code: 0x05 (Write Single Coil), Reference Address: 0x0001, Data: 0xff00 (ON)
modbus_payload = b"\x00\x01\x00\x00\x00\x06\x01\x05\x00\x01\xff\x00"
packet = IP(dst=target_ip)/TCP(dport=target_port)/modbus_payload
# Bu paket gönderildiğinde, PLC 1 numaralı anahtarı aktif hale getirir.
# send(packet)
print("Defanged Modbus paketi hazırlandı ama gönderilmedi.")
Buradaki temel sorun şu: Ağın herhangi bir yerinden (belki bir mühendislik istasyonundan, belki de yanlış konfigüre edilmiş bir Wi-Fi access point üzerinden) bu paketi gönderen herkes, fiziksel bir süreci tetikleyebilir.
'Air-Gap' Bir Güvenlik Önlemi Değildir, Bir İllüzyondur
Yıllardır duyduğumuz o meşhur savunma: "Ama bizim sistemlerimiz internete bağlı değil, hava boşluğu (air-gap) var." Abi, Stuxnet'i ne çabuk unuttunuz? USB bellekler, teknisyenlerin 'bakım' için getirdiği laptoplar, hatta binadaki akıllı aydınlatma sistemleri bile o boşluğu köprülemek için yeterli.
Bir sızma testinde testCompany sahasında şunu fark etmiştik: Kazan dairesindeki kontrol paneli internete bağlı değildi, evet. Ama binadaki IP kameralar ile PLC'lerin bağlı olduğu switch aynı VLAN üzerindeydi. Kameradaki bir zafiyet üzerinden (default şifre klasiği) ağa dahil olduktan sonra, 'air-gap' dediğimiz o duvar kağıttan bir kaleye dönüştü.
PLC Logic Hijacking: İşin Rengi Değişiyor
Sadece komut göndermekle yetinmeyen, PLC'nin içindeki programı (logic) değiştirmeyi hedefleyen saldırılar asıl kabus senaryosudur. S7Comm (Siemens) veya CIP (EtherNet/IP) gibi protokollerde, PLC'nin çalışma mantığını doğrudan overwrite edebilirsin.
Örneğin, bir tankın basıncı 100 barı geçtiğinde vanayı açması gereken mantığı, 200 bar yapacak şekilde güncellediğini düşün. SCADA ekranında her şey normal görünür (çünkü saldırgan aynı zamanda SCADA'ya giden veriyi de manipüle edebilir - bkz: Man-in-the-Middle), ama sahada metal yorgunluğu ve patlama riski başlar.
Nasıl Korunacağız? (Defensive Security Hatırlatması)
Bu kadar korku filmi yeter, biraz da bu canavarı nasıl ehlileştireceğimize bakalım. OT güvenliği, IT'den aldığımız araçları oraya kopyalamakla olmaz. PLC'ye antivirüs kuramazsın. O zaman ne yapacaksın?
- DPI (Deep Packet Inspection) Destekli IDS: Standart bir firewall '502 portu açık mı?' diye bakar. Bizim 'Bu Modbus paketi neden normalden 50 kat daha fazla register okumaya çalışıyor?' diye soran sistemlere ihtiyacımız var.
- Ağ Segmentasyonu (Purdue Model): Mühendislik istasyonu ile kurumsal ağ arasına sadece bir firewall koymak yetmez. DMZ bölgeleri oluşturulmalı ve protokol bazlı kısıtlamalar getirilmelidir.
- Baselines ve Anomalies: Normal bir çalışma gününde PLC kaç paket alır? Hangi saatlerde program güncellemesi yapılır? Bu 'normal'i öğrenip, dışına çıkan her hareketi alert olarak düşürmek kritik.
- Fiziksel Güvenlik: USB portlarını kapatmak, açıkta switch bırakmamak gibi 'geleneksel' yöntemler OT'de hala en etkili savunma hatlarından biridir.
Son Söz Yerine
Endüstriyel siber güvenlik, artık sadece 'beyaz önlüklü amcaların' işi değil. Biz siber güvenlikçilerin de TCP/IP'den biraz kafamızı kaldırıp, o aşağıda dönen çarkların dijital karşılıklarını (ladder logic, function blocks) anlamamız gerekiyor. Unutmayın, bir web sitesi çökerse '404 Not Found' alırsınız; bir su arıtma tesisi çökerse tüm şehir susuz kalır.
Siz siz olun, 'bu sistem dışarı kapalı' diyenlere gülümseyin ve o switch'in arkasında ne dönüyor diye bakmaya devam edin. Güvenli kalın, ama güvenli kalın!
