Gönül POLAT tarafından yazılmıştır.
Herkese merhaba, bugün process injection tekniklerinden DLL Injection ve Process Hollowing üzerinde duracağız. Öncelikle tekniklerin poc kod incelemesini, sistemde çalışırken incelenmesi ve memory analizini yapacağız.
Bir processe dll enjecte etme yöntemidir.
DLL’in path’ini kodumuza ekliyoruz.
OpenProcess → Hedefte çalışan bir processin PID numarasını girerek hedef processi açar.
VirtualAllocEx → Process’te bir bellek alanı ayırır.
WriteProcessMemory → Dll’imizi ayrılan alana yazar.
CreateRemoteThread → Dll’i yürütmek için yeni bir thread oluşturur.
Kaynak kodunu Visual Studio üzerinden derleyip çalıştırabiliriz. https://github.com/Zer0Mem0ry/StandardInjection
Notepad.exe processinin PID numarasını kodumuza ekliyoruz ve çalıştırıyoruz. Process hacker toolu üzerinden inceleyelim.
DLLInjection.exe çalıştığı zaman path adresini verdiğimiz dll notepad.exe içerisine kendisini kopyalıyor ve çalıştırıyor. Aşağıdaki görselde notepad.exe içerisinde çalışan testlib.dll görüyoruz.
Procmon tool üzerinden testlib.dll’in thread oluşturduğunu, dosya açıp kapatma gibi işlemler yaptığını tespit ediyoruz.
Dll Injection tekniği kullanılarak yapılan bir saldırıyı memory analizi yaparak tespit etmeye çalışalım. Rekall memory forensic aracını kullanıyoruz. Rekall ram analizi için pythonla yazılmış açık kaynak kodlu bir memory forensic tooludur. Rekall’un kendi içerisinde ayrı bir terminali bulunuyor ve ram imajını rekall içerisine aktarıp direk o terminal üzerinden işlem yapıyoruz.
“victim.mem” memory imajını rekall tooluna import ediyoruz.
Çalışan processlere pstree() ile bakalım.
“DLLInjection.e” (7292) processine ait detaylı bilgi edinelim. Bunun için çalışan bir process hakkında ayrıntılı bilgi dökümünü veren procinfo() komutunu kullanıyoruz. (Burada biz kodu derlediğimiz için direk olarak adını biliyoruz. Ve incelemelerimizi ona göre yapıyoruz.)
Dll Injection tekniğinde kullanılan fonksiyonları incelemiştik. “DLLInjection.e” processinin alt bilgilerine baktığımızda teknikte kullanılan fonksiyonları görüyoruz. Bu process hangi processe dll enjecte etmiş? Biz burada saldırı tarafını da bildiğimiz için hangi processe dll injection işlemi yapıldığını biliyoruz. Bu yüzden incelememizi doğrudan o process üzerinden devam ettirdik.
Not: Gerçek bir vakada processler tek tek incelenmeli ve o processe ait dll’ler gözden geçirilmelidir.
Notepad.exe’nin(808) proces’lerinin kullanmış olduğu Dll’leri ldrmodules() ile inceleyelim. Ldrmodules() gizli Dll’leri bulmak için çok kullanışlı bir eklentidir. İşlemlerin listesini karşılaştırır ve bunların PEB’de olup olmadığını belirler. Windows’un kullandığı Dll’ler dışında testlib.dll isimli farklı bir dll keşfediyoruz.
Bulduğumuz testlib.dll notepad.exe’ye enjecte edilmiş. Dll’i dump edip inceleyelim.
dlldump proc_regex=”notepad.exe”, dump_dir=”/tmp/”
Cff explorer ile dump ettiğimiz testlib.dll’i açıyoruz. CFF Explorer ile bir PE dosyasının çağırabileceği işlevleri, kaynakları görüntüleyebilir ve değiştirebiliriz. Portable Executable(PE) dosya biçimi, Windows executable dosyaları ve Dll’ler tarafından kullanılır.
Import edilen modullere baktığımızda user32.dll’in MessageBoxW() fonksiyonunu kullandığını görüyoruz. Bu fonksiyon uygulamaya özgü bir ileti içeren kalıcı bir mesaj yazmayı sağlar. Şimdi bu fonksiyon ile yazılan mesajı tespit edelim.
Section Header sekmesine bakıyoruz. Bir PE dosya formatında sectionlar temel kod veya veri birimini içerir. Section Header sekmesinden elde ettiğimiz tabloda, her section’ın adı, konumu (hem diskte hem de memoryde) ve özellikleri hakkında önemli bilgiler bulunur. Sectionlar şunlardır:
.text → Executable kodu içerir.
.rdata → Salt okunur verileri içerir.
.idata → bazen mevcut ve import edilen fonksiyonların bilgilerini saklar; bu bölüm mevcut değilse, rdata bölümünde bu bilgiler saklanır.
.data → Program boyunca erişilen genel verileri depolar.
.pdata → Yalnızca 64 bit executable dosyalarda bulunur ve özel durum işleme bilgilerini depolar.
.rsrc → Kaynakları içerir.
.reloc → Kütüphane dosyalarının taşınması için bilgi içerir.
.rdata sectionını inceliyoruz.
Yazılan verinin içeriğini “Hello From Testlib” olarak tespit ediyoruz.
Process Hollowing yöntemi legit bir process’e zararlı bir executable injection işlemi yapılmasıdır. Yöntem ilk olarak hedefini belirler daha sonra hedefi suspend ederek çalıştırır, kendi kodlarını hedef process üzerine yazdıktan sonra uygulamayı devam ettirir.
CreateProcess(); suspend edilecek process oluşturulur.
NtUnmapViewOfSection(); fonksiyonu ile belleğe yazılacak kodlarımız için yer ayırır.
VirtualAllocEx(); kodu ekleyebilmemiz processte bir bellek alanı ayırır.
WriteProcessMemory(); oluşturulan kodu yeni ayrılan alana yazar.
SetThreadContext(); Enrty Point (EP) güncellemesini yapar.
Son olarak da kodumuza sistemde mevcut notepad.exe giriyoruz. Kaynak kodumuzu derleyip çalıştıralım. https://github.com/m0n0ph1/Process-Hollowing
Daha sonra API moonitoring ile incelememize devam ediyoruz.
CreateProcess fonksiyonunun bir notepad.exe’yi suspend işlemine aldığını görmüş oluyoruz.
WriteProcessMemory fonksiyonunun memoryde yazma işlemini hangi adreslere yazdığını görüntülüyoruz. Ve executable kodun yazılmış olduğunu tespit ediyoruz.
Process Hollowing tekniği kullanılarak yapılan bir saldırıyı memory analizi yaparak tespit etmeye çalışacağız.
Ram imajını rekall içerisine alıyoruz.
Sistemde çalışan processleri pstree komutu ile listeliyoruz. “ProcessHollowi”(6136) processinin altında bir notepad.exe(1624) processinin çalıştığını görüyoruz.
“ProcessHollowi” processine ait daha detaylı bilgi elde edinmek için procinfo() komutunu kullanıyoruz.
Process Hollowing tekniğinin kullandığı fonksiyonları yukarıda detaylı olarak incelemiştik. “ProcessHollowi” processinin detaylı bilgilerine baktığımızda kullanılan fonksiyoların tamamen bu tekniğin kullandığı fonksiyonlar olduğunu tespit ediyoruz.
“ProcessHollowi” altında çalışan notepad.exe processi için de detaylı bilgi → procinfo (1624)
PE Information kısmından sistem processinin memory içerisinde bir değişime uğradığını tespit ediyoruz.
“ProcessHollowi” (6136) ve “notepad.exe”(1624) processlerinin kullanmış olduğu Dll’leri ldrmodules() ile inceleyelim.
“ProcessHollowi” process’inin kullanmış olduğu kütüphaneleri map’lenmiş halini ve dosya yolunu görüyoruz.
Şimdi bu process altında çalışan şüpheli notepad.exe processine bakalım. Burada tuhaf bir durum keşfediyoruz. Notepad.exe’nin dosya yolunu göremiyoruz.
Notepad.exe’nin dll modüllerinin bir listesini dlllist() ile görüntülüyoruz. 0xa40000 BaseAddres’inde notepad.exenin çalıştırıldığını keşfediyoruz. BaseAddres, program tarafından şu anda üzerinde çalışılan bir veri parçasının konumu olarak hesaplamada kullanılır. 0xa40000 BaseAddresi diğer BaseAdresslerden farklı olarak gözümüze çarpıyor.
Şimdi elde ettiğimiz bilgiler ışığında notepad.exe processi için bir VAD(Virtual Address Descriptor)’a çıktısına bakalım. VAD, Windows kernel tarafından process belleğini yönetmek için oluşturulmuş bir yapı. VAD process adress space alanlarına maplenmiş bellekteki bölgeleri verir.
Genellikle Windows içerisinde normal şartlarda çalışan bir uygulama “READWRİTE”, “READONLY” “EXECUTE_WRITECOPY” izinleriyle tutulur. Eğer çalışan bir uygulamaya bellekte yürütülebilir bir kod yazılmışsa biz bunu “EXECUTE_READWRİTE” şeklinde görürüz. Vad çıktısından da elde ettiğimiz bulgulara göre notepad.exe üzerinde 0xa40000 BaseAddres’inde bir executable kod eklenmiş.
Şimdi malfind komutuyla rekall’un bu notepad.exe’yi bir zararlı olarak tespit edip etmediğine bakalım.
EXECUTE_READWRİTE olarak işaretlenmiş 0xa40000 BaseAddres’inde yer alan MZ ile başlayan executable kodları görüyoruz.
Şüpheli bulduğumuz processi dump edip IDA aracı ile enjecte edilmiş kodu bulalım.
procdump proc_regex=”notepad”, dump_dir=”/tmp/”
Bir sonraki yazımda görüşmek üzere.
https://www.elastic.co/blog/hunting-memory
https://rekall.readthedocs.io/en/latest/plugins.html
https://alparslanakyildiz.medium.co...g-dll-1nj3ct0n-process-hollowing-fcd87676d36b
https://www.ired.team/offensive-security/code-injection-process-injection/dll-injection
[TR] DLL Injection ve Process Hollowing Tespiti
Herkese merhaba, bugün process injection tekniklerinden DLL Injection ve Process Hollowing üzerinde duracağız. Öncelikle tekniklerin poc kod incelemesini, sistemde çalışırken incelenmesi ve memory analizini yapacağız.
Classic DLL Injection
Bir processe dll enjecte etme yöntemidir.
DLL’in path’ini kodumuza ekliyoruz.
OpenProcess → Hedefte çalışan bir processin PID numarasını girerek hedef processi açar.
VirtualAllocEx → Process’te bir bellek alanı ayırır.
WriteProcessMemory → Dll’imizi ayrılan alana yazar.
CreateRemoteThread → Dll’i yürütmek için yeni bir thread oluşturur.
Kaynak kodunu Visual Studio üzerinden derleyip çalıştırabiliriz. https://github.com/Zer0Mem0ry/StandardInjection
Notepad.exe processinin PID numarasını kodumuza ekliyoruz ve çalıştırıyoruz. Process hacker toolu üzerinden inceleyelim.
DLLInjection.exe çalıştığı zaman path adresini verdiğimiz dll notepad.exe içerisine kendisini kopyalıyor ve çalıştırıyor. Aşağıdaki görselde notepad.exe içerisinde çalışan testlib.dll görüyoruz.
Procmon tool üzerinden testlib.dll’in thread oluşturduğunu, dosya açıp kapatma gibi işlemler yaptığını tespit ediyoruz.
DLL Injection Tespiti:
Dll Injection tekniği kullanılarak yapılan bir saldırıyı memory analizi yaparak tespit etmeye çalışalım. Rekall memory forensic aracını kullanıyoruz. Rekall ram analizi için pythonla yazılmış açık kaynak kodlu bir memory forensic tooludur. Rekall’un kendi içerisinde ayrı bir terminali bulunuyor ve ram imajını rekall içerisine aktarıp direk o terminal üzerinden işlem yapıyoruz.
“victim.mem” memory imajını rekall tooluna import ediyoruz.
Çalışan processlere pstree() ile bakalım.
“DLLInjection.e” (7292) processine ait detaylı bilgi edinelim. Bunun için çalışan bir process hakkında ayrıntılı bilgi dökümünü veren procinfo() komutunu kullanıyoruz. (Burada biz kodu derlediğimiz için direk olarak adını biliyoruz. Ve incelemelerimizi ona göre yapıyoruz.)
Dll Injection tekniğinde kullanılan fonksiyonları incelemiştik. “DLLInjection.e” processinin alt bilgilerine baktığımızda teknikte kullanılan fonksiyonları görüyoruz. Bu process hangi processe dll enjecte etmiş? Biz burada saldırı tarafını da bildiğimiz için hangi processe dll injection işlemi yapıldığını biliyoruz. Bu yüzden incelememizi doğrudan o process üzerinden devam ettirdik.
Not: Gerçek bir vakada processler tek tek incelenmeli ve o processe ait dll’ler gözden geçirilmelidir.
Notepad.exe’nin(808) proces’lerinin kullanmış olduğu Dll’leri ldrmodules() ile inceleyelim. Ldrmodules() gizli Dll’leri bulmak için çok kullanışlı bir eklentidir. İşlemlerin listesini karşılaştırır ve bunların PEB’de olup olmadığını belirler. Windows’un kullandığı Dll’ler dışında testlib.dll isimli farklı bir dll keşfediyoruz.
Bulduğumuz testlib.dll notepad.exe’ye enjecte edilmiş. Dll’i dump edip inceleyelim.
dlldump proc_regex=”notepad.exe”, dump_dir=”/tmp/”
Cff explorer ile dump ettiğimiz testlib.dll’i açıyoruz. CFF Explorer ile bir PE dosyasının çağırabileceği işlevleri, kaynakları görüntüleyebilir ve değiştirebiliriz. Portable Executable(PE) dosya biçimi, Windows executable dosyaları ve Dll’ler tarafından kullanılır.
Import edilen modullere baktığımızda user32.dll’in MessageBoxW() fonksiyonunu kullandığını görüyoruz. Bu fonksiyon uygulamaya özgü bir ileti içeren kalıcı bir mesaj yazmayı sağlar. Şimdi bu fonksiyon ile yazılan mesajı tespit edelim.
Section Header sekmesine bakıyoruz. Bir PE dosya formatında sectionlar temel kod veya veri birimini içerir. Section Header sekmesinden elde ettiğimiz tabloda, her section’ın adı, konumu (hem diskte hem de memoryde) ve özellikleri hakkında önemli bilgiler bulunur. Sectionlar şunlardır:
.text → Executable kodu içerir.
.rdata → Salt okunur verileri içerir.
.idata → bazen mevcut ve import edilen fonksiyonların bilgilerini saklar; bu bölüm mevcut değilse, rdata bölümünde bu bilgiler saklanır.
.data → Program boyunca erişilen genel verileri depolar.
.pdata → Yalnızca 64 bit executable dosyalarda bulunur ve özel durum işleme bilgilerini depolar.
.rsrc → Kaynakları içerir.
.reloc → Kütüphane dosyalarının taşınması için bilgi içerir.
.rdata sectionını inceliyoruz.
Yazılan verinin içeriğini “Hello From Testlib” olarak tespit ediyoruz.
Process Hollowing (RunPE)
Process Hollowing yöntemi legit bir process’e zararlı bir executable injection işlemi yapılmasıdır. Yöntem ilk olarak hedefini belirler daha sonra hedefi suspend ederek çalıştırır, kendi kodlarını hedef process üzerine yazdıktan sonra uygulamayı devam ettirir.
CreateProcess(); suspend edilecek process oluşturulur.
NtUnmapViewOfSection(); fonksiyonu ile belleğe yazılacak kodlarımız için yer ayırır.
VirtualAllocEx(); kodu ekleyebilmemiz processte bir bellek alanı ayırır.
WriteProcessMemory(); oluşturulan kodu yeni ayrılan alana yazar.
SetThreadContext(); Enrty Point (EP) güncellemesini yapar.
Son olarak da kodumuza sistemde mevcut notepad.exe giriyoruz. Kaynak kodumuzu derleyip çalıştıralım. https://github.com/m0n0ph1/Process-Hollowing
Daha sonra API moonitoring ile incelememize devam ediyoruz.
CreateProcess fonksiyonunun bir notepad.exe’yi suspend işlemine aldığını görmüş oluyoruz.
WriteProcessMemory fonksiyonunun memoryde yazma işlemini hangi adreslere yazdığını görüntülüyoruz. Ve executable kodun yazılmış olduğunu tespit ediyoruz.
Process Hollowing Tespiti:
Process Hollowing tekniği kullanılarak yapılan bir saldırıyı memory analizi yaparak tespit etmeye çalışacağız.
Ram imajını rekall içerisine alıyoruz.
Sistemde çalışan processleri pstree komutu ile listeliyoruz. “ProcessHollowi”(6136) processinin altında bir notepad.exe(1624) processinin çalıştığını görüyoruz.
“ProcessHollowi” processine ait daha detaylı bilgi elde edinmek için procinfo() komutunu kullanıyoruz.
Process Hollowing tekniğinin kullandığı fonksiyonları yukarıda detaylı olarak incelemiştik. “ProcessHollowi” processinin detaylı bilgilerine baktığımızda kullanılan fonksiyoların tamamen bu tekniğin kullandığı fonksiyonlar olduğunu tespit ediyoruz.
“ProcessHollowi” altında çalışan notepad.exe processi için de detaylı bilgi → procinfo (1624)
PE Information kısmından sistem processinin memory içerisinde bir değişime uğradığını tespit ediyoruz.
“ProcessHollowi” (6136) ve “notepad.exe”(1624) processlerinin kullanmış olduğu Dll’leri ldrmodules() ile inceleyelim.
“ProcessHollowi” process’inin kullanmış olduğu kütüphaneleri map’lenmiş halini ve dosya yolunu görüyoruz.
Şimdi bu process altında çalışan şüpheli notepad.exe processine bakalım. Burada tuhaf bir durum keşfediyoruz. Notepad.exe’nin dosya yolunu göremiyoruz.
Notepad.exe’nin dll modüllerinin bir listesini dlllist() ile görüntülüyoruz. 0xa40000 BaseAddres’inde notepad.exenin çalıştırıldığını keşfediyoruz. BaseAddres, program tarafından şu anda üzerinde çalışılan bir veri parçasının konumu olarak hesaplamada kullanılır. 0xa40000 BaseAddresi diğer BaseAdresslerden farklı olarak gözümüze çarpıyor.
Şimdi elde ettiğimiz bilgiler ışığında notepad.exe processi için bir VAD(Virtual Address Descriptor)’a çıktısına bakalım. VAD, Windows kernel tarafından process belleğini yönetmek için oluşturulmuş bir yapı. VAD process adress space alanlarına maplenmiş bellekteki bölgeleri verir.
Genellikle Windows içerisinde normal şartlarda çalışan bir uygulama “READWRİTE”, “READONLY” “EXECUTE_WRITECOPY” izinleriyle tutulur. Eğer çalışan bir uygulamaya bellekte yürütülebilir bir kod yazılmışsa biz bunu “EXECUTE_READWRİTE” şeklinde görürüz. Vad çıktısından da elde ettiğimiz bulgulara göre notepad.exe üzerinde 0xa40000 BaseAddres’inde bir executable kod eklenmiş.
Şimdi malfind komutuyla rekall’un bu notepad.exe’yi bir zararlı olarak tespit edip etmediğine bakalım.
EXECUTE_READWRİTE olarak işaretlenmiş 0xa40000 BaseAddres’inde yer alan MZ ile başlayan executable kodları görüyoruz.
Şüpheli bulduğumuz processi dump edip IDA aracı ile enjecte edilmiş kodu bulalım.
procdump proc_regex=”notepad”, dump_dir=”/tmp/”
Bir sonraki yazımda görüşmek üzere.
Kaynak:
https://www.elastic.co/blog/hunting-memory
https://rekall.readthedocs.io/en/latest/plugins.html
https://alparslanakyildiz.medium.co...g-dll-1nj3ct0n-process-hollowing-fcd87676d36b
https://www.ired.team/offensive-security/code-injection-process-injection/dll-injection
Moderatör tarafında düzenlendi: