2012-04-25 16:24:28 +00:00
|
|
|
##
|
2014-10-17 16:47:33 +00:00
|
|
|
# This module requires Metasploit: http://metasploit.com/download
|
2013-10-15 18:50:46 +00:00
|
|
|
# Current source: https://github.com/rapid7/metasploit-framework
|
2012-04-25 16:24:28 +00:00
|
|
|
##
|
|
|
|
|
|
|
|
require 'msf/core'
|
2015-01-08 01:06:09 +00:00
|
|
|
require 'rex/java/serialization'
|
2012-04-25 16:24:28 +00:00
|
|
|
|
|
|
|
class Metasploit3 < Msf::Auxiliary
|
|
|
|
|
2015-01-08 01:06:09 +00:00
|
|
|
include Msf::Rmi::Client
|
2013-08-30 21:28:54 +00:00
|
|
|
include Msf::Auxiliary::Scanner
|
|
|
|
include Msf::Auxiliary::Report
|
|
|
|
|
|
|
|
def initialize
|
|
|
|
super(
|
|
|
|
'Name' => 'Java RMI Server Insecure Endpoint Code Execution Scanner',
|
|
|
|
'Description' => 'Detect Java RMI endpoints',
|
|
|
|
'Author' => ['mihi', 'hdm'],
|
|
|
|
'License' => MSF_LICENSE,
|
|
|
|
'References' =>
|
|
|
|
[
|
|
|
|
# RMI protocol specification
|
|
|
|
[ 'URL', 'http://download.oracle.com/javase/1.3/docs/guide/rmi/spec/rmi-protocol.html'],
|
|
|
|
# Placeholder reference for matching
|
|
|
|
[ 'MSF', 'java_rmi_server']
|
|
|
|
],
|
|
|
|
'DisclosureDate' => 'Oct 15 2011'
|
|
|
|
)
|
|
|
|
|
|
|
|
register_options(
|
|
|
|
[
|
|
|
|
Opt::RPORT(1099)
|
|
|
|
], self.class)
|
|
|
|
end
|
|
|
|
|
|
|
|
def run_host(target_host)
|
2015-01-08 01:06:09 +00:00
|
|
|
vprint_status("#{peer} - Sending RMI Header...")
|
|
|
|
connect
|
2015-01-08 21:46:24 +00:00
|
|
|
|
|
|
|
send_header
|
|
|
|
ack = recv_protocol_ack
|
|
|
|
if ack.nil?
|
2015-01-08 01:06:09 +00:00
|
|
|
print_error("#{peer} - Filed to negotiate RMI protocol")
|
2013-08-30 21:28:54 +00:00
|
|
|
disconnect
|
2015-01-08 01:06:09 +00:00
|
|
|
return
|
|
|
|
end
|
2013-08-30 21:28:54 +00:00
|
|
|
|
2015-01-08 01:06:09 +00:00
|
|
|
# Determine if the instance allows remote class loading
|
|
|
|
vprint_status("#{peer} - Sending RMI Call...")
|
2015-01-08 20:01:04 +00:00
|
|
|
jar = Rex::Text.rand_text_alpha(rand(8)+1) + '.jar'
|
|
|
|
jar_url = "file:RMIClassLoaderSecurityTest/" + jar
|
2015-01-08 21:46:24 +00:00
|
|
|
|
|
|
|
send_call(call_data: build_gc_call_data(jar_url))
|
|
|
|
return_data = recv_return
|
|
|
|
|
|
|
|
if return_data.nil?
|
2015-01-08 06:29:50 +00:00
|
|
|
print_error("#{peer} - Failed to send RMI Call, anyway JAVA RMI Endpoint detected")
|
|
|
|
report_service(:host => rhost, :port => rport, :name => "java-rmi", :info => "")
|
2015-01-08 01:06:09 +00:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2015-01-08 06:29:50 +00:00
|
|
|
if loader_enabled?(return_data)
|
2015-01-08 01:06:09 +00:00
|
|
|
print_good("#{rhost}:#{rport} Java RMI Endpoint Detected: Class Loader Enabled")
|
|
|
|
svc = report_service(:host => rhost, :port => rport, :name => "java-rmi", :info => "Class Loader: Enabled")
|
|
|
|
report_vuln(
|
|
|
|
:host => rhost,
|
|
|
|
:service => svc,
|
|
|
|
:name => self.name,
|
|
|
|
:info => "Module #{self.fullname} confirmed remote code execution via this RMI service",
|
|
|
|
:refs => self.references
|
|
|
|
)
|
|
|
|
else
|
2015-01-08 06:29:50 +00:00
|
|
|
print_status("#{rhost}:#{rport} Java RMI Endpoint Detected: Class Loader Disabled")
|
|
|
|
report_service(:host => rhost, :port => rport, :name => "java-rmi", :info => "Class Loader: Disabled")
|
2013-08-30 21:28:54 +00:00
|
|
|
end
|
2015-01-08 06:29:50 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def loader_enabled?(stream)
|
|
|
|
stream.contents.each do |content|
|
|
|
|
if content.class == Rex::Java::Serialization::Model::NewObject &&
|
|
|
|
content.class_desc.description.class == Rex::Java::Serialization::Model::NewClassDesc &&
|
2015-01-08 21:46:24 +00:00
|
|
|
content.class_desc.description.class_name.contents == 'java.lang.ClassNotFoundException'&&
|
|
|
|
content.class_data[0].class == Rex::Java::Serialization::Model::NullReference &&
|
|
|
|
!content.class_data[1].contents.include?('RMI class loader disabled')
|
2015-01-08 06:29:50 +00:00
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
false
|
2013-08-30 21:28:54 +00:00
|
|
|
end
|
|
|
|
|
2012-04-25 16:24:28 +00:00
|
|
|
end
|