mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-01-20 20:37:27 +01:00
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
#include "metsrv.h"
|
|
#include "server_pivot.h"
|
|
#include "server_pivot_named_pipe.h"
|
|
|
|
/*!
|
|
* @brief Add a pivot point to the current meterpreter session
|
|
* @remote Pointer to the \c Remote instance.
|
|
* @remote Pointer to the incoming request \c Packet instance.
|
|
* @return Indication of error or success.
|
|
* @remark This allows for meterpreter to become a staging and pivot point
|
|
* for other Meterpreter instances on the network.
|
|
*/
|
|
DWORD request_core_pivot_add(Remote* remote, Packet* packet)
|
|
{
|
|
// Right now we only support named pipe pivotes, so just go straight there
|
|
return request_core_pivot_add_named_pipe(remote, packet);
|
|
}
|
|
|
|
/*!
|
|
* @brief Remove a pivot point from the current Meterpreter instance.
|
|
* @remote Pointer to the \c Remote instance.
|
|
* @remote Pointer to the incoming request \c Packet instance.
|
|
* @return Indication of error or success.
|
|
*/
|
|
DWORD request_core_pivot_remove(Remote* remote, Packet* packet)
|
|
{
|
|
DWORD result = ERROR_NOT_FOUND;
|
|
DWORD pivotIdLen = 0;
|
|
LPBYTE pivotId = packet_get_tlv_value_raw(packet, TLV_TYPE_PIVOT_ID, &pivotIdLen);
|
|
|
|
if (pivotId != NULL)
|
|
{
|
|
PivotContext* ctx = pivot_tree_remove(remote->pivot_listeners, pivotId);
|
|
#ifdef DEBUGTRACE
|
|
dprintf("[PIVOTTREE] Pivot listeners (after one removed)");
|
|
dbgprint_pivot_tree(remote->pivot_listeners);
|
|
#endif
|
|
if (ctx != NULL)
|
|
{
|
|
ctx->remove(ctx->state);
|
|
free(ctx);
|
|
result = ERROR_SUCCESS;
|
|
}
|
|
}
|
|
|
|
packet_transmit_empty_response(remote, packet, result);
|
|
|
|
return result;
|
|
}
|