[GELÖST] Bruteforce AEZEED: ein Seedword fehlt (23. Wörter vorhanden) - Umbel Lightning Wallet

Hey,

beim neu einrichten von meines Umbrels und der Lightning Node ist mir aufgefallen, dass ich Depp nur 23 Wörter notiert habe.

Kennt ihr eine Bruteforce Methode, wie ich das fehlende Wort finden kann? Ich bin IT Noob.

Meinen Notizen nach ist es relativ wahrscheinlich, dass es eines der ersten 12 Wörter, das ich beim aufschreiben des Seeds übersprungen habe. Sehr wahrscheinlich wird es nicht eines der ersten fünf Wörter sein. Bin aber nicht ganz sicher, ob das stimmt.

Danke und Grüße für jeden Tipp. Geht zum Glück nicht um gigantische Summen.

Bin mir gerade nicht 100% sicher, aber kannst du dir den Seed bei Umbrel nicht einfach in den Einstellungen nochmal anzeigen lassen?

1 „Gefällt mir“

Das kann man, aber ich habe die App dummerweise zuvor deinstalliert, da es Probleme mit Umbrel gab. Jetzt kann ich es nicht mehr.

Ich bin gerade dabei es mit btcrecover (Github) zu retten…

Damit geht es nicht, da es kein BIP39/44 Wallet Type ist, sondern LND (AEZEED).

Es sieht so aus, als hätte ich meinen Teil dem Netzwerk gespendet :saluting_face:

cool bleiben.
auch bei aezeed wirst du das letzte wort finden.
derweil keinesfalls in ein online tool eingeben!

2 „Gefällt mir“

Falls es hier Leute gibt, die ein bisschen Ahnung von Python haben und mir helfen wollen: Das hier hat mir ChatGPT nach ein bisschen herumprobieren gebaut.

Es gibt keine Fehlermeldung und er läuft das Skript auch durch, aber es funktioniert nicht. Er sagt immer „Das fehlende Wort konnte nicht gefunden werden.“ Ich habe zum Test einen neuen Seed generiert und mir eine neue Walletadresse anzeigen lassen, weswegen ich weiß, dass er das Wort hätte finden müssen.

Was ich wollte, was das Skript macht: Es versucht jedes Wort der BIP39 Wordlist als zweites Wort im Seedphrase und schaut dann, ob unter einer der ersten 5 generierten Walletadressen die Wallet mit der Endung ***4gc5l dabei ist. Wie gesagt: Er findet sie nicht.

Was habe ich nicht beachtet?

Keine Sorge: Der Seed und die Walletadresse sind valide. Dieser ist aber nicht mein ‚persönlicher‘ Seed.

import hashlib
import hmac
from mnemonic import Mnemonic
from bitcoinlib.keys import HDKey

known_words = ['abandon', 'solve', 'exit', 'weather', 'flower', 'hero', 'mind', 'put', 'myth', 'kite', 'rescue', 'assist', 'mouse', 'someone', 'bachelor', 'man', 'merge', 'trip', 'admit', 'inside', 'stadium', 'drip', 'mean']  # Liste der bekannten Wörter
missing_word_position = 2  # Position des fehlenden Wortes in der Seed-Phrase

# Laden der BIP-39-Wordlist
with open('bip39_wordlist.txt', 'r') as f:
    bip39_wordlist = [line.strip() for line in f]

def check_address(address):
    expected_addresses = ['bc1qqgfqj23gsrv8wthv2lwe5c8ptjze6peyk4gc5l']  # Liste der erwarteten Adressen

    if address in expected_addresses:
        return True
    else:
        return False

def generate_addresses(seed):
    # Hier implementieren Sie die Logik zur Generierung der Bitcoin-Adressen im aezeed-Format
    # Verwenden Sie die lnd-Dokumentation und die Unterstützung der lnd-Community, um die korrekte Logik zu finden

    # Beispielcode zum Generieren von Bitcoin-Adressen mit bitcoinlib:
    addresses = []
    for address_index in range(5):
        address_extended_key = hmac.new(seed, bytes([address_index]), hashlib.sha256).digest()

        # Ableitung des HD-Schlüssels aus dem Extended Key
        hd_key = HDKey.from_seed(address_extended_key)

        # Generierung der Bitcoin-Adresse aus dem HD-Schlüssel
        address = hd_key.address()

        addresses.append(address)

    return addresses

def find_missing_word():
    for missing_word in bip39_wordlist:
        seed_phrase = known_words[:missing_word_position] + [missing_word] + known_words[missing_word_position:]
        m = Mnemonic("english")
        seed = m.to_seed(" ".join(seed_phrase))
        addresses = generate_addresses(seed)
        
        for address in addresses:
            if check_address(address):
                return " ".join(seed_phrase)
    
    return None

# Aufrufen der Funktion zum Finden des fehlenden Wortes
missing_word = find_missing_word()

if missing_word is not None:
    print("Das fehlende Wort wurde gefunden:", missing_word)
else:
    print("Das fehlende Wort konnte nicht gefunden werden.")

Ich muss wahrscheinlich warten, bis irgendwann ein Tool für meinen Fall verfügbar ist.

du musst noch über die möglichen positionen iterieren:

def find_missing_word():
    for missing_word in bip39_wordlist:
        for i in range(len(known_words)):
            seed_phrase = known_words[:i] + [missing_word] + known_words[i:]
            m = Mnemonic("english")
            seed = m.to_seed(" ".join(seed_phrase))
            addresses = generate_addresses(seed)
            for address in addresses[:5]:
                if check_address(address):
                    return " ".join(seed_phrase)
    return None

dann musst du noch schauen, dass du die adressen mit dem korrekten ableitungspfad und mit dem korrekten adresstyp erstellst.

EDIT:

If no passphrase is provided, then the string “aezeed” will be used.

Danke für deine Hilfe. Fühl dich nicht verpflichtet hier zu helfen.

Ich habe keine Ahnung wie. Ich bin wirklich ein blutiger Anfänger von der technischen Seite.

Also was ich „rausgefunden“ habe.

Hier: Cryptography Toolkit kann man den AEZEED Seed als „HD node root key base58“ anzeigen lassen.

Diesen kann man hier: BIP39 - Mnemonic Code bei „BIP32 Root Key“ eingeben und unter den Derivation Path BIP84 (also m/84’/0’/0’/0) sieht man dann die korrekte Walletadresse als dritte angezeigt.

Wie man diese Info in Phyton einbaut, um die korrekte Adressen und Ableitungen zu wählen, weiß ich aktuell noch nicht.

Ich kann gerne mal meine Frau fragen, die hat bestimmt das letzte Wort.

Vielleicht / hoffentlich geht es dann aber um gigantische Summen :wink:

Im Ernst: Wenn Du wirklich einfach nur ein Wort vergessen hast aufzuschreiben, die anderen Wörter und deren Reihenfolge aber stimmen, besteht mMn durchaus noch gute Hoffnung.
Auf ChatGPT würde ich mich aber nicht zu sehr verlassen.

Was ich nicht verstehe (mangels Wissen):

Im Python Code wird aber die bip39_wordlist verwendet?! Aber es ist kein BIP39 Wallet?
Das Schwierige wird mMn sein, die richtigen Bibliotheken zu finden, um korrekt aus den Wörtern den seed und die Adressen abzuleiten.

1 „Gefällt mir“

aezeed verwendet auch die bip39 wordlist, aber die Ableitungsfunktion ist eine andere.

…das kenne ich nur zu gut! :laughing:

Vielen Dank für die Info.
Ich bin dabei über

gestolpert, da ich mich mit Python nicht auskenne, mit Java aber gut.

Ist denn LND = AEZEED?!
bzw. verwendet LND Aezeed?

Weis jemand, ob LightningJ das kann, was der TE braucht? Da sehe ich mangels praktischer Erfahrung noch nicht ganz durch.

Ja genau.

Ich habe gestern ohne Python Kenntnisse ein Skript gebaut, dass für die „regulären“ BIP39/44 Wallets genau das macht, was ich für AEZEED Wallets brauche, indem ich nur geschrieben habe was ich machen möchte und danach nur die Fehlercodes neu bei ChatGPT eingegeben habe. (Solche Tools für diese Wallets gibts natürlich schon mehrere im Internet) Leider kann es mir nicht bei aezeed weiterhelfen bzw. ich bin noch zu dumm.

Notfalls wird es irgendwann eine Schatzsuche für meine Kids, wenn es genug Vermögen ist. :+1:

Wie alt sind denn die lieben Kleinen? :wink:
Also sooo lange sollte es doch nicht dauern. Habe heute morgen (leider ohne Erfolg) versucht, dieses LightningJ zu installieren. Mal sehen ob ich es noch schaffe und es das kann, was wir brauchen.

Der liebe Roman hatte auch mal ein Video-Interview mit Jungs die das für dich machen gegen Provision.
Und jedem dem der Blocktrainer vertraut würde ich auch einfach vertrauen.
Wenn jetzt natürlich wirklich zu wenig Sats zu retten sind wird sich das auch nicht mehr lohnen.
Wollte nur sagen, das es dafür schon Spezialisten gibt.
Auch wenn ich gerade nicht mehr weiß wie die hießen.
Findest du schon bei Interesse.

Ich hänge das Video einfach mal hier dran.
Wird in der Zukunft ja evtl. noch für andere hier im Forum von Interesse sein.

Verlorene Bitcoin & Crypto Wallets wiederherstellen! | ReWallet im Interview

Wenn du das korrekte Script hast, wird es leicht möglich sein, dass zu Brute Forcen (in Bezug auf Rechenleistung).
Es gibt 24 Positionen an denen das Wort stehen könnte bei 2048 verschiedenen Wörtern.

Ich habe zum Spaß mal ein Script in Python programmiert welches die letzten 2 Wörter eines Seeds brute forced und das hat den seed nach 4 Minuten gefunden (bei 2048*2048 Möglichkeiten).

Kennst du die erste Adresse, welche generiert wurde durch den seed? Oder eine der ersten 10?
Wie lauteten die ersten Zeichen der Adressen?
Starten sie mit „3“, „bc1q“ oder „bc1p“?
Das ist dann auch hilfreich für das Script.

1 „Gefällt mir“

Aber dein Skript für die „normalen“ BIP39 Wallets (wie z.B. von den meisten Hardware Wallets genutzt), richtig?

Ich kenne nicht die erste Adresse und kann nicht sicher sagen, die wievielte Adresse ich kenne, da Umbrel mit jedem Klick auf „Deposit“ eine neue Adresse anzeigt, auch wenn die vorherige noch nicht genutzt wurde. Kann sein, dass ich damals ein paar Adressen angezeigt habe, bevor ich dann eine genutzt habe.

Aber ich habe eine Adresse, die noch am selben Tag der Einrichtung von Umbrel ist. Diese startet mit bc1q und sollte (etwa 80% Wahrscheinlich) unter den ersten 10 Adressen sein.

Ja richtig. Für Aezeed habe ich noch nie sowas gemacht.

Ich weiß, dass Aezeed anders funktioniert, aber konnte nicht rausfinden wie genau die Keys sich ableiten lassen.
bc1q ist schonmal eine der beiden native segwit Adressen. Entweder P2WPKH oder P2WSH, vermutlich aber eher ersteres, da zweiteres für scripts verwendet wird.

Der Weg wäre eventuell folgender:

1.Finde ein Script welches aus einem aezeed einen Master private key erstellt.

  1. Konfiguriere es so, dass es jede Möglichkeit ausprobiert ein zusätzliches Wort vor/hinter oder zwischen deine vorhandenen 23 zu schieben. Damit hast du 24*2048 Möglichkeiten. Hiervon sind aber nur relativ wenige (vermutlich ein paar hundert) überhaupt gültig aufgrund der Checksum.

  2. Berechne aus jeden der gültigen Master Private Keys die ersten x Adressen und vergleiche sie mit deiner Bekannten Adresse.
    Ich würde im path m/84’/0’/0’/0/x suchen wobei x eine variable ist die du durch probieren musst. Wenn du denkst die Adresse ist eine der ersten 10, dann guckst du von m/84’/0’/0’/0/0 bis m/84’/0’/0’/0/9.

Ohne Erfahrung im programmieren ist dies vermutlich nicht leicht. Und dass ChatGPT da weiter helfen kann, würde mich leider wundern.

1 „Gefällt mir“

:+1:

Genau das ist der Weg. Aber ich habe einige Zeit gesucht und nichts öffentlich gefunden. Es muss wahrscheinlich erst nochmal programmiert werden.

Ich werde in Erfahrung bringen müssen, wie sich die aezeed Keys ableiten. Auf dieser Seite gibt es ein Tool (java), dass dies kann: https://guggero.github.io/cryptography-toolkit/#!/aezeed

Wenn ich die validen möglichen Seeds habe, kann ich die Adressen kann ich notfalls auch manuell überprüfen.