
CobaltWhispers è uno script aggressore che utilizza una raccolta di Beacon Object Files (BOF) per Cobalt Strike per eseguire iniezione di processi, persistenza e altro, sfruttando syscall dirette (SysWhispers2) per bypassare EDR/AV
Autore: @Cerbersec
CobaltWhispers è uno script aggressor che utilizza una collezione di Beacon Object Files per Cobalt Strike per eseguire process injection, persistenza e altro, sfruttando syscall dirette per bypassare EDR/AV.
CobaltWhispers è alimentato da SysWhispers2 e InlineWhispers2
CobaltWhispers si basa su StayKit e sui lavori di Hasherezade e Forrest Orr.
CobaltWhispers è stato realizzato durante uno stage presso il Red Team di NVISO Security. I relativi articoli del blog possono essere trovati qui (process-injection) e qui (kernel karnage).
CobaltWhispers richiede diversi strumenti per la compilazione:
apt install mingw-w64apt install makeOgni progetto richiede 3 file generati da SysWhispers2 / InlineWhispers2 per funzionare:
Questi file possono essere generati secondo la documentazione di InlineWhispers2, tuttavia questo non è il metodo ottimale perché verrà incluso molto codice non utilizzato:
git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py
In alternativa, utilizza SysWhispers2 per generare i file di output solo per le API necessarie, quindi fornisci manualmente (o tramite script) i file a InlineWhispers2, che li convertirà nel formato corretto. Consulta il makefile incluso per ulteriori informazioni oppure utilizza i file inclusi a tuo rischio.
| Tipo di payload | Target | Affidabilità (0-5) | Elevato | Note |
|---|---|---|---|---|
| - | - | 5 | No | Eredita i permessi dal processo padre |
Crea un nuovo processo sospeso con Code Integrity Guard (CIG) abilitato per bloccare i binari firmati non Microsoft. Spoofa il processo padre specificato. Viene restituito il PID.
Processo padre: Il nome del processo da impostare come padre
Percorso dell'eseguibile: Percorso completo dell'eseguibile su disco utilizzato per creare il nuovo processo
| Tipo di payload | Target | Affidabilità (0-5) | Elevato | Note |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | No | - |
Inietta un payload in un processo remoto utilizzando NtCreateThreadEx
PID del processo: L'ID del processo remoto
Posizione del payload: Posizione del payload in formato binario su disco (Condizionale | Opzionale)
Payload b64: Shellcode raw in formato stringa codificata base64 (Condizionale | Opzionale)
Listener: Listener per cui generare il payload (Condizionale)
È necessario specificare un listener per generare un payload Beacon. Se si desidera un payload manuale, deve essere fornito tramite un percorso al binario raw su disco o shellcode codificato in Base64.
| Tipo di payload | Target | Affidabilità (0-5) | Elevato | Note |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | No | Può potenzialmente causare il crash del processo target |
Inietta un payload in un processo remoto utilizzando NtQueueApcThread
PID del processo: L'ID del processo remoto
Thread: Numero di thread a cui aggiungere una chiamata APC
Posizione del payload: Posizione del payload in formato binario su disco (Condizionale | Opzionale)
Payload b64: Shellcode raw in formato stringa codificata base64 (Condizionale | Opzionale)
Listener: Listener per cui generare il payload (Condizionale)
È necessario specificare un listener per generare un payload Beacon. Se si desidera un payload manuale, deve essere fornito tramite un percorso al binario raw su disco o shellcode codificato in Base64.
| Tipo di payload | Target | Affidabilità (0-5) | Elevato | Note |
|---|---|---|---|---|
| Shellcode/Raw | Processo surrogate | 5 | No | - |
Inietta un payload in un processo surrogate utilizzando NtMapViewOfSection
Processo padre: Il nome del processo da impostare come padre
Percorso dell'eseguibile: Il percorso dell'eseguibile su disco da utilizzare per creare un nuovo processo
Posizione del payload: Posizione del payload in formato binario su disco (Condizionale | Opzionale)
Payload b64: Shellcode raw in formato stringa codificata base64 (Condizionale | Opzionale)
Listener: Listener per cui generare il payload (Condizionale)
È necessario specificare un listener per generare un payload Beacon. Se si desidera un payload manuale, deve essere fornito tramite un percorso al binario raw su disco o shellcode codificato in Base64.
| Tipo di payload | Target | Affidabilità (0-5) | Elevato | Note |
|---|---|---|---|---|
| PE | Processo surrogate | 5 | No | Richiede payload PE x64 |
Inietta un payload in un processo surrogate utilizzando sezioni transazionali e viste mappate. Il punto di ingresso remoto e il PEB vengono aggiornati, senza sezioni di memoria anomale o permessi di memoria anomali. Vedi qui per maggiori informazioni.
Processo padre: Il nome del processo da impostare come padre
Percorso dell'eseguibile: Il percorso dell'eseguibile su disco da utilizzare per creare un nuovo processo
Posizione del payload: Posizione del payload PE x64 su disco (Condizionale | Opzionale)
Payload b64: Payload PE x64 in formato stringa codificata base64 (Condizionale | Opzionale)
Listener: Listener per cui generare il payload (Condizionale)
È necessario specificare un listener per generare un payload Beacon. Se si desidera un payload manuale, deve essere fornito tramite un percorso al PE x64 su disco o a un PE x64 codificato in Base64.
ATTUALMENTE NON IMPLEMENTATO
| Tipo di payload | Target | Affidabilità (0-5) | Elevato | Note |
|---|---|---|---|---|
| Position Independent Shellcode (PIC) | Processo surrogate | 5 | Sì | Sono richiesti privilegi elevati per aprire le DLL di sistema con permessi di scrittura |
Inietta un payload in un processo surrogate utilizzando sezioni transazionali in combinazione con DLL hollowing. Vedi qui per maggiori informazioni.
Processo padre: Il nome del processo da impostare come padre
Percorso dell'eseguibile: Il percorso dell'eseguibile su disco da utilizzare per creare un nuovo processo
Posizione del payload: Posizione del payload in formato binario su disco (Condizionale | Opzionale)
Payload b64: Shellcode raw in formato stringa codificata base64 (Condizionale | Opzionale)
Listener: Listener per cui generare il payload (Condizionale)
È necessario specificare un listener per generare un payload Beacon. Se si desidera un payload manuale, deve essere fornito tramite un percorso al binario raw su disco o shellcode codificato in Base64.