DLL Injection Nedir? Nasıl Gerçekleşir?

DLL (dinamik bağlantı kitaplığı), bir program tarafından varolan fonksiyonları çağırmak için kullanılan Windows kütüphane dosyasıdır. DLL Injection ise, bir DLL dosyasını bir process’in adres alanı içerisinde çalıştırarak, o process’in çalışmasını manipüle etmek amacıyla kullanılan bir tekniktir.

Böylece, hedef sistem üzerinde özel hazırlanmış bir DLL dosyası aracılığıyla, rastgele komut çalıştırılabilir. DLL Injection saldırılarının çoğu, tersine mühendislik saldırıları için yapılır. Ayrıca, hedef sistem üzerinde hak ve yetki yükseltmek (privilege escalation) amacıyla da bu yönteme başvurulabilir.

DLL INJECTION İŞLEMİ NASIL GERÇEKLEŞİR?

  • Bir process’e enjekte edilecek olan DLL dosyası hedef sisteme yerleştirilir.
  • Hedef process’in belleği üzerinde, DLL dosyasının yolunu belirtmek için yer ayrılır.
  • DLL dosyasının bulunduğu dizin yolu process belleğine kopyalanır ve uygun bellek adresleri belirlenir.
  • DLL dosyası çalıştırılır ve enjekte edildiği process üzerinden işlemlerini yürütmeye başlar.

Bir process’e DLL enjekte etme işlemi, aşağıdaki adımlardan oluşur:

DLL INJECTION — TEKNİK DETAYLAR

DLL Injection işlemi gerçekleştirmek amacıyla, ekibimizden Ramin Karimkhani tarafından geliştirilmiş olan DLLInjector adlı araca Github üzerinden ulaşabilirsiniz. DLL Injection işleminin teknik detayları aşağıda yer almaktadır (C# programlama dili ile geliştirilmiş olan bu araçta yer alan fonksiyonlar, Windows Kernel32 kütüphanesi kullanılarak çağrılmıştır):

DLL enjekte edilecek olan process’i ele almak için OpenProcess() fonksiyonu kullanılır. Bu fonksiyon ile bir DLL enjekte edilecek olan process belirlenir ve injection işleminin yapılabilmesi için, bu fonksiyon aracılığıyla process gerekli yetkilerle ele alınır. Resim 1’de process erişim bayrakları yer almaktadır. Bu bayraklar bir process’in hangi yetkilerle ele alınması gerektiğini belirler. Seçeceğimiz bir process’e DLL enjeksiyonu yapabilmek için OpenProcess fonksiyonu ile birlikte; CreateThread, QueryInformation, VMOperation, VMWrite ve VMRead bayrakları kullanılmalıdır. DLLInjector aracında OpenProcess fonksiyonu, bir process’i tüm yetkilerle ele alacak şekilde ayarlanmıştır.

Bir DLL dosyasını process belleğine yüklemek için LoadLibraryA fonksiyonu kullanılır. LoadLibraryA, kernel32.dll üzerinden çağrılabilir. Bunun için GetProcAddress() fonksiyonu kullanılır. Bu fonksiyon, belirtilen bir kütüphane üzerinden, bir fonksiyon veya bir değişkenin adresini almak amacıyla kullanılır.

Hedef process’in sanal belleğinden yer ayırmak için VirtualAllocEx() fonksiyonu kullanılır. Bu fonksiyonun parametreleri kullanılarak; hedef process, ayrılacak bellek alanının başlangıç adresi, bellek alanı uzunluğu, bellek ayırma türü ve ayrılacak sayfa için bellek izinleri belirtilir.

Ele alınan process’in ayrılan bellek alanına, enjekte edilecek olan DLL dosyasının yolunu yazmak için WriteProcessMemory() fonksiyonu kullanılır.

CreateRemoteThread fonksiyonu, bir process’in sanal bellek alanında thread oluşturur. Bu fonksiyon kullanılarak LoadLibraryA fonksiyonu, process’in ayrılan sanal bellek alanında bir thread olarak çalıştırılır. Böylece DLL Injection işlemi tamamlanır.

DLLInjector ARACI KULLANILARAK HEDEF SİSTEMDEN METERPRETER ALMA

Hedef sistemde çalışan herhangi bir process’e DLL enjekte edebilmek için, process’in ID değeri alındı.

Msfvenom ile oluşturulan meterpreter DLL dosyası hedef sisteme yüklendi. Ardından DLLInjector aracı, Process ID ve DLL dosyasının yolu belirtilerek çalıştırıldı.

DLL dosyası çalıştı ve hedef process üzerinden bir meterpreter oturumu elde edildi.

Resim 3.4 — Meterpreter Process’i