Uobičajeni API korišćeni u malveru

Reading time: 6 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Generički

Mrežno

Raw SocketsWinAPI Sockets
socket()WSAStratup()
bind()bind()
listen()listen()
accept()accept()
connect()connect()
read()/recv()recv()
write()send()
shutdown()WSACleanup()

Postojanost

RegistryFileService
RegCreateKeyEx()GetTempPath()OpenSCManager
RegOpenKeyEx()CopyFile()CreateService()
RegSetValueEx()CreateFile()StartServiceCtrlDispatcher()
RegDeleteKeyEx()WriteFile()
RegGetValue()ReadFile()

Enkripcija

Name
WinCrypt
CryptAcquireContext()
CryptGenKey()
CryptDeriveKey()
CryptDecrypt()
CryptReleaseContext()

Anti-analiza/VM

Function NameAssembly Instructions
IsDebuggerPresent()CPUID()
GetSystemInfo()IN()
GlobalMemoryStatusEx()
GetVersion()
CreateToolhelp32Snapshot [Proveri da li proces radi]
CreateFileW/A [Proveri da li datoteka postoji]

Nevidljivost

Name
VirtualAllocAlokacija memorije (paketari)
VirtualProtectPromena dozvole memorije (paketar daje dozvolu za izvršavanje sekciji)
ReadProcessMemoryInjekcija u spoljne procese
WriteProcessMemoryA/WInjekcija u spoljne procese
NtWriteVirtualMemory
CreateRemoteThreadDLL/Proces injekcija...
NtUnmapViewOfSection
QueueUserAPC
CreateProcessInternalA/W

Izvršenje

Function Name
CreateProcessA/W
ShellExecute
WinExec
ResumeThread
NtResumeThread

Razno

  • GetAsyncKeyState() -- Snimanje tastera
  • SetWindowsHookEx -- Snimanje tastera
  • GetForeGroundWindow -- Dobijanje imena aktivnog prozora (ili veb stranice iz pretraživača)
  • LoadLibrary() -- Uvoz biblioteke
  • GetProcAddress() -- Uvoz biblioteke
  • CreateToolhelp32Snapshot() -- Lista aktivnih procesa
  • GetDC() -- Slikanje ekrana
  • BitBlt() -- Slikanje ekrana
  • InternetOpen(), InternetOpenUrl(), InternetReadFile(), InternetWriteFile() -- Pristup internetu
  • FindResource(), LoadResource(), LockResource() -- Pristup resursima izvršnog fajla

Tehnike malvera

DLL Injekcija

Izvršavanje proizvoljnog DLL-a unutar drugog procesa

  1. Pronađite proces u koji ćete injektovati zloćudni DLL: CreateToolhelp32Snapshot, Process32First, Process32Next
  2. Otvorite proces: GetModuleHandle, GetProcAddress, OpenProcess
  3. Napišite putanju do DLL-a unutar procesa: VirtualAllocEx, WriteProcessMemory
  4. Kreirajte nit u procesu koja će učitati zloćudni DLL: CreateRemoteThread, LoadLibrary

Druge funkcije za korišćenje: NTCreateThreadEx, RtlCreateUserThread

Reflektivna DLL Injekcija

Učitajte zloćudni DLL bez pozivanja normalnih Windows API poziva.
DLL se mapira unutar procesa, rešava adrese uvoza, ispravlja relokacije i poziva DllMain funkciju.

Otimanje niti

Pronađite nit iz procesa i naterajte je da učita zloćudni DLL

  1. Pronađite ciljnu nit: CreateToolhelp32Snapshot, Thread32First, Thread32Next
  2. Otvorite nit: OpenThread
  3. Suspendujte nit: SuspendThread
  4. Napišite putanju do zloćudnog DLL-a unutar procesa žrtve: VirtualAllocEx, WriteProcessMemory
  5. Nastavite nit koja učitava biblioteku: ResumeThread

PE Injekcija

Injekcija prenosivog izvršenja: Izvršni fajl će biti napisan u memoriju procesa žrtve i biće izvršen odatle.

Proces Hollowing (poznat i kao RunPE)

Process Hollowing je jedan od omiljenih trikova za izbegavanje odbrane / izvršenje koje koristi Windows malver. Ideja je pokrenuti legitiman proces u suspendovanom stanju, ukloniti (hollow) njegovu originalnu sliku iz memorije i kopirati proizvoljni PE na njegovo mesto. Kada se primarna nit konačno nastavi, zloćudna ulazna tačka se izvršava pod krinkom pouzdane binarne datoteke (često potpisane od strane Microsoft-a).

Tipičan tok rada:

  1. Pokrenite benigni host (npr. RegAsm.exe, rundll32.exe, msbuild.exe) suspendovan tako da još nema izvršenih instrukcija.
c
STARTUPINFOA  si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcessA("C:\\Windows\\Microsoft.NET\\Framework32\\v4.0.30319\\RegAsm.exe",
NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
  1. Pročitajte zloćudni payload u memoriju i analizirajte njegove PE zaglavlja da dobijete SizeOfImage, sekcije i novu EntryPoint.
  2. NtUnmapViewOfSection / ZwUnmapViewOfSection – uklonite originalnu sliku iz suspendovanog procesa.
  3. VirtualAllocEx – rezervišite RWX memoriju od SizeOfImage unutar udaljenog procesa.
  4. WriteProcessMemory – prvo kopirajte Headers, a zatim iterirajte kroz sekcije kopirajući njihove sirove podatke.
  5. SetThreadContext – ispravite vrednost EAX/RAX (RCX na x64) ili Rip u strukturi konteksta tako da EIP pokazuje na EntryPoint payload-a.
  6. ResumeThread – nit se nastavlja, izvršavajući kod koji je obezbedio napadač.

Minimalni dokaz koncepta (x86) skelet:

c
void RunPE(LPCSTR host, LPVOID payload, DWORD payloadSize){
// 1. create suspended process
STARTUPINFOA si = {sizeof(si)}; PROCESS_INFORMATION pi;
CreateProcessA(host, NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);

// 2. read remote PEB to get ImageBaseAddress
CONTEXT ctx; ctx.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread,&ctx);
PVOID baseAddr;
ReadProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);

// 3. unmap original image & allocate new region at same base
NtUnmapViewOfSection(pi.hProcess,baseAddr);
PVOID newBase = VirtualAllocEx(pi.hProcess,baseAddr,pHdr->OptionalHeader.SizeOfImage,
MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
// 4-5. copy headers & sections …
// 6. write new image base into PEB and set Eip
WriteProcessMemory(pi.hProcess,(PVOID)(ctx.Ebx+8),&baseAddr,4,NULL);
ctx.Eax = (DWORD)(newBase) + pHdr->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(pi.hThread,&ctx);
// 7. run!
ResumeThread(pi.hThread);
}

Praktične beleške zabeležene u kampanji DarkCloud Stealer:

  • Loader je izabrao RegAsm.exe (deo .NET Framework-a) kao domaćina – potpisani binarni fajl koji verovatno neće privući pažnju.
  • Dešifrovani VB6 stealer (holographies.exe) nije bačen na disk; postoji samo unutar ispražnjenog procesa, što otežava statičku detekciju.
  • Osetljive stringove (regex, putevi, Telegram akreditivi) su RC4-enkriptovani po stringu i dešifruju se samo u vreme izvršavanja, dodatno komplikujući skeniranje memorije.

Ideje za detekciju:

  • Upozoriti na CREATE_SUSPENDED procese koji nikada ne kreiraju GUI/konzole prozore pre nego što se memorijska oblast dodeli kao RWX (retko za benigni kod).
  • Tražiti sekvencu poziva NtUnmapViewOfSection ➜ VirtualAllocEx ➜ WriteProcessMemory kroz različite procese.

Hooking

  • SSDT (System Service Descriptor Table) upućuje na kernel funkcije (ntoskrnl.exe) ili GUI drajver (win32k.sys) tako da korisnički procesi mogu pozivati te funkcije.
  • Rootkit može modifikovati ove pokazivače na adrese koje kontroliše.
  • IRP (I/O Request Packets) prenose delove podataka od jednog komponente do druge. Gotovo sve u kernelu koristi IRP-ove i svaki objekat uređaja ima svoju funkcijsku tabelu koja može biti hook-ovana: DKOM (Direct Kernel Object Manipulation).
  • IAT (Import Address Table) je koristan za rešavanje zavisnosti. Moguće je hook-ovati ovu tabelu kako bi se preuzela kontrola nad kodom koji će biti pozvan.
  • EAT (Export Address Table) Hook-ovi. Ovi hook-ovi se mogu raditi iz userland. Cilj je hook-ovati eksportovane funkcije od strane DLL-ova.
  • Inline Hooks: Ova vrsta je teška za postizanje. Ovo uključuje modifikaciju koda samih funkcija. Možda stavljanjem skoka na početak.

References

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks