mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-03-30 22:19:17 +02:00
Add POSIX support for transport remove
This commit is contained in:
parent
149e4c2a7e
commit
2e78a4379a
c/meterpreter/source
@ -250,6 +250,48 @@ BOOL remote_request_core_transport_prev(Remote* remote, Packet* packet, DWORD* r
|
||||
return *result == ERROR_SUCCESS ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
DWORD remote_request_core_transport_remove(Remote* remote, Packet* packet)
|
||||
{
|
||||
DWORD result = ERROR_SUCCESS;
|
||||
|
||||
// make sure we are not trying to remove the last transport
|
||||
if (remote->transport == remote->transport->prev_transport) {
|
||||
dprintf("[DISPATCH] Refusing to delete the last transport");
|
||||
result = ERROR_INVALID_FUNCTION;
|
||||
}
|
||||
else {
|
||||
Transport* found = NULL;
|
||||
Transport* transport = remote->transport;
|
||||
char* transportUrl = packet_get_tlv_value_string(packet, TLV_TYPE_TRANS_URL);
|
||||
|
||||
do {
|
||||
if (strcmp(transportUrl, transport->url) == 0) {
|
||||
found = transport;
|
||||
break;
|
||||
}
|
||||
|
||||
transport = transport->next_transport;
|
||||
} while (transport != remote->transport);
|
||||
|
||||
if (found == NULL || found == remote->transport) {
|
||||
dprintf("[DISPATCH] Transport not found, or attempting to remove current");
|
||||
// if we don't have a valid transport, or they're trying to remove the
|
||||
// existing one, then bomb out (that might come later)
|
||||
result = ERROR_INVALID_PARAMETER;
|
||||
}
|
||||
else {
|
||||
remote->trans_remove(remote, found);
|
||||
dprintf("[DISPATCH] Transport removed");
|
||||
}
|
||||
|
||||
SAFE_FREE(transportUrl);
|
||||
}
|
||||
|
||||
packet_transmit_empty_response(remote, packet, result);
|
||||
dprintf("[DISPATCH] Response sent.");
|
||||
return result;
|
||||
}
|
||||
|
||||
DWORD remote_request_core_transport_add(Remote* remote, Packet* packet)
|
||||
{
|
||||
Transport* transport = NULL;
|
||||
|
@ -207,6 +207,7 @@ typedef uint64_t QWORD;
|
||||
#define ERROR_INVALID_PARAMETER EINVAL
|
||||
#define ERROR_INVALID_HANDLE EINVAL
|
||||
#define ERROR_INVALID_DATA EINVAL
|
||||
#define ERROR_INVALID_FUNCTION EINVAL
|
||||
#define ERROR_UNSUPPORTED_COMPRESSION EINVAL
|
||||
#define ERROR_NOT_SUPPORTED EOPNOTSUPP
|
||||
|
||||
|
@ -1115,7 +1115,7 @@ static void append_transport(Transport** list, Transport* newTransport) {
|
||||
|
||||
static void remove_transport(Remote* remote, Transport* oldTransport) {
|
||||
// if we point to ourself, then we're the last one
|
||||
if (remote->transport->next_transport == oldTransport) {
|
||||
if (remote->transport->next_transport == remote->transport) {
|
||||
remote->transport = NULL;
|
||||
}
|
||||
else {
|
||||
@ -1294,6 +1294,8 @@ DWORD server_setup(MetsrvConfig* config)
|
||||
|
||||
// Set up the transport creation function pointer
|
||||
remote->trans_create = create_transport;
|
||||
// Set up the transport removal function pointer
|
||||
remote->trans_remove = remove_transport;
|
||||
// and the config creation pointer
|
||||
remote->config_create = config_create;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user