msfrpc-client 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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!"
|