Defansif Güvenlik
DLL Injection Nasıl Yapılır ve Geride Nasıl İzler Bırakır?
Windows işletim sisteminde birçok fonksiyonellik Dinamik Bağlantı Kütüphaneleri ile sağlanır. Bu dosyaların amacı ortak fonksiyonları bir kütüphanede toplamak ve diğer programlar tarafından ihtiyaç duyulması halinde ilgili fonksiyonları çağırmaktır. Bu sayede uygulamalar tekrarlayan kodlardan kurtulacak ve ortak kullanılan fonksiyonların bir kez belleğe yüklenmesi yeterli olacaktır.
Dll injection, hedef process’in sanal adres alanında rastgele kod çalıştırmak için kullanılan bir tekniktir. Saldırganlar defansif güvenlik çözümlerini atlatabilmek için çalıştırmak istedikleri zararlı kod parçalarını legal Windows process’lerine enjekte edebilir. Saldırganlar bu teknik sayesinde enjekte oldukları process’in sanal adres alanına, sistem/ağ kaynaklarına ve yetkisine sahip olacağından yetki yükseltmek için de bu tekniği kullanabilirler.
Peki bu işlem nasıl yapılıyor? Bunu bir örnek üzerinden görelim.
Zararlı dll dosyasını enjekte edeceğimiz C++ kodumuz aşağıdaki gibidir. Şimdi bu koda bir göz atalım.
(Yukarıdaki kod parçası https://www.ired.team/offensive-security/code-injection-process-injection/dll-injection sayfasından alınmıştır.)
7. satırda enjekte edeceğimiz dll dosyamızın yolunu dllPath değişkenine atıyoruz.
9. satırda enjekte etmek istediğimiz process’in ID’sini argüman olarak istemişiz.
10. satırda ID’si verilen process’e OpenProcess fonksiyonu ile erişim sağlıyoruz. Burada verilen PROCESS_ALL_ACCESS parametresi ile hedef process üzerinde tüm haklara sahip olabiliyoruz.
11. satırda VirtualAllocEx fonksiyonu ile dll dosyamızın yolunu hedef process’in sanal adres alanına yazabilmek için öncesinde alan tahsis ediyoruz.
12. satırda WriteProcessMemory fonksiyonu ile dll dosyamızın yolunu daha önce rezerve ettiğimiz hedef process’in sanal adres alanına yazıyoruz.
13. satırda GetProcAddress fonksiyonu ile dll dosyamızı hedef process’e yüklemesi için kullanacağımız LoadLibraryW fonksiyonunun hafıza(memory) üzerindeki adresini alıyoruz. LoadLibraryW fonksiyonu, kernel32.dll kütüphanesine ait bir fonksiyondur.
14. satırda CreateRemoteThread fonksiyonu ile bir thread oluşturuyoruz ve LoadLibraryW fonksiyonu ile dll dosyamızı yüklüyoruz. CreateRemoteThread fonksiyonunda bulunan 6. parametre “dwCreationFlags” olarak isimlendirilir ve bu flag thread’in oluşturulmasını kontrol eder. Burada flag’in “0” olduğunu görüyoruz. Bu değer thread oluşturulduktan hemen sonra zararlı dll dosyamızın çalıştırılacağı anlamına gelir.
15. adımda ise hedef process’e erişmek için oluşturduğumuz handle’ı sonlandırıyoruz.
Şimdi saldırgan makinamızda bu kodu derleyelim.
Msfvenom ile enjekte etmek istediğimiz dll dosyamızı oluşturalım.
Hedef sisteme evil.dll ve injector.exe dosyalarımızı transfer etmek için SimpleHTTPServer aracını kullanalım.
Kurban makinasında zararlı dosyaları certutil.exe ile aşağıdaki gibi çekelim. Dikkat ederseniz transfer işlemi sırasında legal amaçlarla da kullanılan Windows process’ini kullanıyoruz.
Notepad.exe process’inin ID’sini öğrendikten sonra aşağıdaki gibi dll dosyamızı enjekte edecek komutu çalıştıralım.
Saldırgan makinamıza döndüğümüzde meterpreter oturumunun açıldığını görüyoruz. Sırasıyla sistem üzerinde bilgi toplamak için whoami.exe ve systeminfo.exe komutlarını çalıştırıyoruz.
Process Explorer üzerinden Notepad.exe uygulamasının yüklediği dll dosyalarını kontrol ettiğimizde evil.dll dosyamızın da başarılı bir şekilde yüklendiğini görebiliriz.
Bir de bu aktivitelerin sistem üzerinde bıraktığı log’lara bakalım.
Notepad.exe’nin zararlı dll dosyamızı çalıştırmak için rundll32.exe’yi çalıştırdığını aşağıdaki Sysmon Event ID 1 (Process Creation) log’undan görüyoruz.
Sysmon Event ID 7 (Image loaded) log’unu incelediğimizde notepad.exe process’ine evil.dll dosyamızın yüklendiğini görüyoruz. Burada yüklenen dll dosyasının yolunun Temp dizini altında olması Siber Güvenlik Analisti açısından bir şüphe uyandırmalı. Bu vaka üzerinde konuşacak olursak birçok Endpoint güvenlik çözümü bu yükleme işlemini kaçırabilir. SIEM üzerinde, legal dll dosyalarının yüklendiği (System32 vb.) yollar dışında farklı bir yoldan yükleme yapıldığında alarm tetiklenmesi sağlanabilir.
Devamında ise bu rundll32.exe process’inin bir ağ bağlantısı başlattığını görüyoruz. Tabii rundll32.exe ağ bağlantılarını legal amaçlarla da yapabilir. Bu beklenmedik bir durum değil fakat burada şüphelendiğimiz bir dll yüklemesinden sonra, aynı rundll32.exe process’inin yaptığı ağ bağlantısını kontrol etmek gerekir. Burada hedef IP ve Port’un saldırgana ait olduğunu görüyoruz.
Hatırlarsak meterpreter oturumunu saldırgan makinamızda aldıktan sonra “shell” komutunu girerek kurban sistemde komut satırına erişmiştik. Aşağıdaki log’da gördüğümüz rundll32.exe’nin başlattığı cmd.exe aslında bu komutun tetiklemesi sonucu oluşan process. Parent Process ID’lerine dikkat edersek bu oturum içerisinde çalıştırdığımız whoami.exe ve systeminfo.exe process’leri, cmd.exe process’i tarafından çalıştırılmaktadır.
Bu yazımızda bir dll injection saldırısının nasıl gerçekleştirilebileceğini ve sistem üzerinde nasıl izler bırakabileceğini görmeye çalıştık. Bu tür atakları yakalamak için Endpoint güvenlik çözümleri ne kadar önemliyse, SIEM üzerinde kuralların zenginleştirilmesi de bir o kadar önemlidir.