Eth Cracking

Am frühen Montagmorgen (12. Juni 2017) sah ich auf reddit einen Beitrag mit dem Titel “Wie erstelle ich eine große Passwortliste für einen Brute-Force-Angriff für meine Ethereum-Brieftasche?”. Süß.

Bearbeiten: Da es so aussieht, als hätte der Typ den Textinhalt des Beitrags gelöscht (ein ziemlich kluger Schachzug …), fasse ich zusammen: “Hey! Ich habe mich aus meiner Ethereum-Brieftasche ausgesperrt. Ich weiß, dass das Passwort so etwas wie abcdefg1234567 ist – jemand hilft mir! “

Lange Rede, kurzer Sinn, es war eine seltene e Gelegenheit, meine „Programmierer-Whiteboard-Interviewfähigkeiten“ zum Einsatz zu bringen. Spoiler – alles hat super geklappt! Hier ist ein kurzer Überblick darüber, was ich getan habe und warum ich es interessant finde.
(Wenn Sie dies gerade in einer verzweifelten Suche nach einer Möglichkeit lesen, Ihre eigene Ethereum-Brieftasche zu knacken, lesen Sie weiter Einige kostenlose Tools, die ich erstellt habe und die Ihnen möglicherweise helfen können. Wenn dies nicht funktioniert, schreiben Sie mir eine E-Mail an phildo211 mit dem E-Mail-Dienst von Google.)

In Ordnung. Schritt eins bestand also darin, eine Textdatei zu generieren, die alle ähnlichen Passwörter wie abcdefg1234567 enthält (& lt; – nicht das tatsächliche Passwort). Dies war der einfache Teil. Es gibt ein Konzept namens Levenshtein Distance, das die “Nähe” zweier Zeichenfolgen durch die Anzahl der “Schritte” definiert, die erforderlich sind, um von einem Wort zum anderen zu gelangen (ein “Schritt” ist entweder eine Zeichenlöschung, eine Zeichensubstitution oder eine Zeicheneinfügung). .

Dies ist ein Beispiel für eine Art Problem, über das Sie viel zu viel nachdenken können, zum Nachteil der tatsächlichen Lösung des Problems. Es ist buchstäblich ein Paar, das für Schleifen verschachtelt ist: Iterieren Sie über alle Zeichen der Basiszeichenfolge, bei jedem Zeichen durchlaufen Sie alle möglichen Operationen. printf jedes Mal. Fertig.

Der Typ in der Post (Mr. Reddit) hatte Probleme damit, es mit verschiedenen Javascript- und Python-Bibliotheken zum Laufen zu bringen. Ich habe ein Einzelstück in c gehackt (Der einfache, unkomplizierte Ansatz!). Wenn Sie es für Ihre eigenen Bemühungen ändern möchten, finden Sie es hier. (Beachten Sie, dass wenn ich “zusammen gehackt” sage, dies keine Kommentare, keine Dokumentation, Verwendung auf eigenes Risiko usw. bedeutet.)

Abgesehen von der Implementierung hat die Levenshtein-Entfernung eine vorhersehbare Eigenschaft: Je größer die Entfernung, desto größer der Möglichkeitsraum.

Quick Math Break: Wenn n = Anzahl der Zeichen im Basiskennwort, m = Anzahl der Zeichen in der Liste der plausiblen Substitutionen / Einfügungen, dann mögliche Löschungen = n, mögliche Substitutionen = n * m und mögliche Einfügungen = (n + 1) * m. Jeder zusätzliche Levenshtein-Schritt multipliziert den Raum mit (n + (n * m) + ((n + 1) * m)) = wirklich groß. Redundanzen werden nicht berücksichtigt, da dies den Möglichkeitsbereich vernachlässigbar berücksichtigt (da denken Sie wieder zu sehr über das Problem nach!).

Alles, was Sie darüber wissen müssen, ist, dass Sie nur eine Levenshtein-Entfernung von 1, vielleicht 2 vom tatsächlichen Passwort haben. Oder holen Sie sich viele wirklich schnelle Computer.

Großartig. Das nächste Problem ist also, einen Weg zu finden, um dieses Ding zu knacken. Es gibt einige Ansätze, die man wählen könnte:

Woof. In Ordnung. Jetzt haben wir unseren einmaligen Passwortgenerator und unseren einmaligen Brieftaschenprüfer. Es ist Zeit, das Basis-Passwort und die Brieftaschendetails einzugeben und es rippen zu lassen!

In den folgenden 9 Stunden, die für die Ausführung des Programms erforderlich sind, werde ich eine Pause einlegen, um über ein interessantes Detail in der zugrunde liegenden Kryptografie zu sprechen.

Die Brieftasche ist so spezifiziert, dass sie ein kdf (Schlüsselableitungsfunktion) ihrer Wahl verwendet. Eine übliche Option ist jedoch die Verwendung von “scrypt”. Scrypt ist ein Algorithmus, dessen Ausführung von Natur aus einige Zeit in Anspruch nimmt. Diese Zeit ist für ein bestimmtes “n” – oder “Iterationen durch einen Teil des Algorithmus” variabel. Der Grund, warum die Ausführung lange dauern soll, ist, dass es schwierig ist, genau das zu tun, was wir versuchen: Brute Force.

N kann alles sein, was der Brieftaschengenerator will. Sie können n so einstellen, dass es 5 Minuten dauert, um eine mögliche Kennwortkombination auszuprobieren. Das Problem bei dieser Entscheidung ist zweierlei: 1. Sie müssen jedes Mal 5 Minuten warten, wenn Sie Ihr Passwort legitim verwenden, und 2. wenn Sie sich jemals in einer Situation befinden, in der Sie Ihr eigenes Passwort brutal erzwingen müssen, müssen Sie d machen es unmöglich. Aber hey, auch keine bösen Jungs kommen rein!

Hier wird die Auswahl eines „n“ interessant. Wir haben darüber gesprochen, wie groß der mögliche Raum selbst einer kleinen Levenshtein-Distanz wird. Nun, dieser Raum ist unsinnig riesig, wenn er auf den möglichen Raum eines „möglichen Passworts“ fallen gelassen wird (m ^ n. Eine viel einfachere Gleichung, aber unterschätzen Sie nicht die Kraft des exponentiellen Wachstums. Lol.). Wenn also ein „n“, das bei jedem Versuch eine Verzögerung von 1 Sekunde verursacht, nicht ausreicht, um jemanden zu stoppen, der eine Vorstellung davon hat, wie wahrscheinlich Ihr Passwort ist, ist es mehr als genug, um jemanden zu stoppen, der versucht, es brutal von Grund auf neu zu erzwingen / em>

Wir hatten das Glück, dass Mr. Reddit einen niedrigen n hatte – es dauerte ungefähr 0,2 Sekunden bei jedem Versuch (mehr als genug, um einen Brute-Forcer von Grund auf zu stoppen). Ich wurde seitdem von jemandem mit dem gleichen Problem kontaktiert, der ein viel höheres n hat. ~ 2s pro Versuch. Autsch macht das das schwieriger. Zum Zeitpunkt dieses Schreibens: Das Programm läuft seit ca. 30 Stunden und ist noch lange nicht fertig…

Es ist dieser Punkt, der mich dazu bringt, jedes Mal, wenn ich Kryptoparameter einstelle, mein n auf das Maximum zu bringen. Aber wer weiß, vielleicht ist das eine schreckliche Idee. (Befolgen Sie nicht die Ratschläge von Internet Rando zur Kryptografie ¯ \ _ (ツ) _ / ¯)

Zum Abschluss wurde das Programm schließlich gestoppt und forderte das verlorene Passwort an. Ich gab Mr. Reddit sein Passwort, er belohnte mich mit etwas Ethereum aus dieser Brieftasche, und wir gingen alle unsere eigenen Wege, die Welt nur ein bisschen heller.

Wenn Sie eigene Passwörter generieren müssen, können Sie hier beginnen:
https://github.com/Phildo/brutedist

Wenn Sie eine Liste mit Passwörtern haben und diese mit Ihrer Brieftasche vergleichen möchten, können Sie dies hier versuchen:
https://github.com/Phildo/ethbrute
(Ja, das bin ich Ich bin mir bewusst, dass ich Brieftaschendetails für dieses Repository festgeschrieben habe. Das Passwort lautet “thisisatestwallet”

Lassen Sie mich wissen, wenn Sie Hilfe mit Ihrem eigenen Passwort benötigen:
phildo211 beim Google Mail-Dienst.

Gib mir eth, weil du eine nette Person bist:

Danke fürs Lesen!

Update (15.01.18): Ich habe seitdem mit vielen Menschen zusammengearbeitet, um unterschiedliche Erfolge / Misserfolge bei der Wiederherstellung ihrer Passwörter zu erzielen. Ich habe auch meine Methoden verfeinert (einschließlich der Möglichkeit, mit Vorverkaufsbrieftaschen zu arbeiten!) Und habe ein wirklich schönes Cracking-Rig! Lassen Sie mich wissen, ob Sie an meiner Hilfe interessiert sind. 🙂

Hier ist mein PGP-Schlüssel, wenn Sie dazu neigen (entschuldigen Sie, dass das Medium keine Schrift mit fester Breite wiedergibt):

– – -BEGIN PGP PUBLIC KEY BLOCK – – –

mQINBFpc5eIBEADzTpoygPS2u9GDVTMUIarxQxSTode3v1mA93toi8Bu93JP5H0Q
hmE3z4 + awRvMDaujw0hcYghoqLerc + 7is0m7HmanwELTNkG8apkQqj / dOnvEsBAB
0zvEEIQWU0Lqz36QTzghXHSl0n7y0Y8XCVzwMy4jMpucsNNazo5 / rn7jati + UkUw
dnlUiyT / v00bFC + wUcrb7HQKS4 + LOhBTeqz9Te966mNcaJiWOBl1sHG6JUngMdlP
AwQjWH67UTyCsLpsZaTN3V / OUr4 + 7WM7PxctltpGaFKH5xMSIkt / vTLQBgHhUbW0
8kd2ltmIXeflC / GSiujSXE / GTnhf6DSg3T / Cc78 + BMiaFHMfhKBgVf5XpJlkQ9jZ
zKPCbjCkrc27n / AoC3SqmS2cIwIrHTUYXrxG + YLhBNiD3zW / kcuawGpE0 / Hyc4BU
ieYNlUZt3z7PJ8fb + uATx294dSN7v0e / 7ldbAioLiMylBmszaljKHnlHCd67NB3F
UuxG / dSN0pgzB07GS0cOGY1fx7caHPR1R / 3Em0avQvErKveZBa47GSqezAzH9hsl
QXf2IP5m34ht / exId79UNt2VVvnUG77Nqqxrz / Y1bxHTtSJr0jPUWzpHZQOa9c8c
0Nn9q + K9OxDzcc1D4fLi + LsytrsbtQK9TuN6pUrc3aQM1 + Kz7pCPawuLMQARAQAB
tBxwaGlsZG8gPHBoaWxkbzIxMUBnbWFpbC5jb20 + iQJUBBMBCAA + FiEECFuTDGym
petb5HZoXrfOUzYftvQFAlpc5eICGwMFCQeGH4AFCwkIBwIGFQgJCgsCBBYCAwEC
HgECF4AACgkQXrfOUzYftvQl7RAAlE46htjkxinryoX0RBZIC / npn2oB + mMR7iBn
KmPuGFD7db24rkAsmw1mxIJSanV8 // A8F4D / 1plSIwkFx du4babBh24KKofTgG76
dNMKY9e0dZlfOVb3P1hJqI5wKhounxTQHFTZ59EcR8ogFS + fuI6QCYmphfk5weAQ
/ QNM1RtbTq / dhY7diF7mR4KW6N + iPHAsLitINB8yYkU5fcLMMjYh7B + 3ddMcT73C
wqD37EX9vHC90HA / jvhzysIofKp7qIRByUHimQbFniThn2fSIzZk2GsX2brASPo5
r9LpeywQV8wyr4 / ssTAjkGik46lvH8jHL2FPO7Ft16mNPEvD8WeT00KhYYvT / O6r
+ DrmCDDqZW + bdinQ0BzLYaE3S0T8nKKzbaX74NOthCKQUVcuQXg28tMN / ALBg3Qu
zYOThBqvIMXyvb7ktzeAOXwfurtzY3BpPpve6sPsULfCe2IhmRguTTeH9hpYQ6Bn
Vs8o3Ku8 + DZvimpwszUKBhBJhVpBpKcR99yFt5aAFtFp / k2QKLWoFyDuv5rSn6fL
ZKqSLG / Ln1P3vk10UEMzFWEaPRgcLW0JXxOOwqi09ydifytw3jXHg8 / 7h80pUrPz
tpLi6bLAqjrjTb + uVrKalOtGVvlkreXc28UVuxxfQB4beqFWsXjLBBXmPgo3Acfi
ZBDg3l + 5Ag0EWlzl4gEQAL1BKguj30yN8kNiwellaFIQoKHxTeH8P7rwkIlxM2A3
Tzc5kX385JA3cEXeZepXqYP5kpcPaL38CCrLl7VIribFvplNf3CKD0hb0j / pjE7w
Mu7A5JM8w9TzQ134QVMosgCXRCHzgTUzxJhL4VrgjIM02RErDDe1PswyQpdHKwf /
LCEtpFpKrDEi8gjqY1mYBj3OW4TtV + lYnm2jXTXVCVLfEWC9z1rRMbnuSzWM0tMs
uTlWEPKzNjm3LzbUQLo4t3cTZ960X1xgBiXucxqrmaY6XsUJg + 4L0kI7HjK6sl62
o71JJ5Sj27tAvaVMiFPq1KPA9 M0x8kFKLlGs74 + 9lsoGF6OHddnRYkJwXj4a40mI
u / RVbDnX8vnc7DSEF / qSLtpai + GTpnh1U4 + HY16 ++ jertHj0W65RQXnkymb9THbn
tfCLWWTsZvyJA7QxIGpqfLrGLEnICuOabVf6HVP9x6V / Ef5i + QPcMWqESxhJaMMH
u1ItLvnWyORbuPqTWB2zBhGSoes3J5Uq208yjJtbkH2U7IhWVtko6PhjABqrAcld
lB4RssdJyZHdsepGPNIN7nkxLNlM6Hl58u7nnxJdPz5A3TeOQxLVi3DkMwDtl / 2I
OXqA5CCR / XrFUXH5TaD / K36dWjt3IAwk3O / 49qEotem7QvoqQh7DthYuCZ + d3Vwz
ABEBAAGJAjwEGAEIACYWIQQIW5MMbKal61vkdmhet85TNh + 29AUCWlzl4gIbDAUJ
B4YfgAAKCRBet85TNh + 29M0zD / oC9dIyDsO2laAokP94TcX + PricUYf3Cb0E / glk
0Lo1bM9THdV + XJcdbYaqsI / bb7AOreNTIboKW4cVldXoGlbMaKInRBwsK6Fm7P0n
AuJJAN + wxvDeOEm + zNzFKsklwYZLJXLRhXnx5UocsoXtLS25gXKkgwBqr5PODMUo
R7MO1rNweXkfxpK / qOTu1 + PkR5P1vU95F2Rp5D9EVCEEcLtB + DZvZ5qE3RHJTSpW
5z5Ko4JPlDtmxWXbgj0VdaSJfDLFlHofCs3UUnmcNQzUZ9L5jm1 / 2lQAIDzmWpp7
iQgKJTXTcYeaJWRkrGC11LlOCLpMg3akSe1Q712wNBtI22 + e1TNQrUtDSQy2WPwU
xwowwA4rcgYo51Lek0y8XKhwvJs9oLUwkK1HcqT7MNUMw3DwZlZMMtxD7CNgkryG
yWKWHn5dHIhD89CDRYsUfknzdA3rGur9hFr5FB7Rj6EQOSDU3l7zCoNFnIO3F0EY
Xek63 hlWdB5sBSYL7d4psCdPvZoShiBBVc2RleQbjckMhTwX / V / N9 + IP3vsjKWxO
7o + p5iWqPQlAvCT3pV44EdTZ3WKN45KcS7TydpyZGjwZfpn + pNgklVEapPEKYo9M
dnlW8kOAkMmWifPi8lRAhvEivm2iYF + / P / f + hS8ts7 / 6uLgvq1nx466JQM3vriv2
76W5VA ==
= GVjJ
– – -END PGP PUBLIC KEY BLOCK – – –