[Code] PHP Bruteforce - unterbrechen & wieder fortsetzen ?

Dieses Thema im Forum "Webentwicklung" wurde erstellt von tc-maxx, 22. Oktober 2009 .

  1. 22. Oktober 2009
    PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Hi,

    ich bastle gerade an diesem Script, komme aber nicht weiter.

    Sieht hier jemand eine Möglichkeit den Script folgendermaßen umzubasteln:

    Also das Brute Force soll 19 Sekunden laufen und dann stoppen, da auf dem Server die PHP-Ausführungszeit auf 20 Sekunden begrenzt ist.

    <bis hierher funktioniert's>

    Nach dem Stop soll es sich erneut starten und an der unterbrochenen Stelle fortfahren.

    PHP:
    <? 
    #---------[ Start]------------------------------------------------------------------------------------------
    define ( 'beginn' , microtime ( true ));

    #---------[ fill vars ]---------------------------------------------------------------------------------------
    $Hash_ $_REQUEST [ input_hash ];
    $PWD_Len_ $_REQUEST [ input_len ];
    $first_Char_ $_REQUEST [ input_char ];
    ?>

            <form name="prompt" action="<?php  echo  $_SERVER [ 'PHP_SELF' ];  ?>" method="post">
         <table cellspacing="1" cellpadding="1" border="0">
          <tr>
            <td align="right" >: PWD ha$h :</td>
            <td><input type="text" name="input_hash" value="<?  echo  $Hash_ ?>" maxlength="13"></td>
          </tr>

          <tr>
            <td align="right"> PWD length :</td>
            <td><input type="text" name="input_len" value="<?  echo  $PWD_Len_ ?>" maxlength="1"></td>
          </tr>

          <tr>
            <td align="right"> PWD first char :</td>
            <td><input type="text" name="input_char" value="<?  echo  $first_Char_ ?>" maxlength="6"></td>
          </tr>

          <tr>
            <td align="right">: Charset :</td>        
                <td>
                  <input type="checkbox" name="CS1" value="1" <?php  if (isset( $_REQUEST [ 'CS1' ])) echo  'checked="checked"' ?>> a..z<br>
                  <input type="checkbox" name="CS2" value="1" <?php  if (isset( $_REQUEST [ 'CS2' ])) echo  'checked="checked"' ?>> 0..9<br>
                  <input type="checkbox" name="CS3" value="1" <?php  if (isset( $_REQUEST [ 'CS3' ])) echo  'checked="checked"' ?>> A..Z<br>
                  <input type="checkbox" name="CS4" value="1" <?php  if (isset( $_REQUEST [ 'CS4' ])) echo  'checked="checked"' ?> > ~`!@#$%^&*()-_\/\'";:,.+=<>? <br>              
                </td>
              </tr>
           </table>
            <input type="submit" name="button" value="[ start Bruteforce ]">
        </form>

    <?
    #---------[errorhandling]----------------------------------------------------------------------------------
    if ( strlen ( $Hash_ ) !=  13 )  { echo  '<br><font color="#ff2200">Error: Check Hash</font>' ; exit; }
    if (
    strlen ( $PWD_Len_ ) ==  ){ echo  '<br><font color="#ff2200">Error: Check Passwordlength</font>' ; exit; }
    if (
    $PWD_Len_  <=  ){ echo  '<br><font color="#ff2200">Error: Passwordlength too small</font>' ; exit; }
    if (
    strlen ( $first_Char_ ) ==  0 ){ echo  '<br><font color="#ff2200">Error: Check first char</font>' ; exit; }
    if (
    $_REQUEST [ 'CS1' ] +   $_REQUEST [ 'CS2' ] +   $_REQUEST [ 'CS3' ] +   $_REQUEST [ 'CS4' ] ==  ){ echo  '<br><font color="#ff2200">Error: Check charterset</font>' ; exit; }

    #---------[ defines ]---------------------------------------------------------------------------------------
    define ( 'PB_HASH' , $Hash_ );                                          // zu crackende Hash
    define ( 'PASSWORD_MAX_LENGTH' $PWD_Len_  strlen ( $first_Char_ ));   // Passwortlänge minus firstchar
    define ( 'FIRST_CHAR' , $first_Char_ );                                 // erster Buchstabe
     
    #---------[ available characters to try for password ]------------------------------------------------------
    if (  $_REQUEST [ 'CS1' ] ==  1 $charset  .=  'abcdefghijklmnopqrstuvwxyz' ;
    if ( 
    $_REQUEST [ 'CS2' ] ==  1 $charset  .=  '0123456789' ;
    if ( 
    $_REQUEST [ 'CS3' ] ==  1 $charset  .=  'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;
    if ( 
    $_REQUEST [ 'CS4' ] ==  1 $charset  .=  '~`!@#$%^&*()-_\/\'";:,.+=<>? ' ;

    #---------[ set charset.len]--------------------------------------------------------------------------------
    $charset_length  strlen ( $charset );

    #---------[ functions ]------------------------------------------------------------------------------------- 
    function  recurse ( $width $position $base_string ) {
        global 
    $charset $charset_length $TimeCheck ;
        
    $i  0 ;
        for (
    $i  $i  $charset_length ; ++ $i ) {

            if (
    $position   $width  1 recurse ( $width $position  1 $base_string  $charset [ $i ]);

            
    #---[Check]------------------------------------------------------------------------------------------
            
    if ( crypt ( FIRST_CHAR . $base_string  $charset [ $i ], "PB" ) ==  PB_HASH  ) {
                echo 
    '<br>Found match, password:<font color="#00ff00"> ' . FIRST_CHAR . $base_string . $charset [ $i ]. "</font>" . Footer (); exit;
            }

            
    $TimeCheck ++;
            if (
    $TimeCheck  ==  100  ) {
               if (
    microtime ( true ) -  beginn  >=  19 )  {  // max. Script dauer 19Sekunden & dann neu starten!!?
                  
    echo  "<br><br>->i: " . $i  "<br>->base_string: " . $base_string ;
                  echo 
    "<br><br>STOP: Runtimelimit! " . Footer (); exit;}
               
    $TimeCheck  = 0 ;
            }
        }
    }

    function 
    Footer () { 
        
    $dauer  microtime ( true ) -  beginn
        return 
    '<br><br>Runtime: ' . sprintf ( '%.3f' $dauer ). ' sec.<br>'
    }
     
    #---------[ print header ]----------------------------------------------------------------------------------
    echo  'target hash: ' . PB_HASH ;

    #---------[ start search ]----------------------------------------------------------------------------------
    echo  '<br><br>Words (max.): ' . bcpow ( $PWD_Len_ strlen ( $charset ));

    recurse ( PASSWORD_MAX_LENGTH 0 '' ); 

    #---------[ print if no pass found ]------------------------------------------------------------------------
    echo  '<br><font color="#ff2200">Execution complete, no password found!</font>' . Footer (); 
    ?>

    Gruß
    tcM
     
  2. 22. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    lass doch die aktuelle position deiner iteration in einer .txt speichern und lies sie beim starten des scriptes wieder aus
     
  3. 23. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Hallo,

    ok das wäre kein Problem, ich weiß bloß nicht wie ich das Script dann initialisieren muß damit es an der letzten Stelle wieder anfängt zu suchen.


    Gruß
    tCM
     
  4. 23. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Du kannst das Skript nicht rekursiv starten. Eine möglichkeit wäre einen Cronjob einzurichten.
    Da du die Ausführungszeit nichz ändern kannst (sonst würdest du ja nicht so einen Murks versuchen) denke ich mal das es nicht dein eingener Server ist.
    D.h. du musst auf einen Free-Coronjob anbieter zurückgreifen, allerdings musst du da halt gucken in welchen Zeiteinheiten man diese Einrichten kann.

    Hier wäre der Abstand z.B. nur eine Minute (was für einen Free-Anbieter ja sehr gut ist):
    Cronjob.de - Kostenlose Cronjobs und Crontab
     
  5. 23. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Hi, danke für die Infos!
    Cronjobs sind optimal ür mein Projekt geeignet!

    Nun benötige ich noch einen anderen Bruteforce Script den ich mit den zuletzt getesteten Passwort erneut starten kann...

    Hat jemand von euch eine Idee?

    Gruß
    tCM
     
  6. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Du kannst es doch ganz genau so machen, wie er vorgeschlagen hat oder habe ich dich jetzt falsch verstanden?
     
  7. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Hi,

    also das Problem ist ja daß die function recurse wieder in der funktion recurse aufgerufen wird usw...

    Also angenommen das Script ließt das zuletzt getestete Passwort aus einer textdatei aus,
    wie starte ich das Script mit dem letzten Passwort erneut?

    recurse(PASSWORD_MAX_LENGTH, 0, $last_password_from_file");

    funktioniert das leider nicht.

    Gruß
    tcM


    PHP:
    function  recurse ( $width $position $base_string ) {
        global 
    $charset $charset_length $TimeCheck ;
        
    $i  0 ;
        for (
    $i  $i  $charset_length ; ++ $i ) {

            if (
    $position   $width  1 recurse ( $width $position  1 $base_string  $charset [ $i ]);

            
    #---[Check]------------------------------------------------------------------------------------------
            
    if ( crypt ( FIRST_CHAR . $base_string  $charset [ $i ], "PB" ) ==  PB_HASH  ) {
                echo 
    '<br>Found match, password:<font color="#00ff00"> ' . FIRST_CHAR . $base_string . $charset [ $i ]. "</font>" . Footer (); exit;
            }

        }
    }
     
  8. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    So wie ich deinen Code verstanden habe, ist der aktuellste Versuch doch immer in base_string gespeichert. Diesen speicherst du in eine Datei, wenn du aufhören musst.

    Du musst deine Funktion so erweitern, dass du einen Startwert für i übergeben kannst.
    Dann ist es nämlich möglich, den base_string ohne den letzten char zu übergeben und voher die Position des letzten chars aus base_string im charset zu bestimmen. Dieses ist dann der neue Startwert für i.

    btw: Hast du die Funktion überhaupt selbst geschrieben? Denn der Aufruf, von dem du sagst er funktioniert nicht, ist völlig unsinning. Immerhin ist position nicht die Position im charset sondern dient nur dazu, unter der maximal angegebenen Länge des PW zu bleiben.
     
  9. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Hi Chillikid,
    ja der aktuelle Versuch ist in base_string gespeichert.

    Ich habe meine Code jetzt verändert.

    PHP:
    <?
       
    $PWD_File = 'last_pass' ;
       if (
    file_exists ( $PWD_File )) {
          
    $fd  fopen ( $PWD_File , "r" );
          
    $base_string  fread ( $fd , filesize ( $PWD_File ));
          
    $fd  fclose ( $fd );
       }
     
       
    $PWD_Pos  'last_pos' ;
       if (
    file_exists ( $PWD_Pos )) {
          
    $fd  fopen ( $PWD_Pos , "r" );
          
    $position  fread ( $fd , filesize ( $PWD_Pos ));
          
    $fd  fclose ( $fd );
       }

       
    $PWD_i  'last_i' ;
       if (
    file_exists ( $PWD_i )) {
          
    $fd  fopen ( $PWD_i , "r" );
          
    $i  fread ( $fd , filesize ( $PWD_i ));
          
    $fd  fclose ( $fd );
       }

    ?>
    <HTML>
    <HEAD>
    <BODY BGCOLOR="#000000" TEXT="#CCCCCC" LINK="#FFFFFF" ALINK="#FFFFFF" VLINK="#CCCCCC">
    </HEAD>
    <font color="#ee40cc">OnLiNE-PjG-CrAcKeR</font>

    <? 
    #---------[ Stopuhr ]----------------------------------------------------------------------------------------
    define ( 'beginn' , microtime ( true ));

    #---------[ fill vars ]---------------------------------------------------------------------------------------
    $Hash_ $_REQUEST [ input_hash ];
    $PWD_Len_ $_REQUEST [ input_len ];
    $first_Char_ $_REQUEST [ input_char ];
    ?>

            <form name="prompt" action="<?php  echo  $_SERVER [ 'PHP_SELF' ];  ?>" method="post">
         <table cellspacing="1" cellpadding="1" border="0">
          <tr>
            <td align="right" >: PWD ha$h :</td>
            <td><input type="text" name="input_hash" value="<?  echo  $Hash_ ?>" maxlength="13"></td>
          </tr>

          <tr>
            <td align="right"> PWD length :</td>
            <td><input type="text" name="input_len" value="<?  echo  $PWD_Len_ ?>" maxlength="1"></td>
          </tr>

          <tr>
            <td align="right"> PWD first char :</td>
            <td><input type="text" name="input_char" value="<?  echo  $first_Char_ ?>" maxlength="6"></td>
          </tr>

          <tr>
            <td align="right">: Charset :</td>        
                <td>
                  <input type="checkbox" name="CS1" value="1" <?php  if (isset( $_REQUEST [ 'CS1' ])) echo  'checked="checked"' ?>> a..z<br>
                  <input type="checkbox" name="CS2" value="1" <?php  if (isset( $_REQUEST [ 'CS2' ])) echo  'checked="checked"' ?>> 0..9<br>
                  <input type="checkbox" name="CS3" value="1" <?php  if (isset( $_REQUEST [ 'CS3' ])) echo  'checked="checked"' ?>> A..Z<br>
                  <input type="checkbox" name="CS4" value="1" <?php  if (isset( $_REQUEST [ 'CS4' ])) echo  'checked="checked"' ?> > ~`!@#$%^&*()-_\/\'";:,.+=<>? <br>              
                </td>
              </tr>
           </table>
            <input type="submit" name="button" value="[ start Bruteforce ]">
        </form>

    <?
    #---------[errorhandling]----------------------------------------------------------------------------------
    if ( strlen ( $Hash_ ) !=  13 )  { echo  '<br><font color="#ff2200">Error: Check Hash</font>' ; exit; }
    if (
    strlen ( $PWD_Len_ ) ==  ){ echo  '<br><font color="#ff2200">Error: Check Passwordlength</font>' ; exit; }
    if (
    $PWD_Len_  <=  ){ echo  '<br><font color="#ff2200">Error: Passwordlength too small</font>' ; exit; }
    if (
    strlen ( $first_Char_ ) ==  0 ){ echo  '<br><font color="#ff2200">Error: Check first char</font>' ; exit; }
    if (
    $_REQUEST [ 'CS1' ] +   $_REQUEST [ 'CS2' ] +   $_REQUEST [ 'CS3' ] +   $_REQUEST [ 'CS4' ] ==  ){ echo  '<br><font color="#ff2200">Error: Check charterset</font>' ; exit; }

    #---------[ defines ]---------------------------------------------------------------------------------------
    define ( 'PB_HASH' , $Hash_ );                                          // zu crackende Hash
    define ( 'PASSWORD_MAX_LENGTH' $PWD_Len_  strlen ( $first_Char_ ));   // Passwortlänge minus firstchar
    define ( 'FIRST_CHAR' , $first_Char_ );                                 // erster Buchstabe
     
    #---------[ available characters to try for password ]------------------------------------------------------
    if (  $_REQUEST [ 'CS1' ] ==  1 $charset  .=  'abcdefghijklmnopqrstuvwxyz' ;
    if ( 
    $_REQUEST [ 'CS2' ] ==  1 $charset  .=  '0123456789' ;
    if ( 
    $_REQUEST [ 'CS3' ] ==  1 $charset  .=  'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;
    if ( 
    $_REQUEST [ 'CS4' ] ==  1 $charset  .=  '~`!@#$%^&*()-_\/\'";:,.+=<>? ' ;

    #---------[ set len of charset]-----------------------------------------------------------------------------
    $charset_length  strlen ( $charset );

    #---------[ functions ]------------------------------------------------------------------------------------- 
    function  recurse ( $width $position $base_string , $i ) {
        global 
    $charset $charset_length $TimeCheck $PWD_File $PWD_Pos $PWD_i ;
    //  $i = 0;
        
    for ( $i  $i  $charset_length ; ++ $i ) {

            if (
    $position   $width  1 recurse ( $width $position  1 $base_string  $charset [ $i ], 0 );

            
    #---[Check]------------------------------------------------------------------------------------------
            
    if ( crypt ( FIRST_CHAR . $base_string  $charset [ $i ], "PB" ) ==  PB_HASH  ) {
                echo 
    '<br>Found match, password:<font color="#00ff00"> ' . FIRST_CHAR . $base_string . $charset [ $i ]. "</font>" . Footer (); exit;
            }

            
    $TimeCheck ++;
            if (
    $TimeCheck  ==  100  ) {
               if (
    microtime ( true ) -  beginn  >=  19 )  {
                  echo 
    "<br><br>->i: " . $i  "<br>->base_string: " . $base_string ;
                  echo 
    "<br><br>STOP: Runtimelimit! " . Footer (); 
          
                  
    #----[Write last config in files]--------------------------------------------------------------
                  
    $fd  fopen ( $PWD_File , "w" );
                  
    $re  fwrite ( $fd , $base_string );
                  
    $fd  fclose ( $fd );

                  
    $fd  fopen ( $PWD_Pos , "w" );
                  
    $re  fwrite ( $fd , $position );
                  
    $fd  fclose ( $fd );

                  
    $fd  fopen ( $PWD_i , "w" );
                  
    $re  fwrite ( $fd , $i );
                  
    $fd  fclose ( $fd );
                  exit;

                }
               
    $TimeCheck  = 0 ;
            }
        }
    }

    function 
    Footer () { 
        
    $dauer  microtime ( true ) -  beginn
        return 
    '<br><br>Runtime: ' . sprintf ( '%.3f' $dauer ). ' sec.<br><br><br></body></HTML>'
    }
     
    #---------[ print header ]----------------------------------------------------------------------------------
    echo  'target hash: ' . PB_HASH ;

    #---------[ start search ]----------------------------------------------------------------------------------
    echo  '<br><br>Words (max.): ' . bcpow ( $PWD_Len_ strlen ( $charset ));

    // recurse(PASSWORD_MAX_LENGTH, 0, '',0); 

    echo  '<br>pos ' . $position . '<br>'
    echo 
    'basestring ' . $base_string . '<br>'
    echo  
    'charset[' . $i . '] ' . $charset [ $i ]. '<br>' ;
    recurse ( PASSWORD_MAX_LENGTH $position $base_string . $charset [ $i ],  $i );

    #---------[ print if no pass found ]------------------------------------------------------------------------
    echo  '<br><font color="#ff2200">Execution complete, no password found!</font>' . Footer (); 
    ?>
    so wird aber beim zweiten Durchgang nur eine Stelle (bei $position) im Base_String mit dem Charset durchgetestet.. Danach geht er raus und das Script ist zuende.

    (Die Funktion habe ich ansatzweise im Netz gefunden und solange dran rumgebastelt bis sie funktioniert hat)
     
  10. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Das Problem wird darin liegen, dass das Skript durch die Rekursion quasi von hinten anfängt, d.h. mit der max. Erlaubten Zahl für $position. Daher ist es nicht verwunderlich, dass auch eine hohe Zahl abgespeichert wird und es bei der Wiederaufnahme denkt, dass nichts mehr zu tun ist.

    Überprüfe also mal, was genau in die dateien geschrieben wird.

    Außerdem musst du diese Zeile von
    in
    ändern, denn sonst übersprint es einen char.
     
  11. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Hi,
    die Zeile habe ich angepasst.

    Hash: PBKMSHVtzTp0.
    Charset: a...z & 0...9
    first_Char='1'
    pwd_len = 7

    hört nach 19Sekunden auf und schreibt folgende Werte in die Files:

    last_i = 30
    last_pass = abiiy
    last_pos = 5
     
  12. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Ja nach diesen Werten ist es klar, dass das Skript nicht weiter läuft. In dem if wird ja auf ($position < $width - 1) geprüft und $position ist 5, $width ist 6. D.h. es gibt nur noch einen Durchlauf.

    Für dieses Speichern & Laden ist die Vorgehensweise hier einfach nicht geeignet.

    Im Endeffekt musst du eine Methode schreiben, die den String den es zu hashen gilt quasi hochzählt, also nach diesem Muster (angenommen charset wäre 'abc' und max. Länge 3):
    Spoiler
    a
    aa
    aaa
    aab
    aac
    ab
    aba
    abb
    abc
    ac
    aca
    acb
    acc
    b
    bb
    bba
    bbb
    bbc
    ...

    ...und ihn dann vergleicht. Anders wird das glaube ich nicht funktionieren.
     
  13. 24. Oktober 2009
    AW: PHP Bruteforce - unterbrechen & wieder fortsetzen ?

    Alles klar,
    danke für die Antworten, ich werd mich mal an die Arbeit machen...

    Gruß
    tcM
     
  14. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.