hacktricks/crypto-and-stego/cryptographic-algorithms
2024-04-06 18:35:30 +00:00
..
README.md GitBook: No commit message 2024-04-06 18:35:30 +00:00
unpacking-binaries.md GitBook: No commit message 2024-04-06 18:35:30 +00:00

Algoritmi crittografici/compressione

Algoritmi crittografici/compressione

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Identificazione degli algoritmi

Se ti trovi in un codice che utilizza shift a destra e sinistra, xor e diverse operazioni aritmetiche, è molto probabile che si tratti dell'implementazione di un algoritmo crittografico. Qui verranno mostrati alcuni modi per identificare l'algoritmo utilizzato senza dover invertire ogni passaggio.

Funzioni API

CryptDeriveKey

Se viene utilizzata questa funzione, è possibile trovare quale algoritmo viene utilizzato controllando il valore del secondo parametro:

Controlla qui la tabella degli algoritmi possibili e dei loro valori assegnati: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

Comprime e decomprime un determinato buffer di dati.

CryptAcquireContext

Da documentazione: La funzione CryptAcquireContext viene utilizzata per acquisire un handle a un particolare contenitore di chiavi all'interno di un particolare provider di servizi crittografici (CSP). Questo handle restituito viene utilizzato nelle chiamate alle funzioni CryptoAPI che utilizzano il CSP selezionato.

CryptCreateHash

Inizia l'hashing di un flusso di dati. Se viene utilizzata questa funzione, è possibile trovare quale algoritmo viene utilizzato controllando il valore del secondo parametro:


Controlla qui la tabella degli algoritmi possibili e dei loro valori assegnati: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Costanti di codice

A volte è molto facile identificare un algoritmo grazie al fatto che deve utilizzare un valore speciale e unico.

Se cerchi la prima costante su Google, otterrai questo risultato:

Pertanto, puoi assumere che la funzione decompilata sia un calcolatore sha256.
Puoi cercare qualsiasi altra costante e otterrai (probabilmente) lo stesso risultato.

informazioni sui dati

Se il codice non ha alcuna costante significativa, potrebbe essere 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.

RC4 (Crittografia simmetrica)

Caratteristiche

È 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 scrambling: Attraverserà la tabella creata in precedenza (ciclo di 0x100 iterazioni, ancora) modificando ogni valore con byte semi-random. Per creare questi byte semi-random, viene utilizzata la chiave RC4. Le chiavi RC4 possono essere lunghe da 1 a 256 byte, anche se di solito si consiglia di utilizzare una lunghezza superiore a 5 byte. Comunemente, le chiavi RC4 sono lunghe 16 byte.
  • Fase di XOR: Infine, il testo in chiaro o il testo cifrato viene XORato con i valori creati in precedenza. La funzione per crittografare e decrittografare è la stessa. A tal fine, verrà eseguito un ciclo attraverso i 256 byte creati tante volte quanto necessario. Questo di solito viene riconosciuto in un codice decompilato con un %256 (mod 256).

{% hint style="info" %} Per identificare un RC4 in un codice di disassemblaggio/decompilato, puoi controllare 2 cicli di dimensione 0x100 (con l'uso di una chiave) e quindi un XOR dei dati di input con i 256 valori creati in precedenza nei 2 cicli probabilmente usando un %256 (mod 256) {% endhint %}

Fase di inizializzazione/Substitution Box: (Nota il numero 256 utilizzato come contatore e come viene scritto uno 0 in ogni posizione dei 256 caratteri)

Fase di scrambling:

Fase di XOR:

AES (Crittografia simmetrica)

Caratteristiche

  • Utilizzo di tabelle 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.

Costanti SBox

Serpent (Crittografia simmetrica)

Caratteristiche

  • È raro trovare malware che lo utilizza, ma ci sono esempi (Ursnif)
  • Semplice determinare se un algoritmo è Serpent o meno in base alla sua lunghezza (funzione estremamente lunga)

Identificazione

Nell'immagine seguente, nota come viene utilizzata la costante 0x9E3779B9 (nota che questa costante viene utilizzata anche da altri algoritmi crittografici come TEA - Tiny Encryption Algorithm).
Nota anche la dimensione del ciclo (132) e il numero di operazioni XOR nelle istruzioni di disassemblaggio e nell'esempio di codice:

Come accennato in precedenza, questo codice può essere visualizzato all'interno di qualsiasi decompiler 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 gli XOR iniziali, osservando una funzione molto lunga e confrontando alcune istruzioni della lunga funzione con un'implementazione (come lo shift a sinistra di

RSA (Crittografia Asimmetrica)

Caratteristiche

  • Più complesso rispetto agli algoritmi simmetrici
  • Non ci sono costanti! (le implementazioni personalizzate sono difficili da determinare)
  • KANAL (un analizzatore crittografico) non fornisce suggerimenti su RSA in quanto si basa su costanti.

Identificazione tramite confronti

  • Nella riga 11 (sinistra) c'è +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

MD5 & SHA (hash)

Caratteristiche

  • 3 funzioni: Init, Update, Final
  • Funzioni di inizializzazione simili

Identificazione

Init

Puoi identificarli entrambi controllando le costanti. Nota che sha_init ha una costante che MD5 non ha:

MD5 Transform

Nota l'uso di più costanti

CRC (hash)

  • Più piccolo ed efficiente in quanto la sua funzione è trovare cambiamenti accidentali nei dati
  • Utilizza tabelle di ricerca (quindi puoi identificare le costanti)

Identificazione

Controlla le costanti delle tabelle di ricerca:

Un algoritmo di hash CRC assomiglia a:

APLib (Compressione)

Caratteristiche

  • Costanti non riconoscibili
  • Puoi provare a scrivere l'algoritmo in Python e cercare cose simili online

Identificazione

Il grafico è piuttosto grande:

Controlla 3 confronti per riconoscerlo:

Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: