it-swarm.com.de

Wie kann ich mit Hashcat einen SHA-256-Hash mit einem bestimmten Suffix finden?

Vor kurzem haben wir an der X-MAS 2019 CTF teilgenommen. Zu den Herausforderungen gehörte eine PoW-Prüfung (Proof of Work), um DoS-Angriffe (Denial of Service) auf ihre Server zu vermeiden. Am häufigsten wurde uns ein 6-stelliges Suffix gegeben und wir wurden gebeten, alles zu finden, wo der Hash mit diesem Suffix endete:

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

Das Suffix abcdef ändert sich jedes Mal, wenn Sie eine Verbindung zum Server herstellen. Ein Beispiel für eine korrekte Antwort:

hash = e38450c7008711d86a4d6c2039c8633a1ed637281b96888d7d9ff257aaabcdef
x = 4cbab1bbb03b4a10aef586b6

Kann dies mit hashcat erfolgen?

5
Kristopher Ives

Dies ist mit Hashcat nur möglich, wenn Sie bereit sind, den Quellcode an Ihre Bedürfnisse anzupassen.

Zum Beispiel können Sie s3inlc's fork anpassen, wodurch eine Option hinzugefügt wurde, um nach Hashes mit bestimmten Eigenschaften zu suchen (beginnend/endend mit so viel 0 wie möglich usw.).

5
Benoit Esnard

Jemand anderes mag mich korrigieren, aber ich glaube nicht, dass es eine Möglichkeit gibt, diese Frage zu beantworten, außer mit brutaler Gewalt (was natürlich der Punkt ist). Ein starker Hashing-Algorithmus gibt effektiv zufällige Ausgaben für selbst kleine Änderungen in der Eingabe zurück. Daher sind sie speziell so konzipiert, dass Sie nicht genau das tun können, was Sie versuchen. Wenn Sie eine Eingabe erraten könnten, die mit einem bestimmten Suffix gehasht wurde, wären Sie auf dem besten Weg zu einem Kollisionsangriff, gegen den SHA256 immer noch sicher ist. Wenn Sie jedoch wissen, was ihr Beweis für das Arbeitssystem ist, können Sie diese einfache Tatsache ausnutzen.

Das würde ich tun:

  1. Ich würde den SHA256-Hash von 10 bis 20 Millionen Zahlen berechnen (wie viele mein Computer auch in angemessener Zeit berechnen kann).
  2. Wenn ich zum Beispiel den SHA256-Hash der ersten 16 Millionen Zahlen berechnen würde, würde ich erwarten, dass ich ungefähr 5 Millionen eindeutige 6-Zeichen-Suffixe bekomme (ich vermute hier wild)
  3. Das bedeutet, dass meine Liste mit ~ 5 Millionen eindeutigen 6-Zeichen-Suffixen eine 30% ige Chance hat, die Antwort zu enthalten, wenn ich nach einer Zeichenfolge gefragt werde, die mit einem zufälligen 6-Zeichen-Suffix versehen ist.
  4. Da die Suche effektiv sofort erfolgt, kann ich die Herausforderung 30% der Zeit ohne weiteren Aufwand beantworten.
  5. Obwohl mein DoS einen Teil seiner Wirksamkeit verloren hat, kann ich trotzdem durchkommen!

Wenn Sie eine schnelle CPU haben und Hashes schnell berechnen können, können Sie versuchen, Ihren Pool an eindeutigen Siffixen (d. H. Mehr Hash-Zahlen) zu vergrößern. Beachten Sie, dass es eigentlich egal ist was Sie Hash - nur die Anzahl der eindeutigen Dinge, die Sie hashen, da jedes Ihnen einen neuen Hash und möglicherweise ein neues eindeutiges Suffix gibt.

Der Schlüssel hier ist, dass der Versuch, einem zufälligen 6-Zeichen-Suffix zu entsprechen, durchschnittlich ~ 32.000.000 Versuche erfordert. Wenn Sie jedoch nur die zufälligen Suffixe dieser Versuche speichern und eine Nachschlagetabelle erstellen, erhalten Sie wahrscheinlich eine Datenbank, die Ihnen eine ausreichend gute Erfolgsquote bietet, ohne weitere Hashing-Berechnungen durchführen zu müssen.

Wie erfolgreich so etwas sein würde, hängt stark von den Besonderheiten des Problems ab, aber es ist wahrscheinlich die beste Wahl. Als Referenz liegen die Hashing-Raten für SHA256 auf "Standard" -GPUs normalerweise zwischen 1 Mhash/s und 1000 Mhash/s. Dies bedeutet, dass Sie, wenn Sie sogar eine Low-End-GPU haben (1 Mhash/s), in nur wenigen Minuten 100.000.000 eindeutige Eingaben hashen können. Ich schätze, dass Sie mit 100.000.000 Hashes wahrscheinlich einen Treffer in Ihrer Nachschlagetabelle für etwa 75% ihrer Herausforderungen landen könnten.

3
Conor Mancone

Für das, was es wert ist, ist hier ein kurzes Skript in python, das diese Kriegsgefangenschaft ausführt:

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)

Es dauerte ungefähr 15 Sekunden, bis es auf meinem (anständigen, ziemlich neuen) Laptop lief und produzierte:

SHA256(0xea04518919c6caf94ee194e0)=51e6239c174b2cb27f40a06ebfd6e3ab2caab5a36769bfc64d26b1cbbcabcdef

Verifizieren:

import hashlib

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

Produziert

SHA256(0xea04518919c6caf94ee194e0)=51e6239c174b2cb27f40a06ebfd6e3ab2caab5a36769bfc64d26b1cbbcabcdef

und ebenfalls für p = 0x4cbab1bbb03b4a10aef586b6

2
mti2935