Skip to content

Commit 2d46c06

Browse files
David MaloneyDavid Maloney
authored andcommitted
Merge branch 'master' into feature/MSP-12244/postgres-pass-the-hash
2 parents dee2e84 + b21439a commit 2d46c06

File tree

34 files changed

+4857
-1425
lines changed

34 files changed

+4857
-1425
lines changed

data/meterpreter/ext_server_stdapi.py

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,10 +1334,12 @@ def stdapi_net_socket_tcp_shutdown(request, response):
13341334
channel.shutdown(how)
13351335
return ERROR_SUCCESS, response
13361336

1337+
def _wreg_close_key(hkey):
1338+
ctypes.windll.advapi32.RegCloseKey(hkey)
1339+
13371340
@meterpreter.register_function_windll
13381341
def stdapi_registry_close_key(request, response):
1339-
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
1340-
result = ctypes.windll.advapi32.RegCloseKey(hkey)
1342+
_wreg_close_key(packet_get_tlv(request, TLV_TYPE_HKEY)['value'])
13411343
return ERROR_SUCCESS, response
13421344

13431345
@meterpreter.register_function_windll
@@ -1372,11 +1374,9 @@ def stdapi_registry_delete_value(request, response):
13721374
result = ctypes.windll.advapi32.RegDeleteValueA(root_key, ctypes.byref(value_name))
13731375
return result, response
13741376

1375-
@meterpreter.register_function_windll
1376-
def stdapi_registry_enum_key(request, response):
1377+
def _wreg_enum_key(request, response, hkey):
13771378
ERROR_MORE_DATA = 0xea
13781379
ERROR_NO_MORE_ITEMS = 0x0103
1379-
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
13801380
name = (ctypes.c_char * 4096)()
13811381
index = 0
13821382
tries = 0
@@ -1399,10 +1399,22 @@ def stdapi_registry_enum_key(request, response):
13991399
return result, response
14001400

14011401
@meterpreter.register_function_windll
1402-
def stdapi_registry_enum_value(request, response):
1402+
def stdapi_registry_enum_key(request, response):
1403+
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
1404+
return _wreg_enum_key(request, response, hkey)
1405+
1406+
@meterpreter.register_function_windll
1407+
def stdapi_registry_enum_key_direct(request, response):
1408+
err, hkey = _wreg_open_key(request)
1409+
if err != ERROR_SUCCESS:
1410+
return err, response
1411+
ret = _wreg_enum_key(request, response, hkey)
1412+
_wreg_close_key(hkey)
1413+
return ret
1414+
1415+
def _wreg_enum_value(request, response, hkey):
14031416
ERROR_MORE_DATA = 0xea
14041417
ERROR_NO_MORE_ITEMS = 0x0103
1405-
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
14061418
name = (ctypes.c_char * 4096)()
14071419
name_sz = ctypes.c_uint32()
14081420
index = 0
@@ -1426,6 +1438,20 @@ def stdapi_registry_enum_value(request, response):
14261438
index += 1
14271439
return result, response
14281440

1441+
@meterpreter.register_function_windll
1442+
def stdapi_registry_enum_value(request, response):
1443+
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
1444+
return _wreg_enum_value(request, response, hkey)
1445+
1446+
@meterpreter.register_function_windll
1447+
def stdapi_registry_enum_value_direct(request, response):
1448+
err, hkey = _wreg_open_key(request)
1449+
if err != ERROR_SUCCESS:
1450+
return err, response
1451+
ret = _wreg_enum_value(request, response, hkey)
1452+
_wreg_close_key(hkey)
1453+
return ret
1454+
14291455
@meterpreter.register_function_windll
14301456
def stdapi_registry_load_key(request, response):
14311457
root_key = packet_get_tlv(request, TLV_TYPE_ROOT_KEY)
@@ -1434,16 +1460,22 @@ def stdapi_registry_load_key(request, response):
14341460
result = ctypes.windll.advapi32.RegLoadKeyA(root_key, sub_key, file_name)
14351461
return result, response
14361462

1437-
@meterpreter.register_function_windll
1438-
def stdapi_registry_open_key(request, response):
1463+
def _wreg_open_key(request):
14391464
root_key = packet_get_tlv(request, TLV_TYPE_ROOT_KEY)['value']
14401465
base_key = packet_get_tlv(request, TLV_TYPE_BASE_KEY)['value']
14411466
base_key = ctypes.create_string_buffer(bytes(base_key, 'UTF-8'))
14421467
permission = packet_get_tlv(request, TLV_TYPE_PERMISSION).get('value', winreg.KEY_ALL_ACCESS)
14431468
handle_id = ctypes.c_void_p()
14441469
if ctypes.windll.advapi32.RegOpenKeyExA(root_key, ctypes.byref(base_key), 0, permission, ctypes.byref(handle_id)) != ERROR_SUCCESS:
1445-
return error_result_windows(), response
1446-
response += tlv_pack(TLV_TYPE_HKEY, handle_id.value)
1470+
return error_result_windows(), 0
1471+
return ERROR_SUCCESS, handle_id.value
1472+
1473+
@meterpreter.register_function_windll
1474+
def stdapi_registry_open_key(request, response):
1475+
err, hkey = _wreg_open_key(request)
1476+
if err != ERROR_SUCCESS:
1477+
return err, response
1478+
response += tlv_pack(TLV_TYPE_HKEY, hkey)
14471479
return ERROR_SUCCESS, response
14481480

14491481
@meterpreter.register_function_windll
@@ -1467,9 +1499,7 @@ def stdapi_registry_query_class(request, response):
14671499
response += tlv_pack(TLV_TYPE_VALUE_DATA, ctypes.string_at(value_data))
14681500
return ERROR_SUCCESS, response
14691501

1470-
@meterpreter.register_function_windll
1471-
def stdapi_registry_query_value(request, response):
1472-
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
1502+
def _query_value(request, response, hkey):
14731503
value_name = packet_get_tlv(request, TLV_TYPE_VALUE_NAME)['value']
14741504
value_name = ctypes.create_string_buffer(bytes(value_name, 'UTF-8'))
14751505
value_type = ctypes.c_uint32()
@@ -1496,15 +1526,41 @@ def stdapi_registry_query_value(request, response):
14961526
return error_result_windows(), response
14971527

14981528
@meterpreter.register_function_windll
1499-
def stdapi_registry_set_value(request, response):
1529+
def stdapi_registry_query_value(request, response):
15001530
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
1531+
return _query_value(request, response, hkey)
1532+
1533+
@meterpreter.register_function_windll
1534+
def stdapi_registry_query_value_direct(request, response):
1535+
err, hkey = _wreg_open_key(request)
1536+
if err != ERROR_SUCCESS:
1537+
return err, response
1538+
ret = _query_value(request, response, hkey)
1539+
_wreg_close_key(hkey)
1540+
return ret
1541+
1542+
def _set_value(request, response, hkey):
15011543
value_name = packet_get_tlv(request, TLV_TYPE_VALUE_NAME)['value']
15021544
value_name = ctypes.create_string_buffer(bytes(value_name, 'UTF-8'))
15031545
value_type = packet_get_tlv(request, TLV_TYPE_VALUE_TYPE)['value']
15041546
value_data = packet_get_tlv(request, TLV_TYPE_VALUE_DATA)['value']
15051547
result = ctypes.windll.advapi32.RegSetValueExA(hkey, ctypes.byref(value_name), 0, value_type, value_data, len(value_data))
15061548
return result, response
15071549

1550+
@meterpreter.register_function_windll
1551+
def stdapi_registry_set_value(request, response):
1552+
hkey = packet_get_tlv(request, TLV_TYPE_HKEY)['value']
1553+
return _set_value(request, response, hkey)
1554+
1555+
@meterpreter.register_function_windll
1556+
def stdapi_registry_set_value_direct(request, response):
1557+
err, hkey = _wreg_open_key(request)
1558+
if err != ERROR_SUCCESS:
1559+
return err, response
1560+
ret = _set_value(request, response, hkey)
1561+
_wreg_close_key(hkey)
1562+
return ret
1563+
15081564
@meterpreter.register_function_windll
15091565
def stdapi_registry_unload_key(request, response):
15101566
root_key = packet_get_tlv(request, TLV_TYPE_ROOT_KEY)['value']

lib/msf/core/exploit/mixins.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
require 'msf/core/exploit/smb/client/authenticated'
3333
require 'msf/core/exploit/smb/client/psexec'
3434
require 'msf/core/exploit/smb/server'
35+
require 'msf/core/exploit/smb/server/share'
3536
require 'msf/core/exploit/ftp'
3637
require 'msf/core/exploit/tftp'
3738
require 'msf/core/exploit/telnet'

lib/msf/core/exploit/smb/server.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,18 @@ def smb_error(cmd, c, errorclass, esn = false)
133133
pkt = CONST::SMB_BASE_PKT.make_struct
134134
smb_set_defaults(c, pkt)
135135
pkt['Payload']['SMB'].v['Command'] = cmd
136-
pkt['Payload']['SMB'].v['Flags1'] = 0x88
136+
pkt['Payload']['SMB'].v['Flags1'] = CONST::FLAGS_REQ_RES | CONST::FLAGS_CASE_SENSITIVE
137137
if esn
138-
pkt['Payload']['SMB'].v['Flags2'] = 0xc801
138+
pkt['Payload']['SMB'].v['Flags2'] =
139+
CONST::FLAGS2_UNICODE_STRINGS +
140+
CONST::FLAGS2_EXTENDED_SECURITY +
141+
CONST::FLAGS2_32_BIT_ERROR_CODES +
142+
CONST::FLAGS2_LONG_PATH_COMPONENTS
139143
else
140-
pkt['Payload']['SMB'].v['Flags2'] = 0xc001
144+
pkt['Payload']['SMB'].v['Flags2'] =
145+
CONST::FLAGS2_UNICODE_STRINGS +
146+
CONST::FLAGS2_32_BIT_ERROR_CODES +
147+
CONST::FLAGS2_LONG_PATH_COMPONENTS
141148
end
142149
pkt['Payload']['SMB'].v['ErrorClass'] = errorclass
143150
c.put(pkt.to_s)

0 commit comments

Comments
 (0)