@@ -797,7 +797,11 @@ def cmd_jobs(*args)
797
797
798
798
# Terminate the supplied job ID(s)
799
799
when "-k"
800
- job_list = build_jobs_array ( val )
800
+ job_list = build_range_array ( val )
801
+ if job_list . blank?
802
+ print_error ( "Please specify valid job identifier(s)" )
803
+ return false
804
+ end
801
805
print_status ( "Stopping the following job(s): #{ job_list . join ( ', ' ) } " )
802
806
job_list . map ( &:to_s ) . each do |job |
803
807
if framework . jobs . has_key? ( job )
@@ -1615,10 +1619,6 @@ def cmd_sessions(*args)
1615
1619
when "-k"
1616
1620
method = 'kill'
1617
1621
sid = val if val
1618
- if not sid
1619
- print_error ( "Specify a session to kill" )
1620
- return false
1621
- end
1622
1622
1623
1623
when "-K"
1624
1624
method = 'killall'
@@ -1653,15 +1653,18 @@ def cmd_sessions(*args)
1653
1653
end
1654
1654
}
1655
1655
1656
- if sid and not framework . sessions . get ( sid )
1657
- print_error ( "Invalid session id" )
1658
- return false
1659
- end
1660
-
1661
1656
if method . nil? and sid
1662
1657
method = 'interact'
1663
1658
end
1664
1659
1660
+ unless sid . blank? || method == 'interact'
1661
+ session_list = build_range_array ( sid )
1662
+ if session_list . blank?
1663
+ print_error ( "Please specify valid session identifier(s)" )
1664
+ return false
1665
+ end
1666
+ end
1667
+
1665
1668
# Now, perform the actual method
1666
1669
case method
1667
1670
@@ -1672,7 +1675,7 @@ def cmd_sessions(*args)
1672
1675
end
1673
1676
cmds . each do |cmd |
1674
1677
if sid
1675
- sessions = [ sid ]
1678
+ sessions = session_list
1676
1679
else
1677
1680
sessions = framework . sessions . keys . sort
1678
1681
end
@@ -1712,7 +1715,6 @@ def cmd_sessions(*args)
1712
1715
end
1713
1716
1714
1717
when 'kill'
1715
- session_list = build_sessions_array ( sid )
1716
1718
print_status ( "Killing the following session(s): #{ session_list . join ( ', ' ) } " )
1717
1719
session_list . each do |sess |
1718
1720
session = framework . sessions . get ( sess )
@@ -1727,27 +1729,30 @@ def cmd_sessions(*args)
1727
1729
when 'killall'
1728
1730
print_status ( "Killing all sessions..." )
1729
1731
framework . sessions . each_sorted do |s |
1730
- if ( ( session = framework . sessions . get ( s ) ) )
1731
- session . kill
1732
- end
1732
+ session = framework . sessions . get ( s )
1733
+ session . kill if session
1733
1734
end
1734
1735
1735
1736
when 'detach'
1736
- session_list = build_sessions_array ( sid )
1737
1737
print_status ( "Detaching the following session(s): #{ session_list . join ( ', ' ) } " )
1738
1738
session_list . each do |sess |
1739
1739
session = framework . sessions . get ( sess )
1740
- if session
1740
+ if session && session . interactive?
1741
1741
print_status ( "Detaching session #{ sess } " )
1742
- session . detach
1742
+ begin
1743
+ session . detach
1744
+ rescue NoMethodError
1745
+ print_error "#{ sess } is not detachable"
1746
+ end
1743
1747
else
1744
1748
print_error ( "Invalid session identifier: #{ sess } " )
1745
1749
end
1746
1750
end
1747
1751
1748
1752
when 'interact'
1749
- if ( ( session = framework . sessions . get ( sid ) ) )
1750
- if ( session . interactive? )
1753
+ session = framework . sessions . get ( sid )
1754
+ if session
1755
+ if session . interactive?
1751
1756
print_status ( "Starting interaction with #{ session . name } ...\n " ) if ( quiet == false )
1752
1757
1753
1758
self . active_session = session
@@ -1756,7 +1761,7 @@ def cmd_sessions(*args)
1756
1761
1757
1762
self . active_session = nil
1758
1763
1759
- if ( driver . input . supports_readline )
1764
+ if driver . input . supports_readline
1760
1765
driver . input . reset_tab_completion
1761
1766
end
1762
1767
@@ -1768,7 +1773,7 @@ def cmd_sessions(*args)
1768
1773
end
1769
1774
1770
1775
when 'scriptall'
1771
- if ( script . nil? )
1776
+ if script . nil?
1772
1777
print_error ( "No script specified!" )
1773
1778
return false
1774
1779
end
@@ -1778,17 +1783,16 @@ def cmd_sessions(*args)
1778
1783
script_paths [ 'shell' ] = Msf ::Sessions ::CommandShell . find_script_path ( script )
1779
1784
1780
1785
if sid
1781
- print_status ( "Running script #{ script } on session #{ sid } ..." )
1782
- sessions = [ sid ]
1786
+ sessions = session_list
1783
1787
else
1784
- print_status ( "Running script #{ script } on all sessions..." )
1785
1788
sessions = framework . sessions . keys . sort
1786
1789
end
1787
-
1788
1790
sessions . each do |s |
1789
- if ( ( session = framework . sessions . get ( s ) ) )
1790
- if ( script_paths [ session . type ] )
1791
+ session = framework . sessions . get ( s )
1792
+ if session
1793
+ if script_paths [ session . type ]
1791
1794
print_status ( "Session #{ s } (#{ session . session_host } ):" )
1795
+ print_status ( "Running script #{ script } on #{ session . type } session #{ s } (#{ session . session_host } )" )
1792
1796
begin
1793
1797
session . execute_file ( script_paths [ session . type ] , extra )
1794
1798
rescue ::Exception => e
@@ -1799,12 +1803,12 @@ def cmd_sessions(*args)
1799
1803
end
1800
1804
1801
1805
when 'upexec'
1802
- session_list = build_sessions_array ( sid )
1803
1806
print_status ( "Executing 'post/multi/manage/shell_to_meterpreter' on session(s): #{ session_list } " )
1804
1807
session_list . each do |sess |
1805
- if ( ( session = framework . sessions . get ( sess ) ) )
1806
- if ( session . interactive? )
1807
- if ( session . type == "shell" )
1808
+ session = framework . sessions . get ( sess )
1809
+ if session
1810
+ if session . interactive?
1811
+ if session . type == "shell"
1808
1812
session . init_ui ( driver . input , driver . output )
1809
1813
session . execute_script ( 'post/multi/manage/shell_to_meterpreter' )
1810
1814
session . reset_ui
@@ -3367,44 +3371,29 @@ def retrieve_grep_lines(all_lines,line_num, before = nil, after = nil)
3367
3371
return all_lines . slice ( start ..finish )
3368
3372
end
3369
3373
3370
- # Generate an array of session IDs when presented with input such as '1' or '1,2,4-6,10' or '1,2,4..6,10'
3371
- def build_sessions_array ( sid_list )
3372
- session_list = Array . new
3373
- temp_list = sid_list . split ( "," )
3374
+ # Generate an array of job or session IDs when presented with input such as '1' or '1,2,4-6,10' or '1,2,4..6,10'
3375
+ def build_range_array ( id_list )
3376
+ return if id_list . blank?
3377
+ item_list = [ ]
3378
+ temp_list = id_list . split ( "," )
3374
3379
3375
3380
temp_list . each do |ele |
3376
- if ele . include? '-'
3377
- temp_array = ( ele . split ( "-" ) . inject { |s , e | s . to_i ..e . to_i } ) . to_a
3378
- session_list . concat ( temp_array )
3379
- elsif ele . include? '..'
3380
- temp_array = ( ele . split ( ".." ) . inject { |s , e | s . to_i ..e . to_i } ) . to_a
3381
- session_list . concat ( temp_array )
3382
- else
3383
- session_list . push ( ele . to_i )
3384
- end
3385
- end
3381
+ return if ele . count ( '-' ) > 1
3382
+ return if ele [ 0 ] == '-' || ele [ -1 ] == '-'
3383
+ return if ele [ 0 ] == '.' || ele [ -1 ] == '.'
3386
3384
3387
- return session_list . uniq . sort
3388
- end
3389
-
3390
- # Generate an array of job IDs when presented with input such as '1' or '1,2,4-6,10' or '1,2,4..6,10'
3391
- def build_jobs_array ( jid_list )
3392
- job_list = Array . new
3393
- temp_list = jid_list . split ( "," )
3394
-
3395
- temp_list . each do |ele |
3396
3385
if ele . include? '-'
3397
- temp_array = ( ele . split ( "-" ) . inject { |s , e | s . to_i ..e . to_i } ) . to_a
3398
- job_list . concat ( temp_array )
3386
+ temp_array = ( ele . split ( "-" ) . inject { |s , e | s . to_i ..e . to_i } ) . to_a
3387
+ item_list . concat ( temp_array )
3399
3388
elsif ele . include? '..'
3400
- temp_array = ( ele . split ( ".." ) . inject { |s , e | s . to_i ..e . to_i } ) . to_a
3401
- job_list . concat ( temp_array )
3389
+ temp_array = ( ele . split ( ".." ) . inject { |s , e | s . to_i ..e . to_i } ) . to_a
3390
+ item_list . concat ( temp_array )
3402
3391
else
3403
- job_list . push ( ele . to_i )
3392
+ item_list . push ( ele . to_i )
3404
3393
end
3405
3394
end
3406
3395
3407
- return job_list . uniq . sort
3396
+ item_list . uniq . sort
3408
3397
end
3409
3398
3410
3399
end
0 commit comments