MOON
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4
System: Linux csr818.wilogic.com 2.6.18-419.el5xen #1 SMP Fri Feb 24 22:50:37 UTC 2017 x86_64
User: digitals (531)
PHP: 5.4.45
Disabled: NONE
Upload Files
File: //proc/self/root/proc/self/root/scripts.20110531.215904.25158/md5crypt
#!/usr/bin/perl


#improved
use Digest::MD5;
use strict;


my $Magic = '$1$';                 # Magic string
my $itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
my $random = '';

open(RANDOM,"/dev/urandom");
read RANDOM,$random,4096;
close(RANDOM);
 
$random =~ s/\W//g;

open(FH, "<&=$ARGV[0]") || die "$0: $!";
my $pass =<FH>;
close(FH);
$pass =~ s/\r//g;
$pass =~ s/\n//g;
my $ppl = unix_md5_crypt($pass,$random);
      print "$ppl\n";
      


sub getsalt
{
    my($cpass) = @_;
    ($cpass =~ /^\$1\$(.+)\$.*/) and return $1;
    ($cpass =~ /^(..).*/) and return $1;
}

sub unix_md5_crypt {
    my($pw, $salt) = @_;
    my $passwd;

    $salt =~ s/^\Q$Magic//;     # Take care of the magic string if
                                # if present.

    $salt =~ s/^(.*)\$.*$/$1/;  # Salt can have up to 8 chars...
    $salt = substr($salt, 0, 8);

    my $ctx = new Digest::MD5;             # Here we start the calculation
    $ctx->add($pw);             # Original password...
    $ctx->add($Magic);          # ...our magic string...
    $ctx->add($salt);           # ...the salt...

    my ($final) = new Digest::MD5;
    $final->add($pw);
    $final->add($salt);
    $final->add($pw);
    $final = $final->digest;

	my $pl;
    for ($pl = length($pw); $pl > 0; $pl -= 16) {
        $ctx->add(substr($final, 0, $pl > 16 ? 16 : $pl));
    }

                                # Now the 'weird' xform
	my $i;
    for ($i = length($pw); $i; $i >>= 1) {
        if ($i & 1) { $ctx->add(pack("C", 0)); }
                                # This comes from the original version,
                                # where a memset() is done to $final
                                # before this loop.
        else { $ctx->add(substr($pw, 0, 1)); }
    }

    $final = $ctx->digest;
                                # The following is supposed to make
                                # things run slower. In perl, perhaps
                                # it'll be *really* slow!
    
    for ($i = 0; $i < 1000; $i++) {
        my $ctx1 = new Digest::MD5;
        if ($i & 1) { $ctx1->add($pw); }
        else { $ctx1->add(substr($final, 0, 16)); }
        if ($i % 3) { $ctx1->add($salt); }
        if ($i % 7) { $ctx1->add($pw); }
        if ($i & 1) { $ctx1->add(substr($final, 0, 16)); }
        else { $ctx1->add($pw); }
        $final = $ctx1->digest;
    }
       
                                # Final xform

    $passwd = '';
    $passwd .= to64(int(unpack("C", (substr($final, 0, 1))) << 16)
                    | int(unpack("C", (substr($final, 6, 1))) << 8)
                    | int(unpack("C", (substr($final, 12, 1)))), 4);
    $passwd .= to64(int(unpack("C", (substr($final, 1, 1))) << 16)
                    | int(unpack("C", (substr($final, 7, 1))) << 8)
                    | int(unpack("C", (substr($final, 13, 1)))), 4);
    $passwd .= to64(int(unpack("C", (substr($final, 2, 1))) << 16)
                    | int(unpack("C", (substr($final, 8, 1))) << 8)
                    | int(unpack("C", (substr($final, 14, 1)))), 4);
    $passwd .= to64(int(unpack("C", (substr($final, 3, 1))) << 16)
                    | int(unpack("C", (substr($final, 9, 1))) << 8)
                    | int(unpack("C", (substr($final, 15, 1)))), 4);
    $passwd .= to64(int(unpack("C", (substr($final, 4, 1))) << 16)
                    | int(unpack("C", (substr($final, 10, 1))) << 8)
                    | int(unpack("C", (substr($final, 5, 1)))), 4);
    $passwd .= to64(int(unpack("C", substr($final, 11, 1))), 2);

    $final = '';

    return ($Magic . $salt . '$' . $passwd);
}


sub to64 {
    my ($v, $n) = @_;
    my $ret = '';
    while (--$n >= 0) {
        $ret .= substr($itoa64, $v & 0x3f, 1);
        $v >>= 6;
    }
    $ret;
}