Skip to content

Commit 681b857

Browse files
committed
Adds support for resolving multiple hosts
1 parent bf5bc65 commit 681b857

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

python/meterpreter/ext_server_stdapi.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,9 @@ class RTMSG(ctypes.Structure):
581581

582582
TLV_TYPE_SHUTDOWN_HOW = TLV_META_TYPE_UINT | 1530
583583

584+
# Resolve hosts/host
585+
TLV_TYPE_RESOLVE_HOST_ENTRY = TLV_META_TYPE_GROUP | 1550
586+
584587
##
585588
# Railgun
586589
##
@@ -1076,8 +1079,12 @@ def netlink_request(req_type, req_data):
10761079

10771080
def resolve_host(hostname, family):
10781081
address_info = getaddrinfo(hostname, family=family, socktype=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP)
1079-
address = address_info[0]['sockaddr'][0]
1080-
return {'family': family, 'address': address, 'packed_address': inet_pton(family, address)}
1082+
addresses = []
1083+
for addr in address_info:
1084+
binary_address = inet_pton(family, addr['sockaddr'][0])
1085+
addresses.append(binary_address)
1086+
1087+
return [{ 'family': family, 'address': addresses }]
10811088

10821089
def tlv_pack_local_addrinfo(sock):
10831090
local_host, local_port = sock.getsockname()[:2]
@@ -2641,9 +2648,18 @@ def stdapi_net_resolve_host(request, response):
26412648
family = socket.AF_INET6
26422649
else:
26432650
raise Exception('invalid family')
2651+
26442652
result = resolve_host(hostname, family)
2645-
response += tlv_pack(TLV_TYPE_IP, result['packed_address'])
2646-
response += tlv_pack(TLV_TYPE_ADDR_TYPE, result['family'])
2653+
2654+
for resolved_host in result:
2655+
host_tlv = bytes()
2656+
for ip in resolved_host['address']:
2657+
host_tlv += tlv_pack(TLV_TYPE_IP, ip)
2658+
host_tlv += tlv_pack(TLV_TYPE_ADDR_TYPE, family)
2659+
2660+
2661+
response += tlv_pack(TLV_TYPE_RESOLVE_HOST_ENTRY, host_tlv)
2662+
26472663
return ERROR_SUCCESS, response
26482664

26492665
@register_function
@@ -2661,8 +2677,13 @@ def stdapi_net_resolve_hosts(request, response):
26612677
result = resolve_host(hostname, family)
26622678
except socket.error:
26632679
result = {'family':family, 'packed_address':''}
2664-
response += tlv_pack(TLV_TYPE_IP, result['packed_address'])
2665-
response += tlv_pack(TLV_TYPE_ADDR_TYPE, result['family'])
2680+
for resolved_host in result:
2681+
host_tlv = bytes()
2682+
for ip in resolved_host['address']:
2683+
host_tlv += tlv_pack(TLV_TYPE_IP, ip)
2684+
host_tlv += tlv_pack(TLV_TYPE_ADDR_TYPE, family)
2685+
2686+
response += tlv_pack(TLV_TYPE_RESOLVE_HOST_ENTRY, host_tlv)
26662687
return ERROR_SUCCESS, response
26672688

26682689
@register_function

python/meterpreter/tests/test_ext_server_stdapi.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,24 @@ def test_stdapi_sys_config_getsid(self):
320320
).get("value")
321321
self.assertRegex(sid, "S-1-5-.*")
322322

323+
class ExtStdNetResolveTest(ExtServerStdApiTest):
324+
def stdapi_net_resolve_hosts(self):
325+
# Full request from msfconsole
326+
request = b'\x00\x00\x00\x0c\x00\x02\x00\x01\x00\x00\x04\x00\x00\x00\x00)\x00\x01\x00\x0264769531726942037539492283558475\x00\x00\x00\x00\x13\x00\x01\x05xrapid7.com\x00\x00\x00\x00\x0c\x00\x02\x05\xa4\x00\x00\x00\x02'
327+
response = bytes()
328+
_result_code, result_tlvs = self.assertMethodErrorSuccess(
329+
"stdapi_net_resolve_hosts", request, response
330+
)
331+
332+
print(response)
333+
334+
# TODO: Assert
335+
# user_name = self.meterpreter_context["packet_get_tlv"](
336+
# result_tlvs, self.ext_server_stdapi["TLV_TYPE_USER_NAME"]
337+
# ).get("value")
338+
#
339+
#self.assert(response, bytes('......'))
340+
323341

324342
if __name__ == "__main__":
325343
unittest.main()

0 commit comments

Comments
 (0)