Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bruteforce Dauer verkleinern (https://www.delphipraxis.net/191713-bruteforce-dauer-verkleinern.html)

derseitzer 13. Feb 2017 14:55

Bruteforce Dauer verkleinern
 
Passwordlänge Gross- / Kleinbuchstaben (26)
5 Zeichen 20 Min.
6 Zeichen 9 Std.
7 Zeichen 10 Tage
8 Zeichen 9 Mon.

Hey Leute :wink: ;
Ich habe letztens diese Tabelle hier oben gesehen und mich hat interessiert, ob es wirklich so einfach ist, einen Bruteforce zu schreiben:).
Also habe ich als blutiger Bruteforce-Anfänger einfach ein Memo hingeklatscht und angefangen (alle 26 Buchstaben stehen im array 'AllChars[]':
Code:
var
  starttime: cardinal;
  i: Integer;
  j: Integer;
  k: integer;
begin
starttime:= gettickcount;
  for i := 1 to 26 do
  begin
     for j := 1 to 26 do
     begin
       for k := 1 to 26 do
       begin
       Memo1.Lines.Add(AllChars[i] + AllChars[j]+AllChars[k]);

       end;
      end;
   end;
   showmessage('Zeit: ' + IntToStr(GetTickCount - startTime) + ' ms');
end;
Für 3 Zeichen (bis zzz), habe ich fast 21Sekunden gebraucht. Hochgerechnet auf 5 Zeichen wären das 21*26*26Sekunden also 4 Tage.
Laut der Tabelle braucht ein guter Bruteforce 20min..
Was unterscheidet einen guten Brutefoce von meinem? Wie kann ich das Programm beschleunigen? Das würde mich wirklich interessieren, denn ich habe keine Idee,
außer vielleicht statt nur 'a' ins array zu schreiben dann auch 'aa' 'ab' etc..

Bin gespannt wie man das hinbekommen kann :)

sakura 13. Feb 2017 14:58

AW: Bruteforce Dauer verkleinern
 
Zwei grundsätzliche Fehler
1. Du schreibst in ein Memo - die Darstellung am Bildschirm dauert relativ lange
2. Die Passwörter werden gar nicht irgendwo getestet.

Zum Thema Geschwindigkeit: Parallele Verarbeitung macht Sinn (Threads)

...:cat:...

HolgerX 13. Feb 2017 15:14

AW: Bruteforce Dauer verkleinern
 
Hmm..

Viele Bruteforce-Systeme arbeiten mit Passwort-Listen, in denen gebräuchliche Passwörter aufgelistet werden.

Diese werden meist als erstes abgearbeitet, sogar oft mit erfolg.

Ein Bruteforce mit einzelnen Buchstaben ist da schon langwierig, wenn das Passwort aus mehren 'Z' besteht und somit als letztes drankommt.

Hinzu kommt, dass Systeme mit Passworteingabe die Dauer bis zur nächsten Eingabe 'verlängern' u.A. indem der Hasch mehrfach erzeugt wird.

Somit kann es bei langen Passwörtern mit gutem Hasch-Verfahren schon seehhhrr lange dauern bis BruteForce ans Ziel kommt. ;)

Pixel 13. Feb 2017 15:21

AW: Bruteforce Dauer verkleinern
 
Einfach so einen guten Bruteforce zu schreiben ist nicht.

Ich kenne mich nicht im Detail aus, aber kann dir paar Sachen sagen:

1) Bruteforce dauer kannst du nicht pauschalisieren, denn wie lange es dauert hängt von der Hardware ab.
2) Du kannst mit der CPU bruteforcen (die ja heutzutage oft 8 Kerne hat) oder du kannst mit der Grafikkarte bruteforcen (GTX 1080 hat z.b. 2560 Kerne).

Hier fängt es an: Die Anzahl der Kerne ist natürlich von großer Bedeutung, du kannst pro Kern schließlich 1 Versuch jeweils parallel laufen lassen.

Klar, es gibt auch Multithreading, aber da ist eben zu unterscheiden, dass nur ganz schnell zwischen den Versuchen "hin und her geswitched" wird und nicht wirklich parallel gearbeitet wird (auf 1 Kern).

Ich erkenne an deinem Code dass du noch viel weniger Plan hast als ich, also hier ein paar Tipps:

1) Achte imemr darauf, dass du Variablen per Referenz übergibst und nicht als Kopie.

Wenn du also eine Funktion hast:

Delphi-Quellcode:
function TestPassword(APlain : string) : boolean;
begin
  Result := False;
  if MD5(APlain) = pass then
    Result := True;
end;

und du diese Funktion so aufrufen würdest:

for i := 0 to 100000000 do
begin
  if TestPassword(arr[i]) then
  begin
    showmessage('found');
  end;
end;
dann würde hier jedes Element aus arr bei der Übergabe an TestPassword kopiert werden, was auch ziemlich ineffizient ist. Also Call-by-Reference angucken.


2) Auf keinen Fall sowas machen wie jedes Passwort in ein Memo schreiben, das dauert ewig.

3) Multithreading, dazu kann man die Klasse TThread verwenden.


Abschließend lässt sich nur sagen dass es zwar schön zu sehen ist dass du dich für was interessiert und es auch versucht hast, aber dir mangelt es sehr wahrscheinlich an Wissen um sowas wirklich gut umsetzen zu können.

Edit:// Und wie schon gesagt wurde, bruteforced dein Code gar nichts, sondern gibt nur strings auf einem Memo aus.

Um das zu beschleunigen gibts übrigens Memo1.Beginupdate und Memo1.Endupdate.

derseitzer 13. Feb 2017 15:27

AW: Bruteforce Dauer verkleinern
 
Sehr interessant, danke!:)

stahli 13. Feb 2017 15:29

AW: Bruteforce Dauer verkleinern
 
Ich verstehe Deine Zielstellung nicht.

Willst Du ein Programm mit Passwortzugang schützen oder willst Du ein Programm/Website knacken?

Für letzteres wirst Du hier keine Unterstützung finden.

Um die Dauer abzuschätzen müsste man wissen, wie der jeweilige Passwortschutz aufgebaut ist. Wenn z.B. nur die Zahlen 1 bis 9 als Passwort möglich wären kannst Du 9 Versuche realisieren.
Bei Passwörtern als Text mit einer Mindestlänge von 5 Zeichen hast Du m.E. gar nicht die Möglichkeit alle Varianten durchzutesten.

Außerdem wird der Schutz versuchen, solche Massentests zu erkennen und diese abzubrechen.

X Varianten in ein Memo zu schreiben sagt erst mal noch gar nichts aus.

bra 13. Feb 2017 15:56

AW: Bruteforce Dauer verkleinern
 
Und dann ist auch noch die Frage ob ein Delphi-Programm von der Performance her mit einem hochoptimiertem C- oder sogar Assemblerprogramm mithalten kann, das speziell für diese Aufgabe geschrieben wurde. (Das soll jetzt keine Kritik an Delphi sein!)

Pixel 13. Feb 2017 16:38

AW: Bruteforce Dauer verkleinern
 
Zitat:

Zitat von bra (Beitrag 1361447)
Und dann ist auch noch die Frage ob ein Delphi-Programm von der Performance her mit einem hochoptimiertem C- oder sogar Assemblerprogramm mithalten kann, das speziell für diese Aufgabe geschrieben wurde. (Das soll jetzt keine Kritik an Delphi sein!)

Der Vergleich ist komisch.

Kommt auf den Compiler an un da lässt sich nur sagen dass der von Delphi ziemlich optimierten Code generiert

himitsu 13. Feb 2017 17:41

AW: Bruteforce Dauer verkleinern
 
Zitat:

Zitat von HolgerX (Beitrag 1361440)
Viele Bruteforce-Systeme arbeiten mit Passwort-Listen, in denen gebräuchliche Passwörter aufgelistet werden.

Das wäre dann aber ein Wörterbuchangriff und nachfolgend vielleicht noch Brute-Force.

Brute-Force (rohe Gewalt) bassiert grundsätzlich ja auf dem Ausprobieren aller möglichen Variationen.



Grundsätzlich kann man Brute-Force und auch die anderen Methoden ala Wörterbuchsuchen, durch paar Maßnahmen beschleunigen:
* die "Rechendauer" pro Passwort verkleinern (meißt durch besseren/passenderen Code, bzw. andere Rechenmethoden und optimalere Speicherzugriffe)
** hier vorallem StringListen statt Memos oder garnicht erst zwischenspeichern, sondern direkt ausprobieren
* mehrere Versuche gleichzeitig (Multi-Threading oder gar Parallel-Computing)
* und natürlich Vorberechnungen (z.B. die Rainbowtables bei MD5-Hash-Passwortsuchen)

derseitzer 14. Feb 2017 08:50

AW: Bruteforce Dauer verkleinern
 
Wäre C-Code dann schon von Anfang an besser, weil man mir auch immer gesagt hat, dass die Sprache C (C++..) darauf beruht, viel Rechenleistung und mehr Performance zu haben..

JasonDX 14. Feb 2017 09:15

AW: Bruteforce Dauer verkleinern
 
Das Zeitaufwändige ist meist nicht das generieren der Permutationen, sondern die eigentliche Prüfung (im Zusammenhang mit der Anzahl der Prüfungen). Die wird unabhängig deiner verwendeten Sprache den Flaschenhals darstellen.
Die "Performance" der Sprache ist hier nur bedingt relevant. Die Sprache würde ich primär daran orientieren, wie wohl du dich damit fühlst, und wie schwierig die Prüfung (bspw. des Passworts) in der Sprache ist.

Sherlock 14. Feb 2017 10:34

AW: Bruteforce Dauer verkleinern
 
Semi OT: XKCD zum Thema Passwortsicherheit:
https://xkcd.com/936/

Das führt dann soweit, daß es sogar ein Python Package gibt, daß darauf basiert. :D

Sherlock

p80286 14. Feb 2017 12:58

AW: Bruteforce Dauer verkleinern
 
Zitat:

Zitat von derseitzer (Beitrag 1361496)
Wäre C-Code dann schon von Anfang an besser, weil man mir auch immer gesagt hat, dass die Sprache C (C++..) darauf beruht, viel Rechenleistung und mehr Performance zu haben..

Guter Einwand, Du suchst ein effizentes Automobil? Da geht kein Weg an einem (gebrauchten) F1-Fahrzeug vorbei. Soviel Leistung aus so wenig Motor, bekommst Du sonst nirgendwo.
Daß solche Fahrzeuge nicht von jedem Führerscheininhaber gefahren werden können, steht auf einem anderen Blatt.

Gruß
K-H

Zacherl 14. Feb 2017 13:16

AW: Bruteforce Dauer verkleinern
 
Zitat:

Zitat von Pixel (Beitrag 1361456)
Kommt auf den Compiler an un da lässt sich nur sagen dass der von Delphi ziemlich optimierten Code generiert

Das soll hoffentlich ein Witz sein :mrgreen: Der Delphi-Compiler optimiert so ziemlich gar nichts.

Zitat:

Zitat von JasonDX (Beitrag 1361499)
Das Zeitaufwändige ist meist nicht das generieren der Permutationen, sondern die eigentliche Prüfung (im Zusammenhang mit der Anzahl der Prüfungen). Die wird unabhängig deiner verwendeten Sprache den Flaschenhals darstellen.
Die "Performance" der Sprache ist hier nur bedingt relevant.

Heutzutage ist das häufigste Szenario doch eigentlich, dass man einen Password-Hash gegeben hat, den man in Plaintext zurück-"rechnen" will. Hast du einen Hash lokal vorliegen und möchtest Diesen mit generierten Permutationen vergleichen, dann kann dieser Prozess hochgradig parallelisiert und optimiert werden (siehe z.b. das Tool Hashcat, welches - je nach Algorithmus und Hardware - mehrere Millionen Hashes pro Sekunde auf der Grafikkarte berechnen kann). Da kann jedes Quäntchen Performance am Ende einen großen Unterschied machen. Die Prüfung auf Gleichheit ist da denke ich eher zu vernachlässigen (selbiges gillt natürlich auch für einen direkten Vergleich von Plaintext). Du beziehst dich eher auf Situationen, bei denen der Abgleich übers Netzwerk erfolgt, nehme ich an?

Zitat:

Zitat von derseitzer (Beitrag 1361496)
Wäre C-Code dann schon von Anfang an besser, weil man mir auch immer gesagt hat, dass die Sprache C (C++..) darauf beruht, viel Rechenleistung und mehr Performance zu haben..

Meiner Erfahrung nach sind die C/C++ Compiler tatsächlich sehr überlegen, was Optimierung und Performance angeht, allerdings ist das immer stark Situationsabhängig und grade C++ ist eine schwer zu meisternde Sprache, bei der man als Anfänger unter Garantie erstmal einiges "verschlimmbessern" würde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz