Iscriviti al webinar gratuito del 12 Maggio per diventare Forensic Analyst! Scopri di più
Corso Ethical Hacker: accedi alla promozione fino al 30 Aprile! Scopri di più
La Portable Executable Injection è una sotto-tecnica di Process Injection che consente a un avversario di copiare un intero eseguibile PE — o una sua porzione — nello spazio di indirizzamento di un processo già in esecuzione, per poi avviarlo tramite un thread remoto. Il risultato è codice arbitrario che gira sotto l'identità di un processo legittimo, senza che il payload debba necessariamente toccare il disco.
La tecnica attraversa due tattiche della kill chain. In Defense Evasion (TA0005) maschera l'esecuzione malevola dietro un processo affidabile, rendendo trasparente il payload agli strumenti che si basano sulla reputazione dell'immagine. In Privilege Escalation (TA0004) consente di ereditare il token di sicurezza del processo bersaglio: se il target gira come SYSTEM, il codice iniettato ottiene gli stessi privilegi senza richiedere exploit aggiuntivi.
La catena API classica su Windows è lineare: VirtualAllocEx alloca memoria nel processo remoto, WriteProcessMemory vi copia il PE, CreateRemoteThread (o NtCreateThreadEx) avvia l'esecuzione. Un passaggio critico e spesso sottovalutato è il rebasing: poiché il PE viene caricato a un indirizzo diverso dalla sua ImageBase, tutte le rilocazioni devono essere risolte manualmente, pena un crash immediato.
Con 10 software documentati, 2 gruppi APT, 1 campagna e 1 mitigazione mappati, questa sotto-tecnica rappresenta un meccanismo di esecuzione in-memory tra i più diffusi nel panorama offensivo moderno — dal crimeware bancario ai framework C2 di nuova generazione.
L'obiettivo in laboratorio è riprodurre la sequenza completa di PE injection per validare la detection dell'EDR e calibrare le soglie di alerting. Serve un ambiente isolato con un host Windows 10/11, Sysmon configurato e un processo target sacrificabile.
Approccio classico con API native. Il flusso minimo in C/C++ prevede quattro chiamate: OpenProcess per ottenere un handle con diritti PROCESS_ALL_ACCESS, VirtualAllocEx con protezione PAGE_EXECUTE_READWRITE, WriteProcessMemory per scrivere il PE nel buffer allocato, e infine CreateRemoteThread che punta all'entry point ricalcolato. Per gestire il rebasing, il loader deve iterare la tabella .reloc del PE e applicare il delta tra l'indirizzo allocato e l'ImageBase originale; senza questo passaggio, qualsiasi riferimento assoluto nel codice iniettato punterà a memoria non valida.
Per chi preferisce un framework strutturato, Brute Ratel C4 (a pagamento) offre nativamente la capacità di iniettare payload — nel dataset documentato, l'iniezione di Latrodectus dentro Explorer.exe — attraverso il suo operatore di badger. In alternativa, Havoc (open source) implementa l'auto-iniezione in WerFault.exe, un pattern che sfrutta la fiducia implicita dei SOC verso i processi di crash reporting.
Un esercizio più granulare si realizza con pe-sieve (open source), tool di hasherezade che può essere eseguito dopo l'iniezione per verificare se il payload è rilevabile tramite scansione della memoria del processo:
pe-sieve.exe /pid <PID_target> /shellc /iat 2
Questo comando scansiona il processo specificato alla ricerca di moduli PE non mappati da disco, shellcode e anomalie nella Import Address Table, producendo un report JSON che dettaglia le regioni sospette. È utile per confrontare ciò che l'EDR rileva rispetto a ciò che è effettivamente presente in memoria.
Per replicare il pattern di Gootloader — che utilizza un proprio PE loader interno per eseguire payload interamente in memoria — si può usare il modulo execute-assembly o il reflective loader di Cobalt Strike (a pagamento), oppure il progetto sRDI (open source) che converte una DLL in shellcode position-independent, simulando il caricamento senza passare per LoadLibrary.
Una checklist rapida per il lab:
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo