hacktricks/reversing/cryptographic-algorithms/README.md

10 KiB

Algorithmes Cryptographiques/Compression

Algorithmes Cryptographiques/Compression

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :

Identification des Algorithmes

Si vous tombez sur un code utilisant des décalages à droite et à gauche, des xors et plusieurs opérations arithmétiques, il est fort probable qu'il s'agisse de l'implémentation d'un algorithme cryptographique. Ici, il sera montré des moyens d'identifier l'algorithme utilisé sans avoir à inverser chaque étape.

Fonctions API

CryptDeriveKey

Si cette fonction est utilisée, vous pouvez trouver quel algorithme est utilisé en vérifiant la valeur du deuxième paramètre :

Consultez ici le tableau des algorithmes possibles et leurs valeurs attribuées : https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

Compresse et décompresse un tampon de données donné.

CryptAcquireContext

La fonction CryptAcquireContext est utilisée pour acquérir un handle vers un conteneur de clés spécifique au sein d'un fournisseur de services cryptographiques (CSP) particulier. Ce handle retourné est utilisé dans les appels aux fonctions CryptoAPI qui utilisent le CSP sélectionné.

CryptCreateHash

Initie le hachage d'un flux de données. Si cette fonction est utilisée, vous pouvez trouver quel algorithme est utilisé en vérifiant la valeur du deuxième paramètre :


Consultez ici le tableau des algorithmes possibles et leurs valeurs attribuées : https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Constantes de Code

Parfois, il est très facile d'identifier un algorithme grâce au fait qu'il doit utiliser une valeur spéciale et unique.

Si vous recherchez la première constante sur Google, voici ce que vous obtenez :

Par conséquent, vous pouvez supposer que la fonction décompilée est un calculateur sha256.
Vous pouvez rechercher n'importe laquelle des autres constantes et vous obtiendrez (probablement) le même résultat.

Informations sur les données

Si le code ne contient aucune constante significative, il peut charger des informations à partir de la section .data.
Vous pouvez accéder à ces données, regrouper le premier dword et le rechercher sur Google comme nous l'avons fait dans la section précédente :

Dans ce cas, si vous recherchez 0xA56363C6, vous pouvez trouver qu'il est lié aux tables de l'algorithme AES.

RC4 (Crypt Symétrique)

Caractéristiques

Il est composé de 3 parties principales :

  • Phase d'initialisation/ : Crée une table de valeurs de 0x00 à 0xFF (256 octets au total, 0x100). Cette table est communément appelée Boîte de Substitution (ou SBox).
  • Phase de brouillage : Va parcourir la table créée précédemment (boucle de 0x100 itérations, encore) en modifiant chaque valeur avec des octets semi-aléatoires. Pour créer ces octets semi-aléatoires, la clé RC4 est utilisée. Les clés RC4 peuvent être entre 1 et 256 octets de longueur, cependant il est généralement recommandé qu'elle soit supérieure à 5 octets. Habituellement, les clés RC4 font 16 octets de longueur.
  • Phase XOR : Enfin, le texte clair ou le texte chiffré est XORé avec les valeurs créées précédemment. La fonction pour chiffrer et déchiffrer est la même. Pour cela, une boucle à travers les 256 octets créés sera effectuée autant de fois que nécessaire. Ceci est généralement reconnu dans un code décompilé avec un %256 (mod 256).

{% hint style="info" %} Pour identifier un RC4 dans un code désassemblé/décompilé, vous pouvez vérifier 2 boucles de taille 0x100 (avec l'utilisation d'une clé) puis un XOR des données d'entrée avec les 256 valeurs créées précédemment dans les 2 boucles probablement en utilisant un %256 (mod 256) {% endhint %}

Phase d'initialisation/Boîte de Substitution : (Notez le nombre 256 utilisé comme compteur et comment un 0 est écrit à chaque place des 256 caractères)

Phase de Brouillage :

Phase XOR :

AES (Crypt Symétrique)

Caractéristiques

  • Utilisation de boîtes de substitution et de tables de recherche
  • Il est possible de distinguer AES grâce à l'utilisation de valeurs spécifiques de tables de recherche (constantes). Notez que la constante peut être stockée dans le binaire ou créée dynamiquement.
  • La clé de chiffrement doit être divisible par 16 (généralement 32B) et généralement un IV de 16B est utilisé.

Constantes SBox

Serpent (Crypt Symétrique)

Caractéristiques

  • Il est rare de trouver des malwares l'utilisant mais il y a des exemples (Ursnif)
  • Simple à déterminer si un algorithme est Serpent ou non en fonction de sa longueur (fonction extrêmement longue)

Identification

Dans l'image suivante, notez comment la constante 0x9E3779B9 est utilisée (notez que cette constante est également utilisée par d'autres algorithmes cryptographiques comme TEA -Tiny Encryption Algorithm).
Notez également la taille de la boucle (132) et le nombre d'opérations XOR dans les instructions de désassemblage et dans l'exemple de code :

Comme mentionné précédemment, ce code peut être visualisé dans n'importe quel décompilateur comme une fonction très longue car il n'y a pas de sauts à l'intérieur. Le code décompilé peut ressembler à ce qui suit :

Par conséquent, il est possible d'identifier cet algorithme en vérifiant le nombre magique et les XOR initiaux, en voyant une fonction très longue et en comparant certaines instructions de la longue fonction avec une implémentation (comme le décalage à gauche de 7 et la rotation à gauche de 22).

RSA (Crypt Asymétrique)

Caractéristiques

  • Plus complexe que les algorithmes symétriques
  • Il n'y a pas de constantes ! (les implémentations personnalisées sont difficiles à déterminer)
  • KANAL (un analyseur crypto) échoue à donner des indices sur RSA car il repose sur des constantes.

Identification par comparaisons

  • À la ligne 11 (gauche), il y a un +7) >> 3 qui est le même qu'à la ligne 35 (droite) : +7) / 8
  • La ligne 12 (gauche) vérifie si modulus_len < 0x040 et à la ligne 36 (droite) elle vérifie si inputLen+11 > modulusLen

MD5 & SHA (hash)

Caractéristiques

  • 3 fonctions : Init, Update, Final
  • Fonctions d'initialisation similaires

Identifier

Init

Vous pouvez identifier les deux en vérifiant les constantes. Notez que le sha_init a 1 constante que MD5 n'a pas :

Transformation MD5

Notez l'utilisation de plus de constantes

CRC (hash)

  • Plus petit et plus efficace car sa fonction est de trouver des changements accidentels dans les données
  • Utilise des tables de recherche (donc vous pouvez identifier des constantes)

Identifier

Vérifiez les constantes de la table de recherche :

Un algorithme de hash CRC ressemble à :

APLib (Compression)

Caractéristiques

  • Pas de constantes reconnaissables
  • Vous pouvez essayer d'écrire l'algorithme en python et rechercher des choses similaires en ligne

Identifier

Le graphe est assez grand :

Vérifiez 3 comparaisons pour le reconnaître :

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :