Autor del tema
#0
Global Offset Table (GOT) Nedir?
Global Offset Table (GOT), ELF formatındaki ikili dosyaların dinamik bağlantı mekanizmasının önemli bir bileşenidir. Programın harici kütüphanelerdeki fonksiyonları çağırmasını kolaylaştırır. Bir program `printf` gibi bir kütüphane fonksiyonunu ilk kez çağırdığında, yürütülebilir dosyadaki sembolik isim çözümlenir ve kütüphanedeki gerçek fonksiyonun bellek adresi bulunur. Bu adres daha sonra GOT'a yazılır. Sonraki çağrılarda, program doğrudan GOT'a bakar ve fonksiyona doğrudan atlar. Bu yapı, hem bellek tasarrufu sağlar hem de kütüphanelerin farklı bellek adreslerine yüklenebilmesine olanak tanır. Kısacası, GOT, bir nevi dış fonksiyonlara giden köprü işlevi görür.
GOT Hijacking Temelleri
GOT Hijacking, dinamik olarak bağlı ikili dosyalardaki bu kritik tablonun manipüle edilmesiyle gerçekleştirilen bir güvenlik açığıdır. Saldırgan, bir bellek yazma zafiyetini (örneğin, format string zafiyeti veya buffer overflow) kullanarak GOT içindeki bir fonksiyon girişini hedef alır. Başka bir deyişle, meşru bir kütüphane fonksiyonuna işaret eden adresi, kendi kötü amaçlı kodunun (shellcode) bulunduğu adrese dönüştürür. Sonuç olarak, program orijinal fonksiyonu çağırdığında, bunun yerine saldırganın kodunu çalıştırır. Bu teknik, saldırganlara hedef sistem üzerinde tam kontrol sağlama potansiyeli sunar; bu nedenle siber güvenlik dünyasında oldukça önemli bir yere sahiptir.
Zafiyetin Tespiti ve Analizi
GOT Hijacking saldırısı için öncelikle hedef sistemde bir bellek yazma zafiyeti bulunmalıdır. Bu zafiyet, bir buffer overflow, format string açığı veya heap manipülasyonu şeklinde karşımıza çıkabilir. Güvenlik araştırmacıları, kaynak kod analizi, dinamik analiz veya fuzing teknikleri kullanarak bu tür zafiyetleri tespit ederler. Örneğin, format string zafiyetleri, `printf` gibi fonksiyonlara kontrolsüz kullanıcı girdisi verildiğinde ortaya çıkar ve saldırganlara rastgele bellek adreslerine veri yazma imkanı tanır. Bu analiz sürecinde, hedef programın bellek düzeni ve GOT'un bellek içindeki konumu kritik öneme sahiptir.
Saldırı Vektörü Oluşturma
Zafiyet tespit edildikten sonra, saldırgan bir saldırı vektörü oluşturur. Bu adımda, GOT'taki hedef fonksiyonun adresi belirlenir ve bu adres üzerine yazılacak olan shellcode'un bellek adresi hesaplanır. Bellek içi adresleme genellikle ASLR (Address Space Layout Randomization) gibi savunma mekanizmaları tarafından zorlaştırılır, ancak çeşitli bilgi sızıntısı teknikleri (örneğin, format string ile yığın veya kütüphane adreslerini okuma) bu engeli aşmaya yardımcı olabilir. Başka bir deyişle, saldırgan, mevcut zafiyeti kullanarak hem GOT girişinin adresini bulmalı hem de kendi shellcode'unu programa enjekte edebileceği bir yer keşfetmelidir.
Shellcode Enjeksiyonu ve Çalıştırılması
Shellcode, genellikle hedef sistemde bir kabuk (shell) açmayı veya belirli bir komutu çalıştırmayı amaçlayan küçük, makine dilinde yazılmış bir koddur. Saldırgan, önceki adımlarda bulduğu zafiyeti kullanarak bu shellcode'u programın bellek alanına enjekte eder. Enjeksiyon genellikle yığın (stack) veya yığın (heap) gibi yazılabilir bellek bölgelerine yapılır. Shellcode başarıyla enjekte edildikten sonra, GOT hijacking işlemi gerçekleştirilir. Programın meşru bir fonksiyonu çağırmasıyla birlikte, kontrol shellcode'a geçer ve saldırganın istediği komutlar yürütülür; bu nedenle shell alma işlemi tamamlanır.
Başarılı Bir GOT Hijacking Örneği
Varsayımsal bir senaryoda, kötü amaçlı bir kullanıcının, `printf` fonksiyonuna format string zafiyeti bulunan bir uygulama üzerinde GOT hijacking gerçekleştirdiğini düşünelim. Saldırgan, ilk olarak `printf` fonksiyonunu kullanarak yığın üzerindeki kendi enjekte ettiği shellcode'unun adresini ve `puts` gibi bir kütüphane fonksiyonunun GOT adresini sızdırır. Ardından, aynı format string zafiyetini tekrar kullanarak `puts` fonksiyonunun GOT girişini, kendi shellcode'unun adresine yazdırır. Bu işlemden sonra, program `puts` fonksiyonunu çağırdığında, kontrol shellcode'a geçer ve saldırgan hedef sistemde bir kabuk elde eder.
Savunma Yöntemleri ve Önlemler
GOT Hijacking gibi tekniklere karşı birçok savunma mekanizması geliştirilmiştir. ASLR (Address Space Layout Randomization), kütüphanelerin ve yığının bellek adreslerini rastgeleleştirerek saldırganın shellcode adresini tahmin etmesini zorlaştırır. RELRO (Relocation Read-Only) gibi mekanizmalar ise GOT'un yükleme zamanında salt okunur hale gelmesini sağlayarak çalışma zamanında yazılmasını engeller. Ek olarak, NX (No-Execute) bit, veri segmentlerinin yürütülemez olmasını sağlayarak yığın veya yığına enjekte edilen shellcode'un çalışmasını önler. Güvenli kodlama pratikleri ve statik/dinamik analiz araçlarının kullanımı, zafiyetlerin oluşmasını baştan engellemek adına büyük önem taşır.