metasploit-framework/data/john/run.linux.x64.mmx/sap_prepare.pl

90 lines
2.7 KiB
Perl

#!/usr/bin/perl -w
# Usage: sap_prepare.pl csv-input sap-codeB-output sap-codevnG-output
# csv-input: XLS-exported table USH02 or USR02
# tab-speparted e.g. column 4:username column 17:bcode column 24:codvn G
# sap-codeB-output: username:username<spaces>$bcode
# sap-codevnG-output: username:Username<spaces>$codvnG
#
# (all other formats with the right column names should work)
# sap uses the username as salt. those have different length, so we needed to come up w/ our
# own format. that is: username<space-padding-to-40>$HASHCODE
#
# evil spaghetti code, but works. sorry for the eye cancer ;-)
$SALT_LENGTH = 40;
if ($#ARGV != 2) {
die ("usage = $0 csv-input sap-codeB-output sap-codevnG-output \n");
}
open INPUT_FILE, "$ARGV[0]" or die ("Can't open input-file ($ARGV[0])\n");
open CODEB_FILE,">>$ARGV[1]" or die ("Can't open codeb-file ($ARGV[1])\n");
open CODEG_FILE,">>$ARGV[2]" or die ("Can't open codeg-file ($ARGV[2])\n");
print "data from >>$ARGV[0]<<\nto sap-codeB-output: >>$ARGV[1]<<\n";
print "and sap-codevnG-output: >>$ARGV[2]<<\n\n";
$line = "";
$pos_bname=-1;
$pos_codeb=-1;
$pos_codeg=-1;
$count=0;
until ($line =~ /BNAME/) {
$line=<INPUT_FILE>;
$count++;
}
chomp($line);
@tmp = split(/\t/, $line);
for ($i=0;$i<=$#tmp;$i++) {
if ($tmp[$i]=~ /BNAME/) { $pos_bname=$i }
elsif ($tmp[$i]=~ /BCODE/) { $pos_codeb=$i }
elsif ($tmp[$i]=~ /PASSCODE/) { $pos_codeg=$i }
}
print "Column: $#tmp BNAME: $pos_bname BCODE: $pos_codeb PASSCODE: $pos_codeg\n";
if (-1==$pos_bname || (-1==$pos_codeg && -1==$pos_codeb ) ) {
print "BNAME column not found OR both hash-columns are missing \n";
exit 0;
}
while ($line=<INPUT_FILE>) {
$count++;
chomp($line);
@tmp = split(/\t/, $line);
if ($#tmp<$pos_bname || ($#tmp<$pos_codeb && $#tmp<$pos_codeg)) {
print "******** line $count in csv file has the wrong format ********\n";
next;
}
if ($pos_codeg!=-1 && $tmp[$pos_codeg]=~/[a-zA-Z0-9]/) { # both hashes
print "username: $tmp[$pos_bname] codeB: $tmp[$pos_codeb] codeG: $tmp[$pos_codeg] \n";
$strN = $tmp[$pos_bname];
$strSALT = "$strN"." "x($SALT_LENGTH-length($tmp[$pos_bname]));
$strB = "$tmp[$pos_codeb]";
$strG = "$tmp[$pos_codeg]";
print CODEB_FILE "$strN:$strSALT\$$strB\n";
print CODEG_FILE "$strN:$strSALT\$$strG\n";
}
elsif ($pos_codeb!=-1 && $tmp[$pos_codeb]=~/[a-zA-Z0-9]/ ) { # only bcode
print "username: $tmp[$pos_bname] codeB: $tmp[$pos_codeb] \n";
$strN = $tmp[$pos_bname];
$strSALT = "$strN"." "x($SALT_LENGTH-length($tmp[$pos_bname]));
$strB = "$tmp[$pos_codeb]";
print CODEB_FILE "$strN:$strSALT\$$strB\n";
}
else {
print "******** line $count in csv file has the wrong format ********\n";
}
}
close INPUT_FILE;
close CODEB_FILE;
close CODEG_FILE;
print "\nDone!\n";
exit 0;