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

Das mit dem manuellen überprüfen ist aber vermutlich auch viel Arbeit. Das werden schon ein paar hundert Seeds sein.

Wenn du aber erstmal den Master key hast, dann denke ich kannst du öffentlich verfügbare scripts nehmen. Du musst nur den derivation path anpassen.

Was verstehe ich hier nicht (oder falsch) bzgl. „öffentlich“?
Ursprünglich hast Du doch LND verwendet zum Erzeugen des Seeds und der Adressen. Und das ist doch öffentlich:

The Lightning Network Daemon (LND) is a complete implementation of an LN node by Lightning Labs. The LND project provides a number of executable applications, including lnd (the daemon itself) and lncli (the command-line utility). LND has several pluggable backend chain services, including btcd (a full node), bitcoind (Bitcoin Core), and Neutrino (a new, experimental light client). LND is written in the Go programming language. The project is open source and developed collaboratively on GitHub.

(Quelle: 4. Lightning Node Software - Mastering the Lightning Network [Book])

Da muss mMn nichts „neu programmiert“ werden. Entweder ist es möglich, „von aussen“ (d.h. per API) auf die benötigten Funktionen von LND zuzugreifen, oder im Notfall müsste man den Code aus dem Projekt raussuchen und „von Hand“ ausführen.

Für erstere Variante gibt es z.B. dieses LightningJ, das ich nun erfolgreich auf meinem Laptop installiert habe. Nur leider habe ich nicht so weit gedacht, dass ich ja auch das LND installieren müsste. Und ich glaube das braucht dann ein bitcoind und die gesamte Blockchain im Hintergrund?!

Oder hat jemand Erfahrung damit, nur LND zum Laufen zu bringen um Adressen etc. zu erzeugen, ohne bincoind dahinter?

1 „Gefällt mir“

Das ist richtig. LND ist in der „Go“ Programmiersprache programmiert und Open Source. Theoretisch kann man daraus alles lesen was man braucht, muss es dann aber nunmal auch an den Anwendungsfall anpassen, den Seed zu brute forcen. Im LND source code gibt es bestimmt keine Funktion der man 23 Wörter gibt und die das 24. dann sucht.

Ich zum Beispiel verstehe den LND code leider nicht (ich kenne mich mit Go nicht aus) und kann ihn daher auch nicht verwenden außerhalb dessen was von den LND Devs vorgesehen ist.

Mit „öffentlich“ meinte ich öffentlich verfügbare scripte, welche tatsächlich für Brute Force Anwendungen sind. Diese sind aber vermutlich nur für BIP 39 oder halt Master Private keys programmiert.

Stichwort Neutrino
https://github.com/lightningnetwork/lnd/blob/master/docs/INSTALL.md#using-neutrino
Erfahrung leider nein, Problem dürfte wohl das Finden einer öffentlichen Instanz zu sein.

1 „Gefällt mir“

Ach nee?! Das war meine einzige Hoffnung :stuck_out_tongue:

Im Ernst, ich dachte wir sind uns über die Schritte unterdessen prinzipiell einig. Du hast es doch schon beschrieben:

Schritt 1 und 3 sollte der Einfachheit direkt von LND aufgerufen werden können via API (RPC).

Schritt 3 eventuell sowas wie

Da gibts ja sogar fertige Javascript-Anwendungsbeispiele!!

Schritt 2, das Brute-Forcen ist vergleichsweise sehr simpel. Bei aller Bescheidenheit, wenn ich die 23 Wörter und die Wortliste hätte ginge das kaum 1/2 Stunde zum Programmieren.

Natürlich muss man es dann iwie so machen, dass der TE das bei sich lokal ausführen kann. Ich bin kein nigerianischer Prinz und brauche seine 23 Wörter daher nicht.

1 „Gefällt mir“

Vielen Dank für diesen Hinweis…

Das ist ganz normal in der Softwareentwicklung. :wink:

äh nein, eher nicht :wink:

A public instance of such a node can be found at faucet.lightning.community.

Der Beitrag hat mich auch erst auf die Idee gebracht, dass man ja das Testnet nehmen kann.

Das ist tatsächlich sehr interessant. Eventuell könnte es funktionieren wie du sagst. Ich wusste nicht, dass LND da eine komplett fertige API für hat.

Ich habe für Schritt 1 noch folgendes gefunden:

Ich frage mich da nur, ob man die Befehle „quasi aus dem nichts heraus“ ausführen kann.

Die scheinen ja eine Anbindung an eine LND Instanz zu erwarten.

Die Wordlist ist die BIP39 Wordlist.

Zum probieren kannst du gerne diese Beispielwörter (nicht mein verlorener Key, aber ein valider AEZEED Seed) nehmen: [‚abandon‘, ‚solve‘, ‚exit‘, ‚weather‘, ‚flower‘, ‚hero‘, ‚mind‘, ‚put‘, ‚myth‘, ‚kite‘, ‚rescue‘, ‚assist‘, ‚mouse‘, ‚someone‘, ‚bachelor‘, ‚man‘, ‚merge‘, ‚trip‘, ‚admit‘, ‚inside‘, ‚stadium‘, ‚drip‘, ‚mean‘]

Das fehlende Wort ist in diesem Test-Beispiel an Position 2
Adresse 3 (BIP84) des Beispiel–Seeds ist: bc1qqgfqj23gsrv8wthv2lwe5c8ptjze6peyk4gc5l

Also wenn du ein Skript schreibst, wo ich nur die Wörter durch meine Wörter austauschen müsste, wäre das perfekt.

Ich kann es über OpenBSD Terminal oder in Tails oder in Windows über cmd ausführen (Python installiert).

Vielen Dank an Eure Hilfe schon jetzt!

Also ich hätte es ggf. in Java oder Javascript gemacht, da ich Python kaum kenne.

Und das Beispiel ist auch sehr hilfreich, danach hätte ich früher oder später gefragt :wink:

Und einfach damit gefragt ist:
Ich nehme an, Du hast schon überprüft, dass Du wirklich ein Wort vergessen hast aufzuschreiben?! Und nicht z.B. Wort x = Baum, Wort x+1=stamm und auf Deiner Liste steht „Baumstamm“ und Du hast eigentlich nur das Leerzeichen vergessen oä?!

Edit: Ich war eigentlich sicher, dass die Wörter in der Liste „klug“ ausgewählt sind, um möglichst Missverständnisse zu vermeiden.
So etwas hätte ich eher nicht erwartet:
430 cup
431 cupboard

ebenso car, cart und cat etc.

Nein, es sind 23 Wörter. Bei der Lightning Wallet in Umbrel werden in einem 4x5 Raster alle Seed-Wörter auf einmal angezeigt. Ich habe es in zwei Spalten notiert und habe auf einer Seite andere Abstände zwischen den Worten gehabt, so dass am Ende beide Spalten gleich lang aussehen, aber in einer ein Wort fehlt.

Ich Vollidiot habe den Seed danach wohl nicht noch mal geprüft.

Kann gut sein, dass es damit besser funktioniert.

Das mit dem Beispielseed ist sehr gut.
Ich hätte mir vermutlich auch ein Beispielseed erstellt an dem ich so ein Script testen kann.

Die BIP39 Wörter sind so gewählt, dass man mit den ersten 4 Buchstaben eindeutig sagen kann welches Wort es ist.
Dass aber ähnliche Wörter wie car und cart vorkommen, finde ich schon sehr blöd.

Mir ist aber leider etwas eingefallen, was oben genannte Methode doch schwer ausführbar macht.

Nehmen wir an, wir haben unser fertiges Script, welche die LND API nutzt.
Es würde jetzt Seed 0 (unseren ersten Brute Force Versuch) an den LND node übergeben und dieser antwortet mit einer Art Master Priv Key oder in den meisten Fällen mit „invalid checksum“ oder so ähnlich.

Wer von euch mal über cmd einen Befehl wie „lncli getinfo“ übermittelt hat, weiß, dass die Antwort nicht sofort kommt.
Sie braucht zwar nicht lange, aber doch lange genug, dass ich nicht 24*2048(=49152) mal diese Antwort abwarten möchte.

Darüber hinaus muss ja bei allen validen Seeds ja auch noch Adresse 0-9 erstellt werden, wobei wieder 10 API calls gemacht werden müssen.

Das Script könnte gut und gerne 10-20h laufen bis alle Möglichkeiten ausprobiert sind.

Wenn da auf dem Node viel Geld ist, macht man das natürlich, aber es ist nicht wie bei anderen scripted, welche innerhalb des scripts alles machen und keine API nutzen müssen.

Das wäre vollkommen okay.

Für das Testscript kann man ja gezielt die Position 2 nehmen und nur drei Adressen erstellen.

Zur Info: Position 2 (also Wort 2) ist im Script wahrscheinlich eine 1, da es bei 0 anfängt.

Also besser nicht, _ich_funktioniere damit besser. :wink:
Es ging mir dabei eher darum, dass Du dann eine jre brauchst, falls es in Java wäre. Und ev. ein .jar File ausführen müsstest, was meines Wissens nach auch einiges an Vertrauen benötigt, das man eigentlich nicht in fremde Leute haben sollte. Von daher wäre JavaScript ev. besser.

Was glaubst Du, wie lange mein Vanity Address Finder gelaufen ist :wink:

Hat sich da noch etwas getan? Ist das Thema noch aktuell?

Es hat sich leider noch nichts weiteres getan und das Thema ist noch aktuell.

Ich werde mich melden, wenn und wie dieses Problem behoben wurde.

Für Ideen und Hilfe bin ich immer dankbar. Eine kleine Bounty bzw Spende an OpenSats wird es dann auch geben.

Ok! Habe am WE nochmals etwas versucht, mit LingntningJ und der API rumzuspielen.
Ich denke aber, wir werden um eine lokale Installation von bitcoind und lnd nicht herumkommen. Zuerst dachte ich, man könnte ev. eine öffentliche Instanz im Testnet dazu verwenden. Aber ich möchte diese eigentlich nicht mit 24*2048 Requets bewerfen. Danach möchte diese dann ev. nicht mehr mit mir befreundet sein :wink:

Habe festgestellt dass ich sogar noch eine bitcoin-0.21.0 Version auf dem Rechner hatte. Man wird vergesslich im Alter. Habe mal die Testnet Chain gesynct, das geht relativ schnell, 1-2h!
Jetzt müsste ich noch LND installieren und dann irgendwie versuchen, ob ich mit diesen API Calls etwas erreichen kann.

Eines der grössten Probleme sehe ich darin, dass Du ja am Ende dasselbe bei Dir auch machen musst. Deine ‚echten‘ 23 Wörter musst Du ja unbedingt für Dich behalten…

…was meinst Du damit genau? Du bräuchtest eben mMn auch noch die ganzen BTC Installationen.

Vielleicht kannst Du mir noch ein einfacheres Beispiel machen, mit allen 24 Wörtern? Und z.B. der dritten abgeleiteten Adresse als „Lösung“ zum testen.

Als nächstes müsste man dann (wie oben schon erwähnt) etwa hier schauen:

Ob es etwa solche Kommandos gibt, wie wir es brauchen, also

  1. Aus 24 Wörtern den azeed erstellen
  2. aus dem azeed Adressen ableiten
1 „Gefällt mir“

Das Problem wurde von einem Forenmitglied gelöst! Das fehlende Wort wurde erfolgreich in wenigen Sekunden gefunden. In meinem Fall war das selbe Wort direkt zweimal hintereinander im Seed und ich werde das zweite beim Abschreiben übersprungen haben…

Das Skript wird (demnächst) Open-Source gestellt.

Der Autor des Skripts möchte jedoch keine direkte Verbindung zwischen seinem Github Account und dem Pseudonym hier im Forum herstellen, weswegen ich keine weiteren Details nennen werde. Wer Hilfe braucht, soll sich hier melden, aber ich werde den Link zum Projekt dann irgendwann auch hier posten.

Danke für Eure Hilfe!

Für Interessierte: Im Seed ist eine Prüfsumme codiert. Das erleichtert die Rekonstruktion, da man nicht (wie bei einem gewöhnlichen BIP-39 Seed) alle Adressen durchsuchen muss. Wenn man einen gültigen Seed trifft, dann ist das auch der Richtige.

8 „Gefällt mir“

Freut mich für Dich! Also ich bin sehr interessiert an der Lösung!
Habe vorgestern und gestern auch noch einiges versucht. Hier die Kurzzusammenfassung für Interessierte:
Lokal bincoind und lnd laufen lassen und damit per REST darauf zugreifen (über Python) hat tatsächlich funktioniert. Aber damit kann man dann einfach ein wallet auf einmal erstellen (aus einem mnemonic seed), muss dieses zunächst noch per REST Befehl öffnen und kann dann Adressen ableiten. Für 2048*24 Iterationen wäre das ziemlich umständlich.

Auch das Script habe ich zum laufen gebracht, dass @mapleloopsong von ChatGPT hat erstellen lassen. Wie erwartet funktioniert das aber nicht.
Zum Beispiel erzeugt es Legacy Adressen, beginnend mit 1…
Gesucht war aber eine bc1… Adresse. Dazu müsste man mindestens dan korrekten Adresstyp setzen, mMn etwa so:

Generierung der Bitcoin-Adresse aus dem HD-Schlüssel

    address = hd_key.address(encoding='bech32')

Aber eben, das erzeugt Adressen nach BIP039, nicht aezeed.

Freut mich auch für dich.
Danke dem unbekannten.

Die Lösung verstehe ich nicht so ganz.
Auch wenn du die Checksumme hast musst du doch zur Überprüfung derselben jedesmal den SHA256 Hash ermitteln. Und das maximal 24x2048 mal.
Ohne das kann es doch nicht funktioniert haben oder?

Respekt das dies jemand in ein paar wenigen Sekunden hin bekommt.
Ich schreibe gerade bei Scratch ein BIP39 Projekt. Da könnte ich so etwas auch ausführen. Allerdings braucht mein kleiner Raspberry pi 4 mit Hilfe von Scratch 3 Sekunden für einen SHA256 Hash. Ein Scratch BIP39 Benchmark Test ist bei den Entwicklung für mein BIP39 Projekt abgefallen zwischendurch.

Ich kann es dir leider nicht beantworten, aber das Skript wird irgendwann Open-Source zur Verfügung gestellt. Es gibt sicher verschiedene Wege.

Für mein fehlendes Wort gab es auf jeden Fall nur eine einzige mögliche Lösung und es musste keine Walletadresse bekannt sein.

1 „Gefällt mir“