Cryptographic/Compression Algorithms
Last updated
Last updated
Impara e pratica il Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Se ti trovi in un codice che utilizza shift a destra e a sinistra, xors e diverse operazioni aritmetiche è altamente probabile che sia l'implementazione di un algoritmo crittografico. Qui verranno mostrati alcuni modi per identificare l'algoritmo utilizzato senza dover invertire ogni passaggio.
CryptDeriveKey
Se questa funzione è utilizzata, puoi scoprire quale algoritmo viene utilizzato controllando il valore del secondo parametro:
Controlla qui la tabella degli algoritmi possibili e i loro valori assegnati: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Comprimi e decomprimi un dato buffer di dati.
CryptAcquireContext
Dalla documentazione: La funzione CryptAcquireContext viene utilizzata per acquisire un handle a un particolare contenitore di chiavi all'interno di un particolare fornitore di servizi crittografici (CSP). Questo handle restituito è utilizzato nelle chiamate alle funzioni CryptoAPI che utilizzano il CSP selezionato.
CryptCreateHash
Inizia l'hashing di un flusso di dati. Se questa funzione è utilizzata, puoi scoprire quale algoritmo viene utilizzato controllando il valore del secondo parametro:
Controlla qui la tabella degli algoritmi possibili e i loro valori assegnati: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
A volte è davvero facile identificare un algoritmo grazie al fatto che deve utilizzare un valore speciale e unico.
Se cerchi la prima costante su Google, questo è ciò che ottieni:
Pertanto, puoi assumere che la funzione decompilata sia un calcolatore sha256. Puoi cercare qualsiasi altra costante e otterrai (probabilmente) lo stesso risultato.
Se il codice non ha alcuna costante significativa, potrebbe essere in caricamento di informazioni dalla sezione .data. Puoi accedere a quei dati, raggruppare il primo dword e cercarlo su Google come abbiamo fatto nella sezione precedente:
In questo caso, se cerchi 0xA56363C6 puoi scoprire che è correlato alle tabelle dell'algoritmo AES.
È composto da 3 parti principali:
Fase di inizializzazione/: Crea una tabella di valori da 0x00 a 0xFF (256 byte in totale, 0x100). Questa tabella è comunemente chiamata Substitution Box (o SBox).
Fase di mescolamento: Eseguirà un loop attraverso la tabella creata prima (loop di 0x100 iterazioni, di nuovo) modificando ciascun valore con byte semi-casuali. Per creare questi byte semi-casuali, viene utilizzata la chiave RC4. Le chiavi RC4 possono essere tra 1 e 256 byte di lunghezza, tuttavia di solito si raccomanda che siano superiori a 5 byte. Comunemente, le chiavi RC4 sono lunghe 16 byte.
Fase XOR: Infine, il testo in chiaro o il testo cifrato è XORato con i valori creati prima. La funzione per crittografare e decrittografare è la stessa. Per questo, verrà eseguito un loop attraverso i 256 byte creati tante volte quanto necessario. Questo è solitamente riconosciuto in un codice decompilato con un %256 (mod 256).
Per identificare un RC4 in un codice disassemblato/decompilato puoi controllare 2 loop di dimensione 0x100 (con l'uso di una chiave) e poi un XOR dei dati di input con i 256 valori creati prima nei 2 loop probabilmente usando un %256 (mod 256)
Uso di box di sostituzione e tabelle di ricerca
È possibile distinguere AES grazie all'uso di valori specifici delle tabelle di ricerca (costanti). _Nota che la costante può essere memorizzata nel binario o creata dinamicamente.
La chiave di crittografia deve essere divisibile per 16 (di solito 32B) e di solito viene utilizzato un IV di 16B.
È raro trovare malware che lo utilizzi, ma ci sono esempi (Ursnif)
Facile determinare se un algoritmo è Serpent o meno in base alla sua lunghezza (funzione estremamente lunga)
Nell'immagine seguente nota come la costante 0x9E3779B9 è utilizzata (nota che questa costante è utilizzata anche da altri algoritmi crittografici come TEA -Tiny Encryption Algorithm). Nota anche la dimensione del loop (132) e il numero di operazioni XOR nelle istruzioni di disassemblaggio e nell'esempio di codice:
Come è stato menzionato prima, questo codice può essere visualizzato all'interno di qualsiasi decompilatore come una funzione molto lunga poiché non ci sono salti al suo interno. Il codice decompilato può apparire come segue:
Pertanto, è possibile identificare questo algoritmo controllando il numero magico e i XOR iniziali, vedendo una funzione molto lunga e confrontando alcune istruzioni della lunga funzione con un'implementazione (come lo shift a sinistra di 7 e la rotazione a sinistra di 22).
Più complesso degli algoritmi simmetrici
Non ci sono costanti! (le implementazioni personalizzate sono difficili da determinare)
KANAL (un analizzatore crittografico) non riesce a mostrare indizi su RSA poiché si basa su costanti.
Nella riga 11 (sinistra) c'è un +7) >> 3
che è lo stesso della riga 35 (destra): +7) / 8
La riga 12 (sinistra) controlla se modulus_len < 0x040
e nella riga 36 (destra) controlla se inputLen+11 > modulusLen
3 funzioni: Init, Update, Final
Funzioni di inizializzazione simili
Init
Puoi identificare entrambi controllando le costanti. Nota che la sha_init ha 1 costante che MD5 non ha:
MD5 Transform
Nota l'uso di più costanti
Più piccolo e più efficiente poiché la sua funzione è trovare cambiamenti accidentali nei dati
Usa tabelle di ricerca (quindi puoi identificare costanti)
Controlla costanti della tabella di ricerca:
Un algoritmo hash CRC appare come:
Costanti non riconoscibili
Puoi provare a scrivere l'algoritmo in python e cercare cose simili online
Il grafico è piuttosto grande:
Controlla 3 confronti per riconoscerlo:
Impara e pratica il Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)