
ScareCrow - Framework di creazione payload progettato per il bypass dell'EDR.
Per visualizzare l'ultima versione di ScareCrow o per inviare un problema, fare riferimento a https://github.com/Tylous/ScareCrow.
Se vuoi saperne di più sulle tecniche utilizzate in questo framework, dai un'occhiata alla Parte 1 e alla Parte 2
ScareCrow è un framework per la creazione di payload per il side loading (non l'iniezione) in un processo Windows legittimo (bypassando i controlli di Application Whitelisting). Una volta che il loader DLL viene caricato in memoria, utilizza una tecnica per rimuovere gli hook di un EDR dalle DLL di sistema in esecuzione nella memoria del processo. Questo funziona perché sappiamo che gli hook dell'EDR vengono posizionati quando un processo viene creato.
ScareCrow può colpire queste DLL e manipolarle in memoria utilizzando la funzione API VirtualProtect, che cambia i permessi di una sezione della memoria di un processo in un valore diverso, in particolare da Execute–Read a Read-Write-Execute.
ScareCrow utilizza 1 dei 2 metodi per rimuovere gli hook
Quando viene eseguito, ScareCrow copia i byte delle DLL di sistema memorizzate su disco in C:\Windows\System32\. Queste DLL sono memorizzate su disco "pulite" dagli hook dell'EDR perché vengono utilizzate dal sistema per caricare una copia inalterata in un nuovo processo quando viene creato. Poiché gli EDR hookano solo questi processi in memoria, rimangono inalterati. ScareCrow non copia l'intero file DLL, ma si concentra solo sulla sezione .text delle DLL. Questa sezione di una DLL contiene l'assembly eseguibile, e facendo ciò, ScareCrow aiuta a ridurre la probabilità di rilevamento poiché la rilettura di interi file potrebbe far sì che un EDR rilevi una modifica a una risorsa di sistema. I dati vengono quindi copiati nella giusta regione di memoria utilizzando l'offset di ciascuna funzione. Ogni funzione ha un offset che indica il numero esatto di byte dall'indirizzo di base in cui risiede, fornendo la posizione della funzione sullo stack.
Per fare ciò, ScareCrow cambia i permessi della regione di memoria .text utilizzando VirtualProtect. Anche se si tratta di una DLL di sistema, poiché è stata caricata nel nostro processo (che controlliamo), possiamo cambiare i permessi di memoria senza richiedere privilegi elevati.
ScareCrow carica lo shellcode in memoria decrittandolo prima, il quale è crittografato con uno dei tre metodi di crittografia (descritti di seguito). Una volta decrittografato e caricato, lo shellcode viene quindi eseguito. A seconda delle opzioni del loader specificate, ScareCrow imposterà diverse funzioni di esportazione per la DLL. La DLL caricata inoltre non contiene la funzione DLLMain standard che tutte le DLL tipicamente necessitano per funzionare. La DLL verrà comunque eseguita senza problemi perché il processo in cui carichiamo cercherà quelle funzioni di esportazione e non si preoccuperà della presenza di DLLMain.
Dopo
KnownDLLs è un elenco di DLL che vengono caricate da Windows durante il processo di avvio del sistema. Poiché queste DLL sono considerate essenziali per il funzionamento del sistema operativo, vengono memorizzate nella cache per ridurre i tempi di caricamento e migliorare le prestazioni all'avvio delle applicazioni. KnownDLLs include DLL come kernel32.dll, kernelbase.dll e ntdll.dll.
Utilizzando queste KnownDlls, ScareCrow mappa una copia della DLL da \KnownDlls\<dllname> utilizzando una combinazione di NtOpenSection e NtMapViewOfSection per caricarla nella memoria del processo. ScareCrow non carica l'intera DLL, ma solo la sezione .text della DLL (poiché questa contiene tutte le syscall). Da lì, ScareCrow utilizza syscall indiretti per chiamare NtProtectVirtualMemory e cambiare i permessi della sezione di memoria .text della DLL per consentire a ScareCrow di sovrascrivere gli hook dell'EDR prima di ripristinare i permessi.
Per ulteriori informazioni puoi leggere il dettagliato articolo di modexp.
Una volta rimossi gli hook, ScareCrow utilizza quindi syscall personalizzate per caricare ed eseguire shellcode in memoria. ScareCrow fa questo anche dopo che gli hook dell'EDR sono stati rimossi per aiutare a evitare il rilevamento da parte di strumenti di raccolta di telemetria non basati su userland e hook, come Event Tracing for Windows (ETW) o altri meccanismi di registrazione eventi. Queste syscall personalizzate vengono utilizzate anche per eseguire la chiamata VirtualProtect per rimuovere gli hook posizionati dagli EDR, descritta sopra, per evitare il rilevamento da qualsiasi controllo anti-manomissione degli EDR. Questo viene fatto chiamando una versione personalizzata della syscall VirtualProtect, NtProtectVirtualMemory. ScareCrow utilizza Golang per generare questi loader e poi assembly per queste funzioni syscall personalizzate.
Durante il processo di creazione del loader, ScareCrow utilizza una libreria per mimetizzarsi in background dopo che un beacon effettua il check-in. Questa libreria fa due cose:
I file firmati con certificati di firma codice sono spesso soggetti a un controllo meno approfondito, rendendo più semplice l'esecuzione senza essere contestati, poiché i file firmati da un nome fidato sono spesso meno sospetti di altri. La maggior parte dei prodotti antimalware non ha il tempo di convalidare e verificare questi certificati (ora alcuni lo fanno, ma tipicamente i nomi dei vendor comuni sono inclusi in una whitelist). ScareCrow crea questi certificati utilizzando una versione Go del tool limelighter per creare un file pfx12. Questo pacchetto prende un nome di dominio inserito dall'utente per creare un certificato di firma codice per quel dominio. Se necessario, puoi anche utilizzare il tuo certificato di firma codice, se ne hai uno, utilizzando l'opzione della riga di comando valid.
clone, insieme al percorso del file da cui copiare il certificato. Quando si firma il loader con microsoft.com, utilizzarli contro i prodotti WINDOWS DEFENDER ATP potrebbe non essere altrettanto efficace poiché possono convalidare il certificato in quanto appartiene a loro. Se stai utilizzando un loader contro un prodotto Windows, utilizza eventualmente un dominio diverso.