Selam millet, bugün biraz can yakacak bir konuya, IoT (Internet of Things) dünyasına gireceğiz. Ama öyle 'akıllı prizim hacklendi, ışıklar yanıp söndü' tadında bir makale beklemeyin. Sahadaki tecrübelerimden biliyorum ki, IoT güvenliği dendiğinde herkesin elinde bir Shodan, herkes 'admin:admin' peşinde. Beyler, açık konuşalım: Shodan üzerinden açık port arayıp sevinmek siber güvenlikçilik değil, sadece vitrine bakmaktır. Asıl rezalet depoda, yani o cihazın içine gömülmüş, yıllardır güncellenmemiş, derme çatma firmware dosyalarında saklı. Prod ortamında Shodan raporlarına güvenip 'güvendeyiz' diyen bir CISO görürseniz oradan koşarak uzaklaşın.
Firmware: Çöplüğün İçindeki 'Root' Şifresi
IoT cihazlarının en büyük dramı firmware dosyalarıdır. Çoğu üretici, bir Linux kernel'ını alıp içine kendi yarım yamalak kodlarını ekleyip 'işte oldu' diyerek piyasaya sürüyor. Bir Red Team operasyonunda karşımıza bir akıllı kamera veya endüstriyel bir sensör çıktığında, ilk yaptığımız şey cihazın firmware'ini çekmektir. Genellikle üreticinin sitesinden bir .bin veya .img dosyası olarak indiririz.
Eğer şanslıysak (ki %90 şanslıyızdır), dosya şifrelenmemiştir. binwalk dediğimiz o efsane aracı üzerine bir salarız, gerisi çorap söküğü. Bakın, testCompany bünyesinde yaptığımız bir laboratuvar çalışmasında, piyasada çok satan bir router'ın firmware'ini şu komutla deşifre etmiştik:
# Firmware içindeki dosya sistemini ayıklıyoruz
binwalk -e firmware_v1.0.bin
Bu komut sonrası karşınıza çıkan squashfs-root klasörü, o cihazın beynidir. İçeri girdiğinizde ne görürsünüz biliyor musunuz? /etc/shadow dosyasında 'root' kullanıcısının şifresinin 123456 olduğunu veya daha kötüsü, geliştiricinin 'lazım olur' diye bıraktığı bir arka kapı (backdoor) script'ini.
Mesela şöyle bir şey:
# Geliştiricinin unuttuğu o muazzam 'debug' kodu (Mock/Pseudo)
def handle_debug_request(data):
if data == "GOD_MODE_ON":
import os
os.system("/bin/sh -i") # Tebrikler, artık cihazın sahibisiniz.
Protokollerin Sefaleti: MQTT ve Unutulan Topicler
IoT cihazları birbiriyle konuşurken genelde MQTT (Message Queuing Telemetry Transport) kullanır. Hafif bir protokoldür, candır. Ama eğer siz bu protokolü TLS kullanmadan, şifresiz bir şekilde 1883 portundan dünyaya açarsanız, o 'akıllı' fabrikanız bir anda 'herkese açık' bir lunaparka döner.
Bir sızma testinde, hedef ağdaki MQTT broker'ına bağlanıp tüm mesajları dinlemek için şu basit komutu kullanırız:
# Tüm başlıkları (topic) dinlemeye alıyoruz
mosquitto_sub -h 127.0.0.1 -p 1883 -t "#" -v
Burada # joker karakteriyle cihazın tüm ruhunu okursunuz. 'Cihaz_X/status', 'Cihaz_Y/config', hatta bazen 'Kullanici/Sifre' gibi veriler havada uçuşur. Saldırgan sadece izlemekle kalmaz; aynı zamanda mesaj da basabilir.
# Cihazı resetleme komutu gönderiyoruz (Zararsızlaştırılmış örnek)
mosquitto_pub -h 127.0.0.1 -t "home/security/alarm" -m "DISARM"
Siz evde mışıl mışıl uyurken birisi MQTT üzerinden alarmınızı devre dışı bırakıyor. Neden? Çünkü güvenliği 'erişilemezlik' sanan bir mühendis TLS kurmayı 'zahmetli' bulmuş.
Donanıma Dokunmak: UART ve JTAG'in Gücü
Yazılımsal olarak bir şey bulamadınız mı? Sorun değil, fiziksel erişim her zaman kazandırır. Cihazın kasasını açtığınızda o minik pinleri görürsünüz. UART (Universal Asynchronous Receiver-Transmitter) pinleri, cihazla seri haberleşme kurmamızı sağlar. Bir USB-TTL dönüştürücüyle bu pinlere bağlandığınızda, cihazın boot sürecini izleyebilir, hatta bazen doğrudan bir root shell alabilirsiniz.
Şu terminal görüntüsü size tanıdık gelebilir:
U-Boot 2021.01 (Oct 10 2023 - 12:00:00)
Press any key to stop autoboot: 0
# _
O '0' saniyesinde bir tuşa basarsanız, kernel parametrelerini değiştirip sistemi tek kullanıcı modunda (init=/bin/sh) başlatabilir ve şifre sormadan içeri dalabilirsiniz. Bu, bir binanın ön kapısına 10 tane kilit vurup arka duvarı kartondan yapmak gibidir.
Peki Ne Yapacağız? (Defensive Mindset)
Şimdi gelelim işin savunma kısmına. 'Sedat abi çok gömdün, yok mu bunun bir yolu?' derseniz, var elbet. Ama bu yol, sadece firewall kurmaktan geçmiyor.
- Firmware Hardening: Firmware dosyasını build ederken gereksiz tüm servisleri (Telnet, FTP, Debug portları) kapatın. Dosya sistemini şifreleyin ve 'Signed Firmware' (İmzalı Firmware) kullanın. Cihaz, imzası doğrulanmamış bir güncellemeyi asla kabul etmemeli.
- Secret Management: Kodun içine asla ama asla API key, şifre veya private key gömmeyin. Bunları cihaz ilk açıldığında (provisioning aşamasında) güvenli bir şekilde (örneğin bir TPM modülü kullanarak) almasını sağlayın.
- Network Isolation: IoT cihazlarını ana iş ağınızdan ayırın. VLAN kullanmak bir lüks değil, zorunluluktur. Cihazların internete çıkışını sadece gerekli olan
example.comgibi belirli adreslerle kısıtlayın. - MQTT Güvenliği: MQTT broker üzerinde mutlaka
Username/Passwordkontrolü yapın ve TLS (Port 8883) kullanın. ACL (Access Control List) tanımlayarak hangi cihazın hangi topic'e yazabileceğini sınırlayın.
IoT dünyası vahşi batı gibi; herkes kendi kanununu yazıyor. Ama unutmayın, o 'akıllı' dediğiniz her cihaz aslında içinde bir parça zafiyet barındıran küçük birer bilgisayar. Eğer siz onları korumazsanız, onlar sizin ağınıza sızmak için en mükemmel köprüler olacaklar.
Bir sonraki yazıda donanım korsanlığının daha derinlerine, PCB yollarındaki o sinyalleri nasıl manipüle ettiğimize gireriz. Şimdilik IoT cihazlarınıza bir de bu gözle bakın. Görüşmek üzere!
