mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-05-12 19:04:32 +02:00
82 lines
2.1 KiB
C
82 lines
2.1 KiB
C
#include "precomp.h"
|
|
|
|
/*
|
|
* Returns zero or more local interfaces to the requestor
|
|
*/
|
|
DWORD request_net_config_get_interfaces(Remote *remote, Packet *packet)
|
|
{
|
|
Packet *response = packet_create_response(packet);
|
|
PMIB_IPADDRTABLE table = NULL;
|
|
DWORD tableSize = sizeof(MIB_IPADDRROW) * 33;
|
|
DWORD result = ERROR_SUCCESS, index, entryCount;
|
|
MIB_IFROW iface;
|
|
Tlv entries[5];
|
|
|
|
do
|
|
{
|
|
// Allocate memory for reading addresses into
|
|
if (!(table = (PMIB_IPADDRTABLE)malloc(tableSize)))
|
|
{
|
|
result = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
// Get the IP address table
|
|
if (GetIpAddrTable(table, &tableSize, TRUE) != NO_ERROR)
|
|
{
|
|
result = GetLastError();
|
|
break;
|
|
}
|
|
|
|
// Enumerate the entries
|
|
for (index = 0;
|
|
index < table->dwNumEntries;
|
|
index++)
|
|
{
|
|
entryCount = 0;
|
|
|
|
entries[entryCount].header.length = sizeof(DWORD);
|
|
entries[entryCount].header.type = TLV_TYPE_IP;
|
|
entries[entryCount].buffer = (PUCHAR)&table->table[index].dwAddr;
|
|
entryCount++;
|
|
|
|
entries[entryCount].header.length = sizeof(DWORD);
|
|
entries[entryCount].header.type = TLV_TYPE_NETMASK;
|
|
entries[entryCount].buffer = (PUCHAR)&table->table[index].dwMask;
|
|
entryCount++;
|
|
|
|
iface.dwIndex = table->table[index].dwIndex;
|
|
|
|
// If interface information can get gotten, use it.
|
|
if (GetIfEntry(&iface) == NO_ERROR)
|
|
{
|
|
entries[entryCount].header.length = iface.dwPhysAddrLen;
|
|
entries[entryCount].header.type = TLV_TYPE_MAC_ADDR;
|
|
entries[entryCount].buffer = (PUCHAR)iface.bPhysAddr;
|
|
entryCount++;
|
|
|
|
if (iface.bDescr)
|
|
{
|
|
entries[entryCount].header.length = iface.dwDescrLen + 1;
|
|
entries[entryCount].header.type = TLV_TYPE_MAC_NAME;
|
|
entries[entryCount].buffer = (PUCHAR)iface.bDescr;
|
|
entryCount++;
|
|
}
|
|
}
|
|
|
|
// Add the interface group
|
|
packet_add_tlv_group(response, TLV_TYPE_NETWORK_INTERFACE,
|
|
entries, entryCount);
|
|
}
|
|
|
|
} while (0);
|
|
|
|
if (table)
|
|
free(table);
|
|
|
|
// Transmit the response if valid
|
|
packet_transmit_response(result, remote, response);
|
|
|
|
return result;
|
|
}
|