
SigFlip è uno strumento per patchare file PE firmati con Authenticode (exe, dll, sys, ecc.) senza invalidare o rompere la firma esistente.
SigFlip è uno strumento per modificare file PE firmati con authenticode (exe, dll, sys ..etc) in modo che non influisca o rompa la firma authenticode esistente. In altre parole, è possibile modificare il checksum/hash del file PE incorporando dati (ad esempio shellcode) senza rompere la firma del file, i controlli di integrità o la funzionalità del file PE.
SigInject crittografa e inietta shellcode nella tabella dei certificati [WIN_CERTIFICATE] di un file PE; la chiave di crittografia viene stampata per l'uso con un loader BOF/C/C# di base (SigLoader). SigInject salva le modifiche in un file PE modificato e mantiene intatta la sua firma e la validità del certificato.
SigLoader è un loader di base che prende come parametri il percorso di un file PE modificato creato da SigInject e la chiave di decrittazione, quindi estrae e decritta lo shellcode incorporato per essere utilizzato con una tecnica di iniezione di shellcode a scelta.
SigFlip verifica se l'hash del PE è stato modificato con successo e, in caso di endpoint protetti contro questa comune configurazione errata, termina correttamente (vedere la sezione "Dettagli").
Nota rapida: SigFlip, SigInject e SigLoader sono disponibili come script BOF e assembly .NET; l'unica differenza è che la funzionalità di SigInject è implementata come parte di SigFlip (-i) nel caso si scelgano artefatti .NET invece di BOF.
Può essere utilizzato principalmente per persistenza, movimento laterale o esecuzione di codice/comandi e può essere d'aiuto in:
I BOF precompilati non sono forniti in questo progetto; possono essere compilati usando Mingw-w64. Per .NET usare VS o csc.exe per compilare i progetti .NET (SigFlip, SigLoader). Per BOF seguire i passaggi seguenti;
➜ i686-w64-mingw32-gcc -c sigflip.c -o sigflip.x86.o➜ x86_64-w64-mingw32-gcc -c sigflip.c -o sigflip.x64.o➜ x86_64-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x64.o➜ i686-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x86.oAssicurarsi che tutti i file oggetto si trovino nella stessa directory di sigflip.cna, quindi caricare lo script sigflip.cna in Cobalt Strike.
Nota rapida: i BOF precompilati sono stati testati e sono compatibili con mingw-64 v8.0.0_3; l'uso di mingw-64 >= v9 potrebbe funzionare ma potrebbe causare il crash dei beacon attivi. Per maggiori dettagli, consultare https://github.com/med0x2e/SigFlip/issues/2 .
Execute-Assembly
execute-assembly SigFlip.exe -hexecute-assembly SigLoader -hBOF
SigFlip: Modifica l'hash di un file PE (DLL, EXE, SYS, OCX ..etc) senza rompere la firma o la validità del certificato:
SigFlip "<PE_FILE_PATH>" "<OUTPUT_PE_FILE_PATH (con estensione)>"SigInject: Crittografa e inietta shellcode nella tabella dei certificati [WIN_CERTIFICATE] di un file PE; la chiave di crittografia viene stampata per l'uso con un loader C/C# di base, mantenendo intatta la firma e la validità del certificato:
SigInject "<PE_FILE_PATH> <OUTPUT_PE_FILE_PATH (con estensione)>" "<SHELLCODE_FILE>"SigLoader: Carica lo shellcode crittografato dai file PE creati da SigInject, quindi utilizza Early Bird queueuserapc per generare/iniettare lo shellcode in un processo sacrificale; la logica di iniezione dello shellcode può essere personalizzata o sostituita con qualsiasi altra tecnica di iniezione del codice a scelta:
SigLoader <PE_FILE_PATH_WITH_SH> <DECRYPTION_KEY> <SPAWNTO_PROCESS_PATH> <PARENT_PROCESS_ID>Esempi
BOF:
Questa è una tecnica nota utilizzata da APT#10 in diverse campagne o set di intrusioni.
Authenticode è una tecnologia di firma del codice di Microsoft che identifica l'editore del software firmato con Authenticode. Authenticode verifica anche che il software non sia stato manomesso dopo essere stato firmato e pubblicato.
Microsoft si affida principalmente al formato di firma Authenticode per verificare l'integrità e l'origine dei binari PE. Secondo la specifica del formato Portable Executable di Authenticode, le firme Authenticode possono essere "incorporate" in un file PE Windows, in una posizione specificata dalla voce della Tabella dei Certificati nelle Directory Dati dell'Intestazione Opzionale. Quando Authenticode viene utilizzato per firmare un file PE Windows, l'algoritmo che calcola il valore hash Authenticode del file esclude alcuni campi PE. Quando la firma viene incorporata nel file, il processo di firma può modificare questi campi senza influenzare il valore hash del file. Questi campi sono: **il checksum, RVA della tabella dei certificati, dimensione della tabella dei certificati e la tabella dei certificati degli attributi. La tabella dei certificati degli attributi contiene una struttura PKCS #7 SignedData contenente il valore hash del file PE, una firma creata con la chiave privata dell'editore del software e i certificati X.509 v3 che legano la chiave di firma dell'editore del software a un'entità legale.
In parole povere, possiamo modificare o incorporare dati in campi esclusi dal calcolo dell'hash authenticode senza preoccuparci di rompere la firma authenticode e i controlli di integrità del file.
Maggiori dettagli su tali campi esclusi:
RVA e dimensione della tabella dei certificati: la struttura dell'intestazione opzionale di un PE firmato contiene un array di directory dati, inclusa la voce della directory di sicurezza IMAGE_DIRECTORY_ENTRY_SECURITY che ha due campi: RVA e Dimensione.
Tabella dei certificati degli attributi: una struttura dati WIN_CERTIFICATE che incapsula la firma e i certificati e ha i seguenti campi:
dwLength: dimensione della tabella dei certificati.wRevision: la "revisione" di WIN_CERTIFICATE.wCertificateType: il tipo di dati del certificato incapsulato.bCertificate: i dati effettivi del certificato. Per WIN_CERT_TYPE_PKCS_SIGNED_DATA, si tratta della struttura PKCS#7 SignedData menzionata sopra (che contiene il valore hash del PE, la firma e il certificato x.509). È esattamente qui che SigFlip incorpora dati casuali o shellcode.Con tutto ciò in mente, ora SifFlip esegue le seguenti operazioni:
Il primo passaggio è essenziale per confermare se il sistema è configurato in modo errato tale da consentire il padding e l'iniezione di shellcode nei file PE firmati con authenticode; pertanto vengono eseguiti i seguenti controlli di integrità:
X86:
X64:
Il loader di Windows non carica i dati del certificato nello spazio degli indirizzi del processo; ecco perché è necessario un loader personalizzato per estrarre dati come shellcode e utilizzarli (es: SigLoader). Questo spiega anche perché IMAGE_DIRECTORY_ENTRY_SECURITY ha un RVA che è un offset di file invece di un tipico offset di memoria.
SigFlip "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "C:\lolbins\modified-msbuild.exe"SigInject "C:\Windows\System32\kernel32.dll" "C:\random\modified-kernel32.dll" "C:\shellcode\cobaltstrike_or_msf_shellcode.bin"Sigloader "C:\random\modified-kernel32.dll" "DECRYPTION_KEY" "C:\Windows\System32\werfault.exe" 6300Execute-Assembly:
execute-assembly SigFlip.exe -b C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -o C:\Temp\MSBuild.exeexecute-assembly SigFlip.exe -i C:\Windows\System32\kernel32.dll -s C:\Temp\x86shellcode.bin -o C:\Temp\kernel32.dll -e TestSecretKeyexecute-assembly SigLoader.exe -f C:\Temp\modified-kernel32.dll -e TestSecretKey -pid 2354