web-dev-qa-db-fra.com

Comment puis-je trouver un hachage SHA-256 avec un suffixe donné en utilisant hashcat?

Récemment, nous avons participé au CTF X-MAS 2019 et bon nombre des défis comprenaient une vérification de preuve de travail (PoW) pour éviter les attaques par déni de service (DoS) contre leurs serveurs. Le plus courant était qu'on nous a donné un suffixe de 6 caractères et qu'on nous a demandé de trouver quoi que ce soit où le hachage se terminait par ce suffixe:

Provide a hex string X such that sha256(X)[-6:] = abcdef

Le suffixe abcdef changerait chaque fois que vous vous connectez au serveur. Un exemple de réponse correcte:

hash = e38450c7008711d86a4d6c2039c8633a1ed637281b96888d7d9ff257aaabcdef
x = 4cbab1bbb03b4a10aef586b6

Cela peut-il être fait en utilisant hashcat?

5
Kristopher Ives

Cela n'est pas possible en utilisant hashcat, sauf si vous êtes prêt à modifier le code source en fonction de vos besoins.

Par exemple, vous pouvez adapter fork de s3inlc qui a ajouté une option pour vérifier les hachages avec certaines propriétés spécifiques (commençant/finissant avec autant de 0 que possible, etc.).

5
Benoit Esnard

Quelqu'un d'autre peut me corriger, mais je ne pense pas qu'il y ait d'autre moyen de répondre à cette requête que par la force brute (ce qui est, bien sûr, le point). Un algorithme de hachage puissant retourne efficacement une sortie aléatoire même pour de petits changements dans l'entrée, ils sont donc spécialement conçus pour que vous ne puissiez pas faire exactement ce que vous essayez de faire. Si vous pouviez deviner une entrée hachée avec un certain suffixe, vous seriez effectivement bien parti pour une attaque par collision, contre laquelle SHA256 est toujours sécurisé. Cependant, si vous savez quel est leur système de preuve de travail, vous pouvez profiter de ce simple fait.

Voici ce que je ferais:

  1. Je calculerais le hachage SHA256 de 10 à 20 millions de nombres (quel que soit le nombre que mon ordinateur peut calculer dans un délai raisonnable).
  2. Si, par exemple, j'ai calculé le hachage SHA256 des 16 premiers millions de chiffres, je m'attendrais à ce que cela me donne environ 5 millions de suffixes uniques à 6 caractères (je suppose énormément ici)
  3. Cela signifie que, si on vous demande une chaîne qui hache un suffixe aléatoire de 6 caractères, ma liste avec ~ 5 millions de suffixes uniques à 6 caractères a 30% de chances de contenir la réponse.
  4. Étant donné que la recherche est effectivement instantanée, cela signifie que je peux répondre au défi 30% du temps sans autre effort.
  5. Par conséquent, bien que mon DoS ait perdu une partie de son efficacité, je peux toujours passer!

Si vous avez un processeur rapide et pouvez calculer rapidement les hachages, vous pouvez essayer d'augmenter votre pool de siffix uniques (c'est-à-dire hacher plus de nombres). Notez que cela n'a pas vraiment d'importance quoi vous hachez - seulement le nombre de choses uniques que vous hachez, car chacune vous donnera un nouveau hachage et, potentiellement, un nouveau suffixe unique.

La clé ici est qu'essayer de faire correspondre un suffixe aléatoire de 6 caractères vous prendra en moyenne ~ 32 000 000 tentatives. Cependant, si vous stockez simplement les suffixes aléatoires de ces tentatives et créez une table de recherche, vous vous retrouverez probablement avec une base de données qui vous donnera un taux de réussite suffisamment décent sans avoir à faire d'autres calculs de hachage.

Le succès d'une telle chose dépend beaucoup des spécificités du problème, mais c'est probablement votre meilleur pari. Pour référence, les taux de hachage pour SHA256 sur les GPU "standard" se situent généralement entre 1 Mhash/s et 1000 Mhash/s. Cela signifie que si vous avez même un GPU bas de gamme (1 Mhash/s), vous pouvez hacher 100 000 000 d'entrées uniques en seulement quelques minutes. Estimant du haut de ma tête, je m'attends à ce qu'avec 100 000 000 de hachages, vous puissiez probablement obtenir un succès dans votre table de recherche pour environ 75% de leurs défis.

3
Conor Mancone

Pour ce que ça vaut, voici un petit script en python qui fera ce POW:

import hashlib
import random

h=None
while(h is None or h[-6:]!='abcdef'):
    p=random.randrange(1, 0xffffffffffffffffffffffff)
    h=hashlib.sha256(p.to_bytes(12, 'big')).hexdigest()

print('SHA256(' + hex(p) + ')=' + h)

Cela a pris environ 15 secondes pour fonctionner sur mon ordinateur portable (décent, assez récent) et a produit:

SHA256(0xea04518919c6caf94ee194e0)=51e6239c174b2cb27f40a06ebfd6e3ab2caab5a36769bfc64d26b1cbbcabcdef

Vérifier:

import hashlib

p=0xea04518919c6caf94ee194e0
h=hashlib.sha256(p.to_bytes(12, 'big')).hexdigest()
print('SHA256(' + hex(p) + ')=' + h)

Produit

SHA256(0xea04518919c6caf94ee194e0)=51e6239c174b2cb27f40a06ebfd6e3ab2caab5a36769bfc64d26b1cbbcabcdef

et de même pour p = 0x4cbab1bbb03b4a10aef586b6

2
mti2935