binwalk -e firmware.bin && grep -r "password" ./_firmware.bin.extracted/
Bu komutu çalıştırdığında karşına çıkan o düz metin (clear-text) 'root:admin123' satırı, aslında milyarlarca dolarlık bir altyapının ne kadar ince bir ipliğe bağlı olduğunun kanıtıdır. IoT (Internet of Things) dünyasında işler web uygulamalarındaki gibi janjanlı 'Firewall'ların arkasına saklanarak yürümüyor. Burada kurallar sert, kaynaklar kısıtlı ve yapılan hatalar genellikle fiziksel dünyada yankı buluyor.
Bizim tarafta, yani Red Team operasyonlarında bir IoT cihazıyla karşılaştığımızda ilk yaptığımız şey cihazın 'ruhunu' dışarı çıkarmaktır. Firmware dediğimiz o yazılım bloğu, aslında cihazın tüm sırlarını barındıran bir kara kutu. Ama çoğu üretici bu kutunun kapağını açık unutuyor.
Firmware Analizi: Kutuyu Açmak
Sahada bir testCompany projesinde karşılaştığımız senaryoyu düşünelim. Elimizde bir IP kamera veya endüstriyel bir sensör var. İlk adım, bu cihazın firmware'ini ya üreticinin sitesinden indirmek ya da cihazın üzerindeki SPI flash çipinden dump etmektir. binwalk ile bu firmware'i parçalara ayırdığımızda, karşımıza genellikle minyatür bir Linux dağıtımı çıkar.
İşte asıl eğlence burada başlıyor. Çoğu geliştirici, geliştirme aşamasında kullandığı 'backdoor' hesaplarını veya test API anahtarlarını prodüksiyon ortamına giden firmware'in içinde bırakıyor.
Örnek bir etc/shadow dosyası içeriği düşünün:
root:$1$vG$7f8...:18234:0:99999:7:::
admin:$1$xy$2a1...:18234:0:99999:7:::
Bu hash değerlerini kırmak, günümüzün GPU güçleriyle bazen sadece birkaç saniye sürüyor. Eğer hash kırmakla uğraşmak istemiyorsan, dosya sisteminde grep ile yapacağın kısa bir tur sana çok daha fazlasını verebilir:
# Defanged/Zararsızlaştırılmış Örnek
grep -ri "api_key" .
grep -ri "aws_secret" .
grep -ri "mqtt_pass" .
MQTT: Güvenliğin Sessiz Katili
IoT cihazlarının birbiriyle konuşmak için en sevdiği protokol MQTT'dir. Hafiftir, hızlıdır ama düzgün konfigüre edilmezse tam bir felakettir. Çoğu kurulumda 'Authentication' (Kimlik Doğrulama) kapalıdır veya herkesin her konuya (topic) abone olmasına izin verilir.
Bir saldırganın ağa sızdığını ve test-broker.example.com adresindeki MQTT broker'ı dinlemeye başladığını varsayalım:
# Zararsızlaştırılmış Python/Paho-MQTT Dinleyici Örneği
import paho.mqtt.client as mqtt
def on_message(client, userdata, message):
print(f"Konu: {message.topic} | Veri: {message.payload.decode()}")
client = mqtt.Client("Pentest_Scanner")
client.connect("127.0.0.1", 1883) # Yerel mock IP
client.subscribe("#") # Tüm konulara abone ol (Wildcard)
client.on_message = on_message
client.loop_forever()
Bu basit betik, # wildcard karakteri sayesinde ağdaki tüm sensör verilerini, kapı kilit durumlarını, hatta bazen kullanıcı şifrelerini bile ekranına döker. Gerçek hayatta bu verilerin arasında fabrikanın kritik sıcaklık eşikleri veya bir akıllı kilidin açılma komutu olabilir.
Donanım Seviyesinde Sızma: UART ve JTAG
Yazılım katmanında kapılar kapalıysa, fiziksel katmana ineriz. Cihazın içini açtığımızda karşımıza çıkan o küçük 'pin'ler aslında birer giriş kapısıdır. UART (Universal Asynchronous Receiver-Transmitter) pinlerini bulup bir USB-TTL dönüştürücü ile bağlandığında, cihazın boot loglarını izleyebilir ve çoğu zaman şifresiz bir 'root shell' ile karşılaşırsın.
Eğer cihaz üreticisi UART'ı kapattıysa, bir sonraki durak JTAG'dir. JTAG ile doğrudan işlemcinin hafızasına müdahale edebilir, çalışma anında (runtime) kod enjekte edebilirsin. Bu, modern savunma mekanizmalarını (ASLR, DEP gibi) aşmak için kullanılan en 'geek' yöntemlerden biridir.
Peki, Ne Yapmalı? (Defensive Mindset)
Sadece açık bulmak yetmez, o kapıyı nasıl kapatacağımızı da bilmemiz lazım. testCompany projelerinde önerdiğimiz temel hardening adımları şunlar:
- Firmware Encryption: Firmware dosyalarını mutlaka şifreleyin. Binwalk ile içeri girilememeli.
- Hardcoded Credentials Yasak: Her cihaz için kurulum aşamasında benzersiz bir şifre (Unique per-device password) oluşturulmalı. 'admin/admin' dönemi 2000'lerde kaldı beyler.
- Secure Boot: Cihaz sadece imzalanmış ve güvenilir firmware'i çalıştırmalı. Fiziksel müdahale ile kod enjeksiyonunu engellemenin en sağlam yolu budur.
- MQTT TLS/Auth: MQTT trafiğini TLS ile şifreleyin ve mutlaka ACL (Access Control List) kullanarak hangi cihazın hangi konuya yazabileceğini kısıtlayın.
- Debug Portlarını Fiziksel Olarak Kapatın: Üretim bandından çıkan cihazlarda UART ve JTAG pinlerini devre dışı bırakın veya fiziksel erişimi zorlaştırın.
IoT güvenliği bir sprint değil, bir maraton. Cihazı piyasaya sürdüğün an güvenlik bitmiyor, aksine yeni başlıyor. Bir sonraki güncellemeyi (OTA - Over The Air) nasıl güvenli yapacağını düşünmüyorsan, o cihaz eninde sonunda bir botnet'in parçası olacaktır.
Kodu yazarken değil, saldırgan gibi düşünürken güvendesiniz. Bir sonraki teknik analizde görüşmek üzere.
