mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-03-30 22:19:17 +02:00
Add check_key_exists registry function
MSF side has been attempting to open keys to see if they exist, which isn't fantastic as it results in an error. This change adds a function which indicates to the caller if the given reg key exists.
This commit is contained in:
parent
3cf63909a7
commit
db764771a2
c/meterpreter/source/extensions/stdapi/server
@ -87,6 +87,7 @@ Command customCommands[] =
|
|||||||
COMMAND_REQ( "stdapi_sys_process_thread_set_regs", request_sys_process_thread_set_regs ),
|
COMMAND_REQ( "stdapi_sys_process_thread_set_regs", request_sys_process_thread_set_regs ),
|
||||||
|
|
||||||
// Registry
|
// Registry
|
||||||
|
COMMAND_REQ( "stdapi_registry_check_key_exists", request_registry_check_key_exists ),
|
||||||
COMMAND_REQ( "stdapi_registry_load_key", request_registry_load_key ),
|
COMMAND_REQ( "stdapi_registry_load_key", request_registry_load_key ),
|
||||||
COMMAND_REQ( "stdapi_registry_unload_key", request_registry_unload_key ),
|
COMMAND_REQ( "stdapi_registry_unload_key", request_registry_unload_key ),
|
||||||
COMMAND_REQ( "stdapi_registry_open_key", request_registry_open_key ),
|
COMMAND_REQ( "stdapi_registry_open_key", request_registry_open_key ),
|
||||||
@ -121,10 +122,7 @@ Command customCommands[] =
|
|||||||
COMMAND_REQ( "stdapi_net_config_get_netstat", request_net_config_get_netstat ),
|
COMMAND_REQ( "stdapi_net_config_get_netstat", request_net_config_get_netstat ),
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
{ "stdapi_net_config_get_proxy",
|
COMMAND_REQ( "stdapi_net_config_get_proxy", request_net_config_get_proxy_config),
|
||||||
{ request_net_config_get_proxy_config, { 0 }, 0 },
|
|
||||||
{ EMPTY_DISPATCH_HANDLER },
|
|
||||||
},
|
|
||||||
// Resolve
|
// Resolve
|
||||||
COMMAND_REQ( "stdapi_net_resolve_host", request_resolve_host ),
|
COMMAND_REQ( "stdapi_net_resolve_host", request_resolve_host ),
|
||||||
COMMAND_REQ( "stdapi_net_resolve_hosts", request_resolve_hosts ),
|
COMMAND_REQ( "stdapi_net_resolve_hosts", request_resolve_hosts ),
|
||||||
|
@ -3,6 +3,51 @@
|
|||||||
|
|
||||||
DWORD request_registry_create_key(Remote *remote, Packet *packet);
|
DWORD request_registry_create_key(Remote *remote, Packet *packet);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Check to see if a registry key exists.
|
||||||
|
* @param remote Pointer to the \c Remote instance.
|
||||||
|
* @param packet Pointer to the request \c Packet instance.
|
||||||
|
* @returns Always returns \c ERROR_SUCCESS.
|
||||||
|
*/
|
||||||
|
DWORD request_registry_check_key_exists(Remote *remote, Packet *packet)
|
||||||
|
{
|
||||||
|
Packet *response = packet_create_response(packet);
|
||||||
|
LPCTSTR baseKey = NULL;
|
||||||
|
HKEY rootKey = NULL;
|
||||||
|
HKEY resultKey = NULL;
|
||||||
|
BOOL exists = FALSE;
|
||||||
|
DWORD result;
|
||||||
|
|
||||||
|
rootKey = (HKEY)packet_get_tlv_value_uint(packet, TLV_TYPE_ROOT_KEY);
|
||||||
|
baseKey = packet_get_tlv_value_string(packet, TLV_TYPE_BASE_KEY);
|
||||||
|
|
||||||
|
if (rootKey && baseKey)
|
||||||
|
{
|
||||||
|
result = RegOpenKeyA(rootKey, baseKey, &resultKey);
|
||||||
|
if (result == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
dprintf("[REG] Key found");
|
||||||
|
RegCloseKey(resultKey);
|
||||||
|
exists = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintf("[REG] Key exists? %s", exists ? "TRUE" : "FALSE");
|
||||||
|
packet_add_tlv_bool(response, TLV_TYPE_BOOL, exists);
|
||||||
|
result = ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dprintf("[REG] Invalid parameter");
|
||||||
|
result = ERROR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintf("[REG] Returning result: %u %x", result, result);
|
||||||
|
packet_transmit_response(result, remote, response);
|
||||||
|
|
||||||
|
dprintf("[REG] done.");
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Opens a registry key and returns the associated HKEY to the caller if the
|
* Opens a registry key and returns the associated HKEY to the caller if the
|
||||||
* operation succeeds. Right now this is just a wrapper around create_key
|
* operation succeeds. Right now this is just a wrapper around create_key
|
||||||
|
@ -17,5 +17,6 @@ DWORD request_registry_enum_value(Remote *remote, Packet *packet);
|
|||||||
DWORD request_registry_delete_value(Remote *remote, Packet *packet);
|
DWORD request_registry_delete_value(Remote *remote, Packet *packet);
|
||||||
DWORD request_registry_load_key(Remote *remote, Packet *packet);
|
DWORD request_registry_load_key(Remote *remote, Packet *packet);
|
||||||
DWORD request_registry_unload_key(Remote *remote, Packet *packet);
|
DWORD request_registry_unload_key(Remote *remote, Packet *packet);
|
||||||
|
DWORD request_registry_check_key_exists(Remote *remote, Packet *packet);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user