msfrpc-client 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +25 -25
- data/examples/msfrpc_irb.rb +1 -2
- data/examples/msfrpc_pro_discover.rb +207 -0
- data/examples/msfrpc_pro_exploit.rb +225 -0
- data/examples/msfrpc_pro_import.rb +91 -0
- data/examples/msfrpc_pro_nexpose.rb +148 -0
- data/examples/msfrpc_pro_report.rb +70 -70
- data/lib/msfrpc-client/client.rb +290 -204
- data/lib/msfrpc-client/constants.rb +30 -32
- data/lib/msfrpc-client/version.rb +1 -1
- data/msfrpc-client.gemspec +5 -5
- metadata +27 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eae20060bcf4dfb1bdbfa1fc3f530ed7a7421e8b
|
4
|
+
data.tar.gz: d07865830b68e642d3b4d90a3a91da825050eea7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af9827831127544c74d2ffdad8f2d7f5b3dda6e8f9ca42e0a2635d147b0ef886eb68ed188afde445ef3afa36d575256da07798c087470f7252f6efaa94e64a77
|
7
|
+
data.tar.gz: 9aa9459aab5fc8bdb85ef015641688f7f3b91c3c8383cc4ad50dc2000fb7420dc4a122b7da449594a804c62a6596e47d5e692c7d50d68d0288bf324462768090
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.4.
|
1
|
+
2.4.1
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
msfrpc-client (1.1.
|
5
|
-
msgpack
|
6
|
-
rex
|
4
|
+
msfrpc-client (1.1.1)
|
5
|
+
msgpack (~> 1)
|
6
|
+
rex (~> 2)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
@@ -12,46 +12,46 @@ GEM
|
|
12
12
|
filesize (0.1.1)
|
13
13
|
jsobfu (0.4.2)
|
14
14
|
rkelly-remix
|
15
|
-
json (2.0
|
15
|
+
json (2.1.0)
|
16
16
|
metasm (1.0.3)
|
17
|
-
mini_portile2 (2.
|
17
|
+
mini_portile2 (2.2.0)
|
18
18
|
msgpack (1.1.0)
|
19
|
-
nokogiri (1.
|
20
|
-
mini_portile2 (~> 2.
|
19
|
+
nokogiri (1.8.0)
|
20
|
+
mini_portile2 (~> 2.2.0)
|
21
21
|
rake (12.0.0)
|
22
|
-
rb-readline
|
23
|
-
rex (2.0.
|
22
|
+
rb-readline (0.5.4)
|
23
|
+
rex (2.0.11)
|
24
24
|
filesize
|
25
25
|
jsobfu (~> 0.4.1)
|
26
26
|
json
|
27
27
|
metasm (~> 1.0.2)
|
28
28
|
nokogiri
|
29
|
-
rb-readline
|
29
|
+
rb-readline
|
30
30
|
robots
|
31
31
|
rkelly-remix (0.0.7)
|
32
32
|
robots (0.10.1)
|
33
|
-
rspec (3.
|
34
|
-
rspec-core (~> 3.
|
35
|
-
rspec-expectations (~> 3.
|
36
|
-
rspec-mocks (~> 3.
|
37
|
-
rspec-core (3.
|
38
|
-
rspec-support (~> 3.
|
39
|
-
rspec-expectations (3.
|
33
|
+
rspec (3.6.0)
|
34
|
+
rspec-core (~> 3.6.0)
|
35
|
+
rspec-expectations (~> 3.6.0)
|
36
|
+
rspec-mocks (~> 3.6.0)
|
37
|
+
rspec-core (3.6.0)
|
38
|
+
rspec-support (~> 3.6.0)
|
39
|
+
rspec-expectations (3.6.0)
|
40
40
|
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
-
rspec-support (~> 3.
|
42
|
-
rspec-mocks (3.
|
41
|
+
rspec-support (~> 3.6.0)
|
42
|
+
rspec-mocks (3.6.0)
|
43
43
|
diff-lcs (>= 1.2.0, < 2.0)
|
44
|
-
rspec-support (~> 3.
|
45
|
-
rspec-support (3.
|
44
|
+
rspec-support (~> 3.6.0)
|
45
|
+
rspec-support (3.6.0)
|
46
46
|
|
47
47
|
PLATFORMS
|
48
48
|
ruby
|
49
49
|
|
50
50
|
DEPENDENCIES
|
51
|
-
bundler
|
51
|
+
bundler (~> 1)
|
52
52
|
msfrpc-client!
|
53
|
-
rake
|
54
|
-
rspec
|
53
|
+
rake (~> 12)
|
54
|
+
rspec (~> 3)
|
55
55
|
|
56
56
|
BUNDLED WITH
|
57
|
-
1.
|
57
|
+
1.15.1
|
data/examples/msfrpc_irb.rb
CHANGED
@@ -19,9 +19,8 @@ rpc = Msf::RPC::Client.new(opts)
|
|
19
19
|
|
20
20
|
$stdout.puts "[*] The RPC client is available in variable 'rpc'"
|
21
21
|
if rpc.token
|
22
|
-
|
22
|
+
$stdout.puts "[*] Sucessfully authenticated to the server"
|
23
23
|
end
|
24
24
|
|
25
25
|
$stdout.puts "[*] Starting IRB shell..."
|
26
26
|
Rex::Ui::Text::IrbShell.new(binding).run
|
27
|
-
|
@@ -0,0 +1,207 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'optparse'
|
4
|
+
require 'msfrpc-client'
|
5
|
+
require 'rex/ui'
|
6
|
+
|
7
|
+
def usage(ropts)
|
8
|
+
$stderr.puts ropts
|
9
|
+
|
10
|
+
if @rpc and @rpc.token
|
11
|
+
wspaces = @rpc.call("pro.workspaces") rescue {}
|
12
|
+
if wspaces.keys.length > 0
|
13
|
+
$stderr.puts "Active Projects:"
|
14
|
+
wspaces.each_pair do |k,v|
|
15
|
+
$stderr.puts "\t#{k}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
$stderr.puts ""
|
20
|
+
exit(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
opts = {}
|
24
|
+
|
25
|
+
# Parse script-specific options
|
26
|
+
parser = Msf::RPC::Client.option_parser(opts)
|
27
|
+
parser.separator('Discover Mandatory Options:')
|
28
|
+
|
29
|
+
parser.on("--project PROJECT") do |x|
|
30
|
+
opts[:project] = x
|
31
|
+
end
|
32
|
+
|
33
|
+
parser.on("--targets TARGETS") do |x|
|
34
|
+
opts[:targets] = [x]
|
35
|
+
end
|
36
|
+
|
37
|
+
parser.on("--blacklist BLACKLIST (optional)") do |x|
|
38
|
+
opts[:blacklist] = x
|
39
|
+
end
|
40
|
+
|
41
|
+
parser.on("--speed SPEED (optional)") do |x|
|
42
|
+
opts[:speed] = x
|
43
|
+
end
|
44
|
+
|
45
|
+
parser.on("--extra-ports PORTS (optional)") do |x|
|
46
|
+
opts[:extra_ports] = x
|
47
|
+
end
|
48
|
+
|
49
|
+
parser.on("--blacklist-ports PORTS (optional)") do |x|
|
50
|
+
opts[:blacklist_ports] = x
|
51
|
+
end
|
52
|
+
|
53
|
+
parser.on("--custom-ports PORTS (optional)") do |x|
|
54
|
+
opts[:custom_ports] = x
|
55
|
+
end
|
56
|
+
|
57
|
+
parser.on("--portscan-timeout TIMEOUT (optional)") do |x|
|
58
|
+
opts[:portscan_timeout] = x
|
59
|
+
end
|
60
|
+
|
61
|
+
parser.on("--source-port PORT (optional)") do |x|
|
62
|
+
opts[:source_port] = x
|
63
|
+
end
|
64
|
+
|
65
|
+
parser.on("--custom-nmap-options OPTIONS (optional)") do |x|
|
66
|
+
opts[:custom_nmap_options] = x
|
67
|
+
end
|
68
|
+
|
69
|
+
parser.on("--disable-udp-probes (optional)") do
|
70
|
+
opts[:disable_udp_probes] = true
|
71
|
+
end
|
72
|
+
|
73
|
+
parser.on("--disable-finger-users (optional)") do
|
74
|
+
opts[:disable_finger_users] = true
|
75
|
+
end
|
76
|
+
|
77
|
+
parser.on("--disable-snmp-scan (optional)") do
|
78
|
+
opts[:disable_snmp_scan] = true
|
79
|
+
end
|
80
|
+
|
81
|
+
parser.on("--disable-service-identification (optional)") do
|
82
|
+
opts[:disable_service_identification] = true
|
83
|
+
end
|
84
|
+
|
85
|
+
parser.on("--smb-user USER (optional)") do |x|
|
86
|
+
opts[:smb_user] = x
|
87
|
+
end
|
88
|
+
|
89
|
+
parser.on("--smb-pass PASS (optional)") do |x|
|
90
|
+
opts[:smb_pass] = x
|
91
|
+
end
|
92
|
+
|
93
|
+
parser.on("--smb-domain DOMAIN (optional)") do |x|
|
94
|
+
opts[:smb_domain] = x
|
95
|
+
end
|
96
|
+
|
97
|
+
parser.on("--dry-run (optional)") do
|
98
|
+
opts[:dry_run] = true
|
99
|
+
end
|
100
|
+
|
101
|
+
parser.on("--single-scan (optional)") do
|
102
|
+
opts[:single_scan] = true
|
103
|
+
end
|
104
|
+
|
105
|
+
parser.on("--fast-detect (optional)") do
|
106
|
+
opts[:fast_detect] = true
|
107
|
+
end
|
108
|
+
|
109
|
+
parser.on("--help") do
|
110
|
+
$stderr.puts parser
|
111
|
+
exit(1)
|
112
|
+
end
|
113
|
+
|
114
|
+
parser.separator('')
|
115
|
+
parser.parse!(ARGV)
|
116
|
+
|
117
|
+
@rpc = Msf::RPC::Client.new(opts)
|
118
|
+
|
119
|
+
if not @rpc.token
|
120
|
+
$stderr.puts "Error: Invalid RPC server options specified"
|
121
|
+
$stderr.puts parser
|
122
|
+
exit(1)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Provide default values for certain options - If there's no alternative set
|
126
|
+
# use the default provided by Pro -- see the documentation.
|
127
|
+
project = opts[:project] || usage(parser)
|
128
|
+
targets = opts[:targets] || usage(parser)
|
129
|
+
blacklist = opts[:blacklist]
|
130
|
+
speed = opts[:speed] || "5"
|
131
|
+
extra_ports = opts[:extra_ports]
|
132
|
+
blacklist_ports = opts[:blacklist_ports]
|
133
|
+
custom_ports = opts[:custom_ports]
|
134
|
+
portscan_timeout = opts[:portscan_timeout] || 300
|
135
|
+
source_port = opts[:source_port]
|
136
|
+
custom_nmap_options = opts[:custom_nmap_options] ||
|
137
|
+
disable_udp_probes = opts[:disable_udp_probes] || false
|
138
|
+
disable_finger_users = opts[:disable_finger_users] || false
|
139
|
+
disable_snmp_scan = opts[:disable_snmp_scan] || false
|
140
|
+
disable_service_identification = opts[:disable_service_identification] || false
|
141
|
+
smb_user = opts[:smb_user] || ""
|
142
|
+
smb_pass = opts[:smb_pass] || ""
|
143
|
+
smb_domain = opts[:smb_domain] || ""
|
144
|
+
single_scan = opts[:single_scan] || false
|
145
|
+
fast_detect = opts[:fast_detect] || false
|
146
|
+
|
147
|
+
# Get the default user from Pro
|
148
|
+
user = @rpc.call("pro.default_admin_user")['username']
|
149
|
+
|
150
|
+
# Create the task object with all options
|
151
|
+
task = @rpc.call("pro.start_discover", {
|
152
|
+
'workspace' => project,
|
153
|
+
'username' => user,
|
154
|
+
'ips' => targets,
|
155
|
+
'DS_BLACKLIST_HOSTS' => blacklist,
|
156
|
+
'DS_PORTSCAN_SPEED' => speed,
|
157
|
+
'DS_PORTS_EXTRA' => extra_ports,
|
158
|
+
'DS_PORTS_BLACKLIST' => blacklist_ports,
|
159
|
+
'DS_PORTS_CUSTOM' => custom_ports,
|
160
|
+
'DS_PORTSCAN_TIMEOUT' => portscan_timeout,
|
161
|
+
'DS_PORTSCAN_SOURCE_PORT' => source_port,
|
162
|
+
'DS_CustomNmap' => custom_nmap_options,
|
163
|
+
'DS_UDP_PROBES' => disable_udp_probes,
|
164
|
+
'DS_FINGER_USERS' => disable_finger_users,
|
165
|
+
'DS_SNMP_SCAN' => disable_snmp_scan,
|
166
|
+
'DS_IDENTIFY_SERVICES' => disable_service_identification,
|
167
|
+
'DS_SMBUser' => smb_user,
|
168
|
+
'DS_SMBPass' => smb_pass,
|
169
|
+
'DS_SMBDomain' => smb_domain,
|
170
|
+
'DS_SINGLE_SCAN' => single_scan,
|
171
|
+
'DS_FAST_DETECT' => fast_detect
|
172
|
+
})
|
173
|
+
|
174
|
+
puts "DEBUG: Running task with #{task.inspect}"
|
175
|
+
|
176
|
+
if not task['task_id']
|
177
|
+
$stderr.puts "[-] Error starting the task: #{task.inspect}"
|
178
|
+
exit(0)
|
179
|
+
end
|
180
|
+
|
181
|
+
puts "[*] Creating Task ID #{task['task_id']}..."
|
182
|
+
while true
|
183
|
+
select(nil, nil, nil, 0.50)
|
184
|
+
|
185
|
+
stat = @rpc.call("pro.task_status", task['task_id'])
|
186
|
+
|
187
|
+
if stat['status'] == 'invalid'
|
188
|
+
$stderr.puts "[-] Error checking task status"
|
189
|
+
exit(0)
|
190
|
+
end
|
191
|
+
|
192
|
+
info = stat[ task['task_id'] ]
|
193
|
+
|
194
|
+
if not info
|
195
|
+
$stderr.puts "[-] Error finding the task"
|
196
|
+
exit(0)
|
197
|
+
end
|
198
|
+
|
199
|
+
if info['status'] == "error"
|
200
|
+
$stderr.puts "[-] Error generating report: #{info['error']}"
|
201
|
+
exit(0)
|
202
|
+
end
|
203
|
+
|
204
|
+
break if info['progress'] == 100
|
205
|
+
end
|
206
|
+
|
207
|
+
$stdout.puts "[+] Task Complete!"
|
@@ -0,0 +1,225 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'optparse'
|
4
|
+
require 'msfrpc-client'
|
5
|
+
require 'rex/ui'
|
6
|
+
|
7
|
+
def usage(ropts)
|
8
|
+
$stderr.puts ropts
|
9
|
+
|
10
|
+
if @rpc and @rpc.token
|
11
|
+
wspaces = @rpc.call("pro.workspaces") rescue {}
|
12
|
+
if wspaces.keys.length > 0
|
13
|
+
$stderr.puts "Active Projects:"
|
14
|
+
wspaces.each_pair do |k,v|
|
15
|
+
$stderr.puts "\t#{k}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
$stderr.puts ""
|
20
|
+
exit(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
opts = {}
|
24
|
+
opts[:blacklist] = ''
|
25
|
+
opts[:whitelist_ports] = ''
|
26
|
+
opts[:blacklist_ports] = ''
|
27
|
+
opts[:exploit_timeout] = 5
|
28
|
+
opts[:limit_sessions] = true
|
29
|
+
opts[:ignore_fragile_devices] = true
|
30
|
+
opts[:filter_by_os] = true
|
31
|
+
opts[:only_match] = false
|
32
|
+
opts[:match_vulns] = true
|
33
|
+
opts[:match_ports] = true
|
34
|
+
opts[:payload_method] = "auto"
|
35
|
+
opts[:payload_type] = "meterpreter"
|
36
|
+
opts[:payload_ports] = "4000-5000"
|
37
|
+
opts[:evasion_level_tcp] = 0
|
38
|
+
opts[:evasion_level_app] = 0
|
39
|
+
opts[:module_filter] = ''
|
40
|
+
|
41
|
+
# Parse script-specific options
|
42
|
+
parser = Msf::RPC::Client.option_parser(opts)
|
43
|
+
parser.separator('Exploit Specific Options:')
|
44
|
+
|
45
|
+
parser.on("--project PROJECT") do |x|
|
46
|
+
opts[:project] = x
|
47
|
+
end
|
48
|
+
|
49
|
+
parser.on("--targets TARGETS") do |x|
|
50
|
+
opts[:targets] = x
|
51
|
+
end
|
52
|
+
|
53
|
+
parser.on("--speed SPEED") do |x|
|
54
|
+
opts[:speed] = x
|
55
|
+
end
|
56
|
+
|
57
|
+
parser.on("--minimum-rank RANK") do |x|
|
58
|
+
opts[:rank] = x
|
59
|
+
end
|
60
|
+
|
61
|
+
parser.on("--blacklist BLACKLIST (optional)") do |x|
|
62
|
+
opts[:blacklist] = x
|
63
|
+
end
|
64
|
+
|
65
|
+
parser.on("--whitelist-ports PORTS (optional)") do |x|
|
66
|
+
opts[:whitelist_ports] = x
|
67
|
+
end
|
68
|
+
|
69
|
+
parser.on("--blacklist-ports PORTS (optional)") do |x|
|
70
|
+
opts[:blacklist_ports] = x
|
71
|
+
end
|
72
|
+
|
73
|
+
parser.on("--exploit-timeout TIMEOUT (optional)") do |x|
|
74
|
+
opts[:exploit_timeout] = x
|
75
|
+
end
|
76
|
+
|
77
|
+
parser.on("--limit-sessions (optional)") do |x|
|
78
|
+
opts[:limit_sessions] = (x =~ /^(y|t|1)/i ? true : false )
|
79
|
+
end
|
80
|
+
|
81
|
+
parser.on("--ignore-fragile-devices (optional)") do |x|
|
82
|
+
opts[:ignore_fragile_devices] = (x =~ /^(y|t|1)/i ? true : false )
|
83
|
+
end
|
84
|
+
|
85
|
+
parser.on("--filter-by-os (optional)") do |x|
|
86
|
+
opts[:filter_by_os] = (x =~ /^(y|t|1)/i ? true : false )
|
87
|
+
end
|
88
|
+
|
89
|
+
parser.on("--dry-run (optional)") do |x|
|
90
|
+
opts[:only_match] = (x =~ /^(y|t|1)/i ? true : false )
|
91
|
+
end
|
92
|
+
|
93
|
+
parser.on("--match-vulns (optional)") do |x|
|
94
|
+
opts[:match_vulns] = (x =~ /^(y|t|1)/i ? true : false )
|
95
|
+
end
|
96
|
+
|
97
|
+
parser.on("--match-ports (optional)") do |x|
|
98
|
+
opts[:match_ports] = (x =~ /^(y|t|1)/i ? true : false )
|
99
|
+
end
|
100
|
+
|
101
|
+
parser.on("--payload-method AUTO|REVERSE|BIND (optional)") do |x|
|
102
|
+
opts[:payload_method] = x
|
103
|
+
end
|
104
|
+
|
105
|
+
parser.on("--payload-type METERPRETER|SHELL (optional)") do |x|
|
106
|
+
opts[:payload_type] = x
|
107
|
+
end
|
108
|
+
|
109
|
+
parser.on("--payload-ports PORTS (optional)") do |x|
|
110
|
+
opts[:payload_ports] = x
|
111
|
+
end
|
112
|
+
|
113
|
+
parser.on("--evasion-level-tcp LEVEL (optional)") do |x|
|
114
|
+
opts[:evasion_level_tcp] = x
|
115
|
+
end
|
116
|
+
|
117
|
+
parser.on("--evasion-level-app LEVEL (optional)") do |x|
|
118
|
+
opts[:evasion_level_app] = x
|
119
|
+
end
|
120
|
+
|
121
|
+
parser.on("--module-filter FILTER (optional)") do |x|
|
122
|
+
opts[:module_filter] = x
|
123
|
+
end
|
124
|
+
|
125
|
+
parser.on("--help") do
|
126
|
+
$stderr.puts parser
|
127
|
+
exit(1)
|
128
|
+
end
|
129
|
+
|
130
|
+
parser.separator('')
|
131
|
+
parser.parse!(ARGV)
|
132
|
+
|
133
|
+
@rpc = Msf::RPC::Client.new(opts)
|
134
|
+
|
135
|
+
if not @rpc.token
|
136
|
+
$stderr.puts "Error: Invalid RPC server options specified"
|
137
|
+
$stderr.puts parser
|
138
|
+
exit(1)
|
139
|
+
end
|
140
|
+
|
141
|
+
# Store the user's settings
|
142
|
+
project = opts[:project] || usage(parser)
|
143
|
+
targets = opts[:targets] || usage(parser)
|
144
|
+
rank = opts[:rank] || usage(parser)
|
145
|
+
speed = opts[:speed] || usage(parser)
|
146
|
+
blacklist = opts[:blacklist]
|
147
|
+
whitelist_ports = opts[:whitelist_ports]
|
148
|
+
blacklist_ports = opts[:blacklist_ports]
|
149
|
+
exploit_timeout = opts[:exploit_timeout]
|
150
|
+
limit_sessions = opts[:limit_sessions]
|
151
|
+
ignore_fragile_devices = opts[:ignore_fragile_devices]
|
152
|
+
filter_by_os = opts[:filter_by_os]
|
153
|
+
only_match = opts[:only_match]
|
154
|
+
match_vulns = opts[:match_vulns]
|
155
|
+
match_ports = opts[:match_ports]
|
156
|
+
payload_method = opts[:payload_method]
|
157
|
+
payload_type = opts[:payload_type]
|
158
|
+
payload_ports = opts[:payload_ports]
|
159
|
+
evasion_level_tcp = opts[:evasion_level_tcp]
|
160
|
+
evasion_level_app = opts[:evasion_level_app]
|
161
|
+
module_filter = opts[:module_filter]
|
162
|
+
#===
|
163
|
+
|
164
|
+
# Get the default user
|
165
|
+
user = @rpc.call("pro.default_admin_user")['username']
|
166
|
+
|
167
|
+
# Create the task object with all options
|
168
|
+
task = @rpc.call("pro.start_exploit", {
|
169
|
+
'workspace' => project,
|
170
|
+
'username' => user,
|
171
|
+
'DS_WHITELIST_HOSTS' => targets,
|
172
|
+
'DS_BLACKLIST_HOSTS' => blacklist,
|
173
|
+
'DS_WHITELIST_PORTS' => whitelist_ports,
|
174
|
+
'DS_BLACKLIST_PORTS' => blacklist_ports,
|
175
|
+
'DS_MinimumRank' => rank,
|
176
|
+
'DS_EXPLOIT_SPEED' => speed,
|
177
|
+
'DS_EXPLOIT_TIMEOUT' => exploit_timeout,
|
178
|
+
'DS_LimitSessions' => limit_sessions,
|
179
|
+
'DS_IgnoreFragileDevices' => ignore_fragile_devices,
|
180
|
+
'DS_FilterByOS' => filter_by_os,
|
181
|
+
'DS_OnlyMatch' => only_match,
|
182
|
+
'DS_MATCH_VULNS' => match_vulns,
|
183
|
+
'DS_MATCH_PORTS' => match_ports,
|
184
|
+
'DS_PAYLOAD_METHOD' => payload_method,
|
185
|
+
'DS_PAYLOAD_TYPE' => payload_type,
|
186
|
+
'DS_PAYLOAD_PORTS' => payload_ports,
|
187
|
+
'DS_EVASION_LEVEL_TCP' => evasion_level_tcp,
|
188
|
+
'DS_EVASION_LEVEL_APP' => evasion_level_app,
|
189
|
+
'DS_ModuleFilter' => module_filter
|
190
|
+
})
|
191
|
+
|
192
|
+
puts "DEBUG: Running task with #{task.inspect}"
|
193
|
+
|
194
|
+
if not task['task_id']
|
195
|
+
$stderr.puts "[-] Error starting the task: #{task.inspect}"
|
196
|
+
exit(0)
|
197
|
+
end
|
198
|
+
|
199
|
+
puts "[*] Creating Task ID #{task['task_id']}..."
|
200
|
+
while true
|
201
|
+
select(nil, nil, nil, 0.50)
|
202
|
+
|
203
|
+
stat = @rpc.call("pro.task_status", task['task_id'])
|
204
|
+
|
205
|
+
if stat['status'] == 'invalid'
|
206
|
+
$stderr.puts "[-] Error checking task status"
|
207
|
+
exit(0)
|
208
|
+
end
|
209
|
+
|
210
|
+
info = stat[ task['task_id'] ]
|
211
|
+
|
212
|
+
if not info
|
213
|
+
$stderr.puts "[-] Error finding the task"
|
214
|
+
exit(0)
|
215
|
+
end
|
216
|
+
|
217
|
+
if info['status'] == "error"
|
218
|
+
$stderr.puts "[-] Error generating report: #{info['error']}"
|
219
|
+
exit(0)
|
220
|
+
end
|
221
|
+
|
222
|
+
break if info['progress'] == 100
|
223
|
+
end
|
224
|
+
|
225
|
+
$stdout.puts "[+] Task Complete!"
|