Skip to content

Commit e55b612

Browse files
committed
Land rapid7#4482, @wchen-r7's fix for response_timeout on sessions command
2 parents 555713b + 9af3fd0 commit e55b612

File tree

1 file changed

+37
-21
lines changed
  • lib/msf/ui/console/command_dispatcher

1 file changed

+37
-21
lines changed

lib/msf/ui/console/command_dispatcher/core.rb

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1669,6 +1669,8 @@ def cmd_sessions(*args)
16691669
end
16701670
end
16711671

1672+
last_known_timeout = nil
1673+
16721674
# Now, perform the actual method
16731675
case method
16741676
when 'cmd'
@@ -1690,8 +1692,10 @@ def cmd_sessions(*args)
16901692
session = verify_session(s)
16911693
next unless session
16921694
print_status("Running '#{cmd}' on #{session.type} session #{s} (#{session.session_host})")
1693-
last_known_timeout = session.response_timeout
1694-
session.response_timeout = response_timeout
1695+
if session.respond_to?(:response_timeout)
1696+
last_known_timeout = session.response_timeout
1697+
session.response_timeout = response_timeout
1698+
end
16951699

16961700
begin
16971701
if session.type == 'meterpreter'
@@ -1722,7 +1726,7 @@ def cmd_sessions(*args)
17221726
end
17231727
ensure
17241728
# Restore timeout for each session
1725-
session.response_timeout = last_known_timeout
1729+
session.response_timeout = last_known_timeout if last_known_timeout
17261730
end
17271731
# If the session isn't a meterpreter or shell type, it
17281732
# could be a VNC session (which can't run commands) or
@@ -1735,13 +1739,15 @@ def cmd_sessions(*args)
17351739
session_list.each do |sess_id|
17361740
session = framework.sessions.get(sess_id)
17371741
if session
1738-
last_known_timeout = session.response_timeout
1739-
session.response_timeout = response_timeout
1742+
if session.respond_to?(:response_timeout)
1743+
last_known_timeout = session.response_timeout
1744+
session.response_timeout = response_timeout
1745+
end
17401746
print_status("Killing session #{sess_id}")
17411747
begin
17421748
session.kill
17431749
ensure
1744-
session.response_timeout = last_known_timeout
1750+
session.response_timeout = last_known_timeout if last_known_timeout
17451751
end
17461752
else
17471753
print_error("Invalid session identifier: #{sess_id}")
@@ -1752,12 +1758,14 @@ def cmd_sessions(*args)
17521758
framework.sessions.each_sorted do |s|
17531759
session = framework.sessions.get(s)
17541760
if session
1755-
last_known_timeout = session.response_timeout
1756-
session.response_timeout = response_timeout
1761+
if session.respond_to?(:response_timeout)
1762+
last_known_timeout = session.response_timeout
1763+
session.response_timeout = response_timeout
1764+
end
17571765
begin
17581766
session.kill
17591767
ensure
1760-
session.response_timeout = last_known_timeout
1768+
session.response_timeout = last_known_timeout if last_known_timeout
17611769
end
17621770
end
17631771
end
@@ -1767,29 +1775,33 @@ def cmd_sessions(*args)
17671775
session = verify_session(sess_id)
17681776
# if session is interactive, it's detachable
17691777
if session
1770-
last_known_timeout = session.response_timeout
1771-
session.response_timeout = response_timeout
1778+
if session.respond_to?(:response_timeout)
1779+
last_known_timeout = session.response_timeout
1780+
session.response_timeout = response_timeout
1781+
end
17721782
print_status("Detaching session #{sess_id}")
17731783
begin
17741784
session.detach
17751785
ensure
1776-
session.response_timeout = last_known_timeout
1786+
session.response_timeout = last_known_timeout if last_known_timeout
17771787
end
17781788
end
17791789
end
17801790
when 'interact'
17811791
session = verify_session(sid)
17821792
if session
1783-
last_known_timeout = session.response_timeout
1784-
session.response_timeout = response_timeout
1793+
if session.respond_to?(:response_timeout)
1794+
last_known_timeout = session.response_timeout
1795+
session.response_timeout = response_timeout
1796+
end
17851797
print_status("Starting interaction with #{session.name}...\n") unless quiet
17861798
begin
17871799
self.active_session = session
17881800
session.interact(driver.input.dup, driver.output)
17891801
self.active_session = nil
17901802
driver.input.reset_tab_completion if driver.input.supports_readline
17911803
ensure
1792-
session.response_timeout = last_known_timeout
1804+
session.response_timeout = last_known_timeout if last_known_timeout
17931805
end
17941806
end
17951807
when 'scriptall'
@@ -1811,8 +1823,10 @@ def cmd_sessions(*args)
18111823
session = framework.sessions.get(sess_id)
18121824
end
18131825
if session
1814-
last_known_timeout = session.response_timeout
1815-
session.response_timeout = response_timeout
1826+
if session.respond_to?(:response_timeout)
1827+
last_known_timeout = session.response_timeout
1828+
session.response_timeout = response_timeout
1829+
end
18161830
begin
18171831
if script_paths[session.type]
18181832
print_status("Session #{sess_id} (#{session.session_host}):")
@@ -1825,7 +1839,7 @@ def cmd_sessions(*args)
18251839
end
18261840
end
18271841
ensure
1828-
session.response_timeout = last_known_timeout
1842+
session.response_timeout = last_known_timeout if last_known_timeout
18291843
end
18301844
else
18311845
print_error("Invalid session identifier: #{sess_id}")
@@ -1837,8 +1851,10 @@ def cmd_sessions(*args)
18371851
session_list.each do |sess_id|
18381852
session = verify_session(sess_id)
18391853
if session
1840-
last_known_timeout = session.response_timeout
1841-
session.response_timeout = response_timeout
1854+
if session.respond_to?(:response_timeout)
1855+
last_known_timeout = session.response_timeout
1856+
session.response_timeout = response_timeout
1857+
end
18421858
begin
18431859
if session.type == 'shell'
18441860
session.init_ui(driver.input, driver.output)
@@ -1849,7 +1865,7 @@ def cmd_sessions(*args)
18491865
next
18501866
end
18511867
ensure
1852-
session.response_timeout = last_known_timeout
1868+
session.response_timeout = last_known_timeout if last_known_timeout
18531869
end
18541870
end
18551871

0 commit comments

Comments
 (0)