[PHP] MD5 bruten

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Hapablap, 10. Juli 2008 .

Schlagworte:
  1. 10. Juli 2008
    MD5 bruten

    Hi,

    Hatte grad ein bisschen lange Weile und war durch versch. Dinge inspiriert, ein Script zu schreiben, das md5 entschlüsselt. Wahrscheinlich gibt es schon bessere, bin auch nicht so der Pro in PHP, aber zumindest habe ich es versucht
    Leider habe ich ein RIESEN Problem: Passwörter können doppelt vorkommen, weil sie zufällig generiert werden. Vielleicht hat ja jemand ne Idee! Wäre nicht schlecht, dann kanns ja einer posten. Würd mich freuen, wenn nicht, ists auch nicht so schlimm. Ich habs mehr aus Spaß an der Freude geschrieben.

    Bisher habe ich dreistellige Passwörter, die aus kleinen Buchstaben und Zahlen bestehen, sehr gut knacken können.

    Ich poste das Script jedoch hier, weil ich befürchte, dass es einen Server ein bisschen belastet? Ich weiß nicht ... ich führ es auf meinem eigenen server aufm Laptop aus.

    Vorher noch kurz die Parameter:

    encrypted_password = MD5 verschlüsseltes Passwort
    set_length = (vermutete haha xD) Länge des Passwortes
    set_level = Bei Level 1 -> kleine Buchstaben, Level 2 -> zusätzlich Zahlen, Level 3 -> zusätzlich große Buchstaben, Level 4 -> zusätzlich Umlaute, Level 5 -> zusätzlich einige Sonderzeichen.

    Bsp. um "a3z" zu knacken:

    md5(a3z) = 798e6c4d1af9c8ebe67f63c1cfab3ded

    md5brute.php?encrypted_password=798e6c4d1af9c8ebe67f63c1cfab3ded&set_length=3&set_level=2

    md5brute.php
    PHP:
    <? php
    ##########################
    # MD5 brute force attack #
    #     by Hapablap        #
    ##########################

    ### METHOD 1 - RANDOM ####

    function  generate_password ( $length , $level )
    {
       
    $zeichen_01  "qwertzuiopasdfghjklyxcvbnm" ;
       
    $zeichen_02  "1234567890" ;
       
    $zeichen_03  "QWERTZUIOPASDFGHJKLYXCVBNM" ;
       
    $zeichen_04  "üöäÜÖÄ" ;
       
    $zeichen_05  "!'§$%&/()=?" ;

       if(
    $level  ==  "1" )
       {
          
    $zeichen  $zeichen_01 ;
       }
       elseif(
    $level  ==  "2" )
       {
          
    $zeichen  $zeichen_01  $zeichen_02 ;
       }
       elseif(
    $level  ==  "3" )
       {
          
    $zeichen  $zeichen_01  $zeichen_02  $zeichen_03 ;
       }
       elseif(
    $level  ==  "4" )
       {
          
    $zeichen  $zeichen_01  $zeichen_02  $zeichen_03  $zeichen_04 ;
       }
       elseif(
    $level  ==  "5" )
       {
          
    $zeichen  $zeichen_01  $zeichen_02  $zeichen_03  $zeichen_04  $zeichen_05 ;
       }
       else
       {
          echo 
    "Invalid Level" ;
          break;
       }

       
    srand ((double) microtime ()* 1000000 );

       for(
    $i  0 $i  $length $i ++)
       {
          
    $password  .=  substr ( $zeichen ,( rand ()%( strlen  ( $zeichen ))),  1 );
       }
       
       return 
    $password ;
    }


    if(
    $encrypted_password  ==  "" )
    {
       
    $encrypted_password  $_POST [ 'encrypted_password' ];
    }

    $decrypted_password  "abc123" ;
    $counter  "1" ;

    while(
    $decrypted_password  !=  $encrypted_password )
    {
       echo 
    "Versuch "  $counter  ": "  $generated_password  "<br>" ;
       
       
    $counter ++;
       
       
    $generated_password  generate_password ( $set_length $set_level );
       
    $decrypted_password  md5 ( $generated_password );
       if(
    $decrypted_password  ==  $encrypted_password )
       {
          echo 
    "Password is: "  $generated_password ;
          break;
       }
    }
    ?>
    Hier noch ein kleines Script, um md5 Passwörter zu generieren (zum testen):
    PHP:
    <? php
       $word 
    $_POST [ 'word' ];
    ?>
    <html>
    <head>
    <title>Generate MD5 Password</title>
    </head>
    <body>
    <font size="+2"><b>Generate MD5 Password</b></font><br><br>
    <center>
    <form action="<?php  echo  $_SERVER [ 'PHP_SELF' ];  ?>" method="post">
    <table border="0" width="75$">
       <tr>
          <td>Word to encrypt:</td>
          <td><input type="text" name="word" value="<?  echo  $word ?>"></td>
       </tr>
       <tr>
          <td colspan="2"><input type="submit" value="encrypt"></td>
       </tr>
       <?php
          
    if( $word  !=  "" )
          {
             
    $word_md5  md5 ( $word );
       
    ?>
       <tr>
          <td>MD5:</td>
          <td><?  echo  $word_md5 ?></td>
       </tr>
       <?
          
    }
       
    ?>
    </table>
    </form>
    </center>
    </body>
    </html>
    Also, wenn ich es nur ein wenig effektiver bekomme, kann ich schon 0815 User Passwörter knacken ^^ Aber ich denke, man sollte schon 4 bis 6 Zeichen knacken können, um dran zu kommen!

    Viel Spaß und wer will, kann weiter helfen.
     
  2. 10. Juli 2008
    AW: MD5 bruten

    also ich hätte einen vorschlag für dich für die generierung von neuen phrasen:

    PHP:
    // Minimale stringlänge
    $min_len  1 ;

    // Maximale stringlänge
    $max_len  4 ;

    // Charset, dass durchprobiert werden soll
    $charset  'abcdefghijklmnopqrstuvqxyz' ;


    for (
    $i = $mi_len - 1 $i < $max_len - 1 $i ++) {
       for (
    $j = 0 $j < strlen ( $charset )- 1 $j ++) {
          
    $string [ $i ] =  $charset [ $j ];

          
    // Hier kannst du dann mit dem String machen was du willst
          
    echo  $string . '<br />' ;
       }
    }
    Ist ungetestet aber das Prinzip sollte klar werden

    greez myth
     
  3. 10. Juli 2008
    AW: MD5 bruten

    was mir auffällt: dein code funktioniert nur, wenn php mit register_globals = on läuft.
    set_length und set_level werden bei register_globals = off nicht übernommen, der beispielaufruf wird auch nicht so funktionieren: in der form sind das keine post-variablen die du übergibst sondern get-variablen und müssen demenstprechend mit $_GET['variablenname'] bzw $_REQUEST['variablenname'] aufgerufen werden (letzteres kümmert sich nicht darum ob die variablen per post oder per get gekommen sind)
     
  4. 10. Juli 2008
    AW: MD5 bruten

    Also das Grundprinzip versteh ich, aber ich kriege es leider nicht umgesetzt, dass ich z.B. bei zwei Buchstaben

    aa
    ab
    ac
    ad
    ...
    ef
    eg
    eh
    ...
    zx
    zy
    zz

    hinbekomm. Ich kann programmieren, doch mitm zu logisch Denken ist dann bei mir schnell schluss xD Ja, das passt nicht, ich weiß, als Programmierer sollte man sowas gut beherrschen Wäre natürlich nett, wenn du mir noch ein bisschen weiter helfen könntest ^^ Aber wie gesagt! Es muss nicht sein, ist für mich mehr just for fun. Aber ich hab beim googeln sowas auch noch garnicht gefunden ... vielleicht schlecht gegoogelt!

    Hab dein Script jetzt so umgekrämpelt (vielleicht hab ichs doch falsch verstanden?!)
    PHP:
        // Minimale stringlänge
       
    $min_len  3 ;

       
    // Maximale stringlänge
       
    $max_len  8 ;

       
    // Charset, dass durchprobiert werden soll
       
    $charset   "abcdefghijklmnopqrstuvwxyz" ;
       
    $charset  .=  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
       
    $charset  .=  "1234567890" ;


       for (
    $i = $mi_len - 1 $i < $max_len - 1 $i ++) 
       {
          for (
    $j = 0 $j < strlen ( $charset );  $j ++) 
          {
             
    // Hier kannst du dann mit dem String machen was du willst
         //echo $i."<br />";
         //echo $j."<br />";

             
    $string [ $i ] .=  $charset [ $j ];
             echo 
    $string [ $i ]. '<br />' ;
          }
       } 
    Wenn ich bein echo nur $string ausgeb, krieg ich array raus.

    @Timer: Ja, auf die Sicherheit, Funktionsweise und Sauberkeit hab ich jetzt beim Script nicht so geachtet Es hat bei mir geklappt (hab schnell XAMPP bei mir installiert und es ging). Ich hätte es auch in C++ schreiben können, aber ich dacht so auf die Schnelle nehm ich mal PHP und auf gut Glück ;P Aber danke auf jeden Fall für deinen Hinweis, das verdreh ich sowieso immer ^^

    Edit: Achja ... der Sinn meines Scripts ist ganz klar: Recovern von md5 Passwörtern ^^
     
  5. 11. Juli 2008
    AW: MD5 bruten

    bei deiner modifikation sollte das problem sein, dass du in dieser zeile:
    PHP:
             $string [ $i ] .=  $charset [ $j ];
    noch den "." eingebaut hast. das ist falsch weil es soll ja erstmal nur das letzte zeichen der kette verändert werden ($i ist ja die zählervariable, die immer auf das letzte zeichen zeigt). so würde immer ein buchstabe angehängt werden.

    und mir ist aufgefallen dass mein code auch komplett falsch ist. jetzt wird zwar immer das letzte zeichen verändert aber wenn man dann in einen neuen durchlauf von der ersten for-schleife kommt steht in der 2.-letzten immer noch das letzte zeichen aus dem charset drin.

    ich mach mich nachher nochmal ran. jetzt erstmal rudern gehen

    greez myth
     
  6. 19. August 2008
    AW: MD5 bruten

    Als kleine Anmerkung: Sowas in PHP bzw. in einer Interpretersprache zu realisieren ist SEHR unperformant. Sowas macht man besser in einer Systemnahen Sprache. Alles in allem gibt es sowas aber schon, nennt sich Rainbowtables.

    Gruß
     
  7. 20. August 2008
    AW: MD5 bruten

    sinn: lerneffekt

    danke
     
  8. 20. August 2008
    AW: MD5 bruten

    naja, aber davon brauchst du im normalen einsatz von php sogut wie nix, außer halt der allgemeinen syntax.

    ich könnt hier auch ne verbesserung posten, aber dann heißts wieder ich weiß alles besser xD

    hab das script mal nicht ausgeführt, weil ich grad kein bock hab meinen apache mit ner exception zu beenden
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.