nexposecli 0.1.13 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/nexposecli +63 -262
- data/bin/nexposecli.test +11 -2
- data/lib/nexposecli/args.rb +232 -0
- data/lib/nexposecli/ops.rb +11 -0
- data/lib/nexposecli/role.rb +10 -0
- data/lib/nexposecli/scan.rb +10 -0
- data/lib/nexposecli/version.rb +1 -1
- data/lib/nexposecli.rb +4 -5
- data/nexposecli.gemspec +3 -3
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55304881a72629484ab8661e51fa5f7add72f67a
|
4
|
+
data.tar.gz: c3b6bda8e98491d93e0e8f68fca7336ff999af7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ed6b2f14f1aa74ee8d49a5c1424b5a88d680c4145200ee590ca26e1e31c9c905d8b10268076f73a4b4759c25db43543d136e9214591b9b6ac694c319c40c0de
|
7
|
+
data.tar.gz: 9dfecc38b96235615560ae57897ba19495910481a6db43c2aed4ed7453f1d5610b9fbcb825cea0a8e13e959014a2643f313cab65cf3913794daf476de908d803
|
data/bin/nexposecli
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
##############################################################################
|
3
3
|
#
|
4
|
-
# File:
|
4
|
+
# File: nexposecli
|
5
5
|
#
|
6
6
|
# Author: Erik Gomez <gomeze@pobox.com>
|
7
7
|
# Erik Gomez <erik_gomez@rapid7.com>
|
8
8
|
#
|
9
|
-
# Purpose:
|
9
|
+
# Purpose: A command-line utility for the Rapid7 Nexpose Console
|
10
10
|
#
|
11
|
-
#
|
12
|
-
# Revision: $Id:$ (20160426@1315.01)
|
13
|
-
#
|
14
|
-
# Usage: ./evm.rb <action> <target> [<args>]
|
11
|
+
# Usage: nexposecli <action> <target> [<args>]
|
15
12
|
#
|
16
13
|
# -v verbose
|
17
14
|
# --help help
|
15
|
+
#
|
18
16
|
# ***NOTE*** This script is being refactored!!!
|
19
17
|
# It is currently a shameless copy of my UF code and
|
20
18
|
# argparse.rb class code from Jim Hranicky (jfh@ufl.edu)
|
@@ -30,29 +28,18 @@ require 'netaddr'
|
|
30
28
|
require 'logger'
|
31
29
|
require 'yaml'
|
32
30
|
require 'csv'
|
33
|
-
require 'set'
|
34
31
|
# for debug, this dumps the ruby objects to STDOUT
|
35
32
|
require 'pp'
|
36
33
|
|
37
34
|
##############################################################################
|
38
|
-
# Set Const
|
39
|
-
|
40
|
-
# Allowed Ops by field, in Set form
|
41
|
-
CVSS_SCORE_OPS = Set["IS", "IS_NOT", "IN_RANGE", "GREATER_THAN", "LESS_THAN"]
|
42
|
-
IP_RANGE_OPS = Set["IN", "NOT_IN"]
|
43
|
-
OS_OPS = Set["CONTAINS", "NOT_CONTAINS", "IS_EMPTY", "IS_NOT_EMPTY"]
|
44
|
-
RISK_SCORE_OPS = Set["IS", "IS_NOT", "IN_RANGE", "GREATER_THAN", "LESS_THAN"]
|
45
|
-
SITE_ID_OPS = Set["IN", "NOT_IN"]
|
46
|
-
SCAN_DATE_OPS = Set["ON_OR_BEFORE", "ON_OR_AFTER", "BETWEEN", "EARLIER_THAN", "WITHIN_THE_LAST"]
|
47
|
-
|
48
35
|
# Set default var values
|
49
36
|
$debug = false
|
50
37
|
uf_scanners = ''
|
51
38
|
|
52
|
-
@logpath = "./
|
39
|
+
@logpath = "./"
|
53
40
|
@scanpath = "./"
|
54
41
|
# Attempting to use logfile per month: @logfile = "evm" + Time.now.strftime("%Y%m%d_%H%M%S") + ".log"
|
55
|
-
@logfile = "
|
42
|
+
@logfile = "nexposecli" + Time.now.strftime("%Y%m") + ".log"
|
56
43
|
@evm_reqid = SecureRandom.hex
|
57
44
|
@nsc_server = "<server>"
|
58
45
|
@nsc_user = "<user>"
|
@@ -80,7 +67,7 @@ def upp( uobj )
|
|
80
67
|
end
|
81
68
|
end
|
82
69
|
|
83
|
-
#
|
70
|
+
# bail vs exit
|
84
71
|
def ubail(retval, msg)
|
85
72
|
uputs("BAIL", msg.to_s)
|
86
73
|
exit(retval)
|
@@ -225,14 +212,7 @@ def validate_searchstring(sfstr)
|
|
225
212
|
valid_search_field = nil
|
226
213
|
valid_search_op = nil
|
227
214
|
|
228
|
-
# Valid search fields and operators
|
229
|
-
# CVSS_SCORE = IS, IS_NOT, IN_RANGE, GREATER_THAN, LESS_THAN (Float 0.0-10.0)
|
230
|
-
# IP_RANGE = IN, NOT_IN (IPv4 dotted notation)
|
231
|
-
# OS = CONTAINS, NOT_CONTAINS, IS_EMPTY, IS_NOT_EMPTY
|
232
|
-
# RISK_SCORE = IS, IS_NOT, IN_RANGE, GREATER_THAN, LESS_THAN (Fixnum)
|
233
|
-
# SITE_ID = IN, NOT_IN (Fixnum)
|
234
|
-
# SCAN_DATE = ON_OR_BEFORE, ON_OR_AFTER, BETWEEN (Value::ScanDate::FORMAT dates)
|
235
|
-
# SCAN_DATE = EARLIER_THAN, WITHIN_THE_LAST (Fixnum days)
|
215
|
+
# Valid search fields and operators can be found in lib/nexposecli/ops.rb
|
236
216
|
|
237
217
|
# Grab search field and op
|
238
218
|
search_field = sfstr.split(':').first.to_s
|
@@ -242,17 +222,17 @@ def validate_searchstring(sfstr)
|
|
242
222
|
isValid = false
|
243
223
|
case search_field
|
244
224
|
when "CVSS_SCORE"
|
245
|
-
isValid = true if CVSS_SCORE_OPS.include?(search_op)
|
225
|
+
isValid = true if Nexposecli::CVSS_SCORE_OPS.include?(search_op)
|
246
226
|
when "IP_RANGE"
|
247
|
-
isValid = true if IP_RANGE_OPS.include?(search_op)
|
227
|
+
isValid = true if Nexposecli::IP_RANGE_OPS.include?(search_op)
|
248
228
|
when "OS"
|
249
|
-
isValid = true if OS_OPS.include?(search_op)
|
229
|
+
isValid = true if Nexposecli::OS_OPS.include?(search_op)
|
250
230
|
when "RISK_SCORE"
|
251
|
-
isValid = true if RISK_SCORE_OPS.include?(search_op)
|
231
|
+
isValid = true if Nexposecli::RISK_SCORE_OPS.include?(search_op)
|
252
232
|
when "SITE_ID"
|
253
|
-
isValid = true if SITE_ID_OPS.include?(search_op)
|
233
|
+
isValid = true if Nexposecli::SITE_ID_OPS.include?(search_op)
|
254
234
|
when "SCAN_DATE"
|
255
|
-
isValid = true if SCAN_DATE_OPS.include?(search_op)
|
235
|
+
isValid = true if Nexposecli::SCAN_DATE_OPS.include?(search_op)
|
256
236
|
else
|
257
237
|
# Unsupported search field
|
258
238
|
end
|
@@ -265,230 +245,13 @@ def validate_searchstring(sfstr)
|
|
265
245
|
end
|
266
246
|
end
|
267
247
|
|
268
|
-
##############################################################################
|
269
|
-
#
|
270
|
-
# Conf
|
271
|
-
#
|
272
|
-
##############################################################################
|
273
|
-
# Parse cli and config options passed
|
274
|
-
ARGS = %q{
|
275
|
-
- comment : General Options
|
276
|
-
|
277
|
-
- name : help
|
278
|
-
desc : Print help
|
279
|
-
|
280
|
-
- name : verbose
|
281
|
-
short : v
|
282
|
-
desc : Run verbosely
|
283
|
-
|
284
|
-
- comment : EVM Administrative Actions
|
285
|
-
|
286
|
-
- name : create
|
287
|
-
short : c
|
288
|
-
desc : The create action is used for new objects
|
289
|
-
|
290
|
-
- name : list
|
291
|
-
short : l
|
292
|
-
desc : The list action is used to list of objects of the same type
|
293
|
-
|
294
|
-
- name : show
|
295
|
-
short : s
|
296
|
-
desc : The show action is used to display details of a single object
|
297
|
-
|
298
|
-
- name : update
|
299
|
-
short : u
|
300
|
-
desc : The update action is used to change properties of a single object
|
301
|
-
|
302
|
-
- name : delete
|
303
|
-
short : d
|
304
|
-
desc : The delete action is used to delete a single object
|
305
|
-
|
306
|
-
- name : run
|
307
|
-
desc : The run action is only used to issue commands to the COMMAND object
|
308
|
-
|
309
|
-
- comment : EVM Action Targets
|
310
|
-
|
311
|
-
- name : USER
|
312
|
-
short : U
|
313
|
-
desc : The USER target is used to alter or create the USER object
|
314
|
-
|
315
|
-
- name : ROLE
|
316
|
-
short : L
|
317
|
-
desc : The ROLE target is used to alter or create the ROLE object
|
318
|
-
|
319
|
-
- name : ENGINE
|
320
|
-
short : E
|
321
|
-
desc : The ENGINE target is used to alter or create the SCAN ENGINE object
|
322
|
-
|
323
|
-
- name : POOL
|
324
|
-
short : P
|
325
|
-
desc : The POOL target is used to alter or create the POOL object
|
326
|
-
|
327
|
-
- name : SCAN
|
328
|
-
short : S
|
329
|
-
desc : The SCAN target is used to alter or create the SCAN object
|
330
|
-
|
331
|
-
- name : SITE
|
332
|
-
short : T
|
333
|
-
desc : The SITE target is used to alter or create the SITE object
|
334
|
-
|
335
|
-
- name : ASSET
|
336
|
-
short : A
|
337
|
-
desc : The ASSET target is used to alter or create the ASSET object
|
338
|
-
|
339
|
-
- name : DASSET
|
340
|
-
short : D
|
341
|
-
desc : The DASSET target is used to alter or create the DASSET object
|
342
|
-
|
343
|
-
- name : TAG
|
344
|
-
short : G
|
345
|
-
desc : The TAG target is used to alter or create the TAG object
|
346
|
-
|
347
|
-
- name : REPORT
|
348
|
-
short : R
|
349
|
-
desc : The REPORT target is used to alter or create the REPORT object
|
350
|
-
|
351
|
-
- name : VULN
|
352
|
-
short : V
|
353
|
-
desc : The VULN target is used to alter or create the VULN object
|
354
|
-
|
355
|
-
- name : CONSOLE
|
356
|
-
desc : The CONSOLE target is used to alter the CONSOLE nsc connection object
|
357
|
-
|
358
|
-
- name : COMMAND
|
359
|
-
short : C
|
360
|
-
desc : The COMMAND target is only used in conjunction with the --run action
|
361
|
-
required : true
|
362
|
-
|
363
|
-
- name : QUERY
|
364
|
-
desc : The QUERY target is only used in conjunction with the --run action
|
365
|
-
|
366
|
-
- comment : EVM Action Argument Values
|
367
|
-
|
368
|
-
- name : host
|
369
|
-
short : h
|
370
|
-
desc : The target ip or host to be acted upon by the action
|
371
|
-
required : true
|
372
|
-
|
373
|
-
- name : port
|
374
|
-
short : p
|
375
|
-
desc : The target port to be acted upon by the action
|
376
|
-
required : true
|
377
|
-
|
378
|
-
- name : name
|
379
|
-
short : n
|
380
|
-
desc : The target object name
|
381
|
-
required : true
|
382
|
-
|
383
|
-
- name : fullname
|
384
|
-
desc : The target object full name
|
385
|
-
required : true
|
386
|
-
|
387
|
-
- name : newname
|
388
|
-
desc : The target object new name
|
389
|
-
required : true
|
390
|
-
|
391
|
-
- name : description
|
392
|
-
short : t
|
393
|
-
desc : The text based description of the object being acted upon
|
394
|
-
required : true
|
395
|
-
|
396
|
-
- name : id
|
397
|
-
short : i
|
398
|
-
desc : The object id being acted upon
|
399
|
-
required : true
|
400
|
-
|
401
|
-
- name : site
|
402
|
-
desc : The site id of the object being acted upon
|
403
|
-
required : true
|
404
|
-
|
405
|
-
- name : range
|
406
|
-
short : r
|
407
|
-
desc : The comma separated (begin,end) range of ip addresses to be acted upon
|
408
|
-
required : true
|
409
|
-
|
410
|
-
- name : targets
|
411
|
-
desc : The network block or ip addresses to be acted upon, in CIDRv4, dotted dashed, or ip format
|
412
|
-
required : true
|
413
|
-
|
414
|
-
- name : argv
|
415
|
-
short : g
|
416
|
-
desc : Argument vector for the action, in the form key:value pairs
|
417
|
-
required : true
|
418
|
-
|
419
|
-
- name : filter
|
420
|
-
short : f
|
421
|
-
desc : Filters which are applied to the action, in the form key:value pairs
|
422
|
-
required : true
|
423
|
-
|
424
|
-
- name : filterv
|
425
|
-
desc : Filter value which are applied to the action. Formate varies by filter type
|
426
|
-
required : true
|
427
|
-
|
428
|
-
- name : action
|
429
|
-
short : a
|
430
|
-
desc : The subaction to be performed within the target action
|
431
|
-
required : true
|
432
|
-
|
433
|
-
- name : sql
|
434
|
-
desc : The sql query to be executed
|
435
|
-
required : true
|
436
|
-
|
437
|
-
- name : sqlvar
|
438
|
-
desc : The sql query to be executed
|
439
|
-
required : true
|
440
|
-
|
441
|
-
- name : sqlfile
|
442
|
-
desc : The file containing the sql query to be executed
|
443
|
-
required : true
|
444
|
-
|
445
|
-
- name : timeout
|
446
|
-
desc : The timeout value in seconds for certain actions, such as reporting
|
447
|
-
required : true
|
448
|
-
|
449
|
-
- name : attempts
|
450
|
-
desc : The max number of attempts for iterative actions
|
451
|
-
required : true
|
452
|
-
|
453
|
-
- name : loop_sleep
|
454
|
-
desc : The sleep interval in seconds between action iterations
|
455
|
-
required : true
|
456
|
-
|
457
|
-
- comment : Nexpose Console credentials
|
458
|
-
|
459
|
-
- name : config
|
460
|
-
desc : The config yaml file containing the connection details of the Nexpose Console Server
|
461
|
-
required : true
|
462
|
-
|
463
|
-
- name : nsc_server
|
464
|
-
desc : The ip or hostname of the Nexpose Console Server
|
465
|
-
required : true
|
466
|
-
|
467
|
-
- name : nsc_user
|
468
|
-
desc : The username to login to the Nexpose Console Server
|
469
|
-
required : true
|
470
|
-
|
471
|
-
- name : nsc_pass
|
472
|
-
desc : The password to login to the Nexpose Console Server
|
473
|
-
required : true
|
474
|
-
|
475
|
-
- name : logpath
|
476
|
-
desc : The path for writing the logs
|
477
|
-
required : true
|
478
|
-
|
479
|
-
- name : scanpath
|
480
|
-
desc : The path for exported/imported scans
|
481
|
-
required : true
|
482
|
-
}
|
483
|
-
|
484
|
-
|
485
248
|
##############################################################################
|
486
249
|
#
|
487
250
|
# Main
|
488
251
|
#
|
489
252
|
##############################################################################
|
490
253
|
# Args parsing
|
491
|
-
ap = Nexposecli::ArgParse.new( ARGS )
|
254
|
+
ap = Nexposecli::ArgParse.new( Nexposecli::ARGS )
|
492
255
|
|
493
256
|
begin
|
494
257
|
args = ap.parse
|
@@ -508,6 +271,7 @@ end
|
|
508
271
|
uputs("LOG", "Automation tasks being run from: " + Socket.gethostname.to_s)
|
509
272
|
uputs("LOG", "Automation tasks being logged to: #{@logpath.to_s + @logfile.to_s}")
|
510
273
|
|
274
|
+
# Needs to move
|
511
275
|
if args.scanpath
|
512
276
|
# consider input validation, to avoid sec issues
|
513
277
|
@scanpath = args.scanpath.to_s
|
@@ -517,6 +281,7 @@ $debug = TRUE if args.verbose
|
|
517
281
|
uputs("CLI", "Command-line args parsed for #{$0}")
|
518
282
|
uputs("CLI", "Args: #{args.inspect}")
|
519
283
|
|
284
|
+
# Needs to potentially move, based on TARGET help vs general usage
|
520
285
|
if args.help
|
521
286
|
uputs("CLI", "Help was requested, displaying usage and exiting")
|
522
287
|
puts ap.usage("#{$0} [options] (v #{Nexposecli::VERSION})")
|
@@ -552,9 +317,12 @@ uputs("TARGET", "Checking for the requested target")
|
|
552
317
|
@target |= 4096 if args.TEMPLATE
|
553
318
|
@target |= 8192 if args.ROLE
|
554
319
|
@target |= 16384 if args.QUERY
|
320
|
+
@target |= 32768 if args.AUTHSRC
|
555
321
|
uputs("TARGET", "The requested target value is: #{@target.to_s}")
|
556
|
-
raise "You can only submit one target per task, see --help (#{@target})" unless [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384].include?(@target)
|
322
|
+
raise "You can only submit one target per task, see --help (#{@target})" unless [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768].include?(@target)
|
557
323
|
|
324
|
+
# Needs to potentially move into TARGET object or module instance var
|
325
|
+
## First NSC Connection and Session creation
|
558
326
|
# nsc conn vars
|
559
327
|
unless (
|
560
328
|
(args.nsc_server && args.nsc_user && args.nsc_pass) || args.config
|
@@ -609,26 +377,38 @@ when 1 # TARGET USER
|
|
609
377
|
uputs("ACTION", 'create USER action requested')
|
610
378
|
name = args.name
|
611
379
|
full_name = "#{args.fullname}"
|
612
|
-
|
380
|
+
email = "#{args.email}"
|
381
|
+
role = "#{args.role}"
|
382
|
+
password = "#{args.password}"
|
613
383
|
|
614
384
|
user = Nexpose::User.new(name,
|
615
385
|
full_name,
|
616
386
|
password,
|
617
|
-
role_name =
|
387
|
+
role_name = role,
|
618
388
|
id = -1,
|
619
389
|
enabled = 1,
|
620
|
-
email =
|
390
|
+
email = email,
|
621
391
|
all_sites = false,
|
622
392
|
all_groups = false,
|
623
393
|
token = nil)
|
624
|
-
|
625
|
-
|
394
|
+
if args.authsrc
|
395
|
+
user.authsrcid = args.authsrc
|
396
|
+
user.password = nil
|
397
|
+
end
|
626
398
|
user.save(@nsc)
|
627
|
-
|
399
|
+
puts "The user: #{user.name} was created with id: #{user.id}"
|
400
|
+
uputs("USER", "New user created: #{user.name} (id:#{user.id})")
|
401
|
+
upp user
|
628
402
|
when 2 # list
|
629
403
|
uputs("ACTION", 'list USER action requested')
|
630
404
|
user_listing = @nsc.list_users
|
631
|
-
|
405
|
+
puts "Users:"
|
406
|
+
puts " - " + '%-6.6s' % 'Admin?' + " " + '%-15.15s' % 'Username' + " " + '%-25.25s' % 'Full Name' + " " + '%-30.30s' % 'Email' + " " + '%-25.25s' % "Role" + "\tAuth Module:Source"
|
407
|
+
user_listing.each do |user|
|
408
|
+
role = Nexpose::User.load(@nsc, user.id).role_name
|
409
|
+
puts " - " + '%-6.6s' % user.is_admin.to_s + " " + '%-15.15s' % user.name + " " + '%-25.25s' % user.full_name + " " + '%-30.30s' % user.email + " " + '%-25.25s' % role + "\t#{user.auth_module}:#{user.auth_source}"
|
410
|
+
end
|
411
|
+
upp user_listing
|
632
412
|
when 4 # show
|
633
413
|
uputs("ACTION", 'show USER action requested')
|
634
414
|
userid = args.id.to_str
|
@@ -1705,6 +1485,11 @@ when 8192 # TARGET ROLE
|
|
1705
1485
|
when 2 # list
|
1706
1486
|
uputs("ACTION", 'list ROLE action requested')
|
1707
1487
|
postd = @nsc.roles
|
1488
|
+
puts "Roles:"
|
1489
|
+
puts " - " + '%-6.6s' % 'Scope' + " " + '%-5.5s' % 'Id' + " " + '%-25.25s' % 'Username' + " " + '%-25.25s' % 'Full Name' + " " + '%-60.60s' % 'Description'
|
1490
|
+
postd.each do |role|
|
1491
|
+
puts " - " + '%-6.6s' % role.scope + " " + '%-5.5s' % role.id + " " + '%-25.25s' % role.name + " " + '%-25.25s' % role.full_name + " " + '%-60.60s' % role.description
|
1492
|
+
end
|
1708
1493
|
upp postd
|
1709
1494
|
puts "\n"
|
1710
1495
|
when 4 # show
|
@@ -1762,8 +1547,24 @@ when 16384 # TARGET QUERY
|
|
1762
1547
|
|
1763
1548
|
puts csv_output
|
1764
1549
|
else
|
1765
|
-
uputs("ACTION", 'The action requested is not implemented for target:
|
1766
|
-
puts 'The action requested is not implemented for target:
|
1550
|
+
uputs("ACTION", 'The action requested is not implemented for target: QUERY')
|
1551
|
+
puts 'The action requested is not implemented for target: QUERY'
|
1552
|
+
end
|
1553
|
+
when 32768 # TARGET AUTHSRC
|
1554
|
+
case @action
|
1555
|
+
when 2 # list
|
1556
|
+
uputs("ACTION", 'list AUTHSRC action requested')
|
1557
|
+
authsrcs = Nexpose::UserAuthenticator.list(@nsc)
|
1558
|
+
puts "Authenticator Sources:"
|
1559
|
+
puts " - " + '%-10.10s' % 'Auth Module' + " " + '%-5.5s' % 'Id' + " " + '%-40.40s' % 'Auth Source' + " " + '%-10.10s' % 'External?'
|
1560
|
+
authsrcs.each do |src|
|
1561
|
+
puts " - " + '%-10.10s' % src.auth_module + " " + '%-5.5s' % src.id + " " + '%-40.40s' % src.auth_source + " " + '%-10.10s' % src.external.to_s
|
1562
|
+
end
|
1563
|
+
upp authsrcs
|
1564
|
+
puts "\n"
|
1565
|
+
else
|
1566
|
+
uputs("ACTION", 'The action requested is not implemented for target: AUTHSRC')
|
1567
|
+
puts 'The action requested is not implemented for target: AUTHSRC'
|
1767
1568
|
end
|
1768
1569
|
else
|
1769
1570
|
# there is no default target
|
data/bin/nexposecli.test
CHANGED
@@ -2,5 +2,14 @@
|
|
2
2
|
|
3
3
|
require 'nexposecli'
|
4
4
|
|
5
|
-
chatter = Nexposecli::Chatter.new
|
6
|
-
chatter.say_hello
|
5
|
+
# chatter = Nexposecli::Chatter.new
|
6
|
+
# chatter.say_hello
|
7
|
+
|
8
|
+
# nxclass = Nexposecli::Target.const_get("Role")
|
9
|
+
nxclass = Nexposecli::Target.const_get("#{ARGV[0]}")
|
10
|
+
|
11
|
+
puts nxclass.new.list
|
12
|
+
puts "and again but via const_get for method"
|
13
|
+
puts nxclass.new.method("list").call("me")
|
14
|
+
puts nxclass.new.method("list").call
|
15
|
+
puts nxclass.new.method("list").call("Sarah")
|
@@ -0,0 +1,232 @@
|
|
1
|
+
module Nexposecli
|
2
|
+
##############################################################################
|
3
|
+
#
|
4
|
+
# Conf
|
5
|
+
#
|
6
|
+
##############################################################################
|
7
|
+
# Parse cli and config options passed
|
8
|
+
ARGS = %q{
|
9
|
+
- comment : General Options
|
10
|
+
|
11
|
+
- name : help
|
12
|
+
desc : Print help
|
13
|
+
|
14
|
+
- name : verbose
|
15
|
+
short : v
|
16
|
+
desc : Run verbosely
|
17
|
+
|
18
|
+
- comment : EVM Administrative Actions
|
19
|
+
|
20
|
+
- name : create
|
21
|
+
short : c
|
22
|
+
desc : The create action is used for new objects
|
23
|
+
|
24
|
+
- name : list
|
25
|
+
short : l
|
26
|
+
desc : The list action is used to list of objects of the same type
|
27
|
+
|
28
|
+
- name : show
|
29
|
+
short : s
|
30
|
+
desc : The show action is used to display details of a single object
|
31
|
+
|
32
|
+
- name : update
|
33
|
+
short : u
|
34
|
+
desc : The update action is used to change properties of a single object
|
35
|
+
|
36
|
+
- name : delete
|
37
|
+
short : d
|
38
|
+
desc : The delete action is used to delete a single object
|
39
|
+
|
40
|
+
- name : run
|
41
|
+
desc : The run action is only used to issue commands to the COMMAND object
|
42
|
+
|
43
|
+
- comment : EVM Action Targets
|
44
|
+
|
45
|
+
- name : USER
|
46
|
+
short : U
|
47
|
+
desc : The USER target is used to alter or create the USER object
|
48
|
+
|
49
|
+
- name : ROLE
|
50
|
+
short : L
|
51
|
+
desc : The ROLE target is used to alter or create the ROLE object
|
52
|
+
|
53
|
+
- name : ENGINE
|
54
|
+
short : E
|
55
|
+
desc : The ENGINE target is used to alter or create the SCAN ENGINE object
|
56
|
+
|
57
|
+
- name : POOL
|
58
|
+
short : P
|
59
|
+
desc : The POOL target is used to alter or create the POOL object
|
60
|
+
|
61
|
+
- name : SCAN
|
62
|
+
short : S
|
63
|
+
desc : The SCAN target is used to alter or create the SCAN object
|
64
|
+
|
65
|
+
- name : SITE
|
66
|
+
short : T
|
67
|
+
desc : The SITE target is used to alter or create the SITE object
|
68
|
+
|
69
|
+
- name : ASSET
|
70
|
+
short : A
|
71
|
+
desc : The ASSET target is used to alter or create the ASSET object
|
72
|
+
|
73
|
+
- name : DASSET
|
74
|
+
short : D
|
75
|
+
desc : The DASSET target is used to alter or create the DASSET object
|
76
|
+
|
77
|
+
- name : TAG
|
78
|
+
short : G
|
79
|
+
desc : The TAG target is used to alter or create the TAG object
|
80
|
+
|
81
|
+
- name : REPORT
|
82
|
+
short : R
|
83
|
+
desc : The REPORT target is used to alter or create the REPORT object
|
84
|
+
|
85
|
+
- name : VULN
|
86
|
+
short : V
|
87
|
+
desc : The VULN target is used to alter or create the VULN object
|
88
|
+
|
89
|
+
- name : AUTHSRC
|
90
|
+
desc : The AUTHSRC target is used to alter or list the AUTHSRC object
|
91
|
+
|
92
|
+
- name : CONSOLE
|
93
|
+
desc : The CONSOLE target is used to alter the CONSOLE nsc connection object
|
94
|
+
|
95
|
+
- name : COMMAND
|
96
|
+
short : C
|
97
|
+
desc : The COMMAND target is only used in conjunction with the --run action
|
98
|
+
required : true
|
99
|
+
|
100
|
+
- name : QUERY
|
101
|
+
desc : The QUERY target is only used in conjunction with the --run action
|
102
|
+
|
103
|
+
- comment : EVM Action Argument Values
|
104
|
+
|
105
|
+
- name : host
|
106
|
+
short : h
|
107
|
+
desc : The target ip or host to be acted upon by the action
|
108
|
+
required : true
|
109
|
+
|
110
|
+
- name : port
|
111
|
+
short : p
|
112
|
+
desc : The target port to be acted upon by the action
|
113
|
+
required : true
|
114
|
+
|
115
|
+
- name : authsrc
|
116
|
+
desc : The target authsrc id
|
117
|
+
required : true
|
118
|
+
|
119
|
+
- name : role
|
120
|
+
desc : The target role name
|
121
|
+
required : true
|
122
|
+
|
123
|
+
- name : email
|
124
|
+
desc : The target email address
|
125
|
+
required : true
|
126
|
+
|
127
|
+
- name : name
|
128
|
+
short : n
|
129
|
+
desc : The target object name
|
130
|
+
required : true
|
131
|
+
|
132
|
+
- name : fullname
|
133
|
+
desc : The target object full name
|
134
|
+
required : true
|
135
|
+
|
136
|
+
- name : newname
|
137
|
+
desc : The target object new name
|
138
|
+
required : true
|
139
|
+
|
140
|
+
- name : description
|
141
|
+
short : t
|
142
|
+
desc : The text based description of the object being acted upon
|
143
|
+
required : true
|
144
|
+
|
145
|
+
- name : id
|
146
|
+
short : i
|
147
|
+
desc : The object id being acted upon
|
148
|
+
required : true
|
149
|
+
|
150
|
+
- name : site
|
151
|
+
desc : The site id of the object being acted upon
|
152
|
+
required : true
|
153
|
+
|
154
|
+
- name : range
|
155
|
+
short : r
|
156
|
+
desc : The comma separated (begin,end) range of ip addresses to be acted upon
|
157
|
+
required : true
|
158
|
+
|
159
|
+
- name : targets
|
160
|
+
desc : The network block or ip addresses to be acted upon, in CIDRv4, dotted dashed, or ip format
|
161
|
+
required : true
|
162
|
+
|
163
|
+
- name : argv
|
164
|
+
short : g
|
165
|
+
desc : Argument vector for the action, in the form key:value pairs
|
166
|
+
required : true
|
167
|
+
|
168
|
+
- name : filter
|
169
|
+
short : f
|
170
|
+
desc : Filters which are applied to the action, in the form key:value pairs
|
171
|
+
required : true
|
172
|
+
|
173
|
+
- name : filterv
|
174
|
+
desc : Filter value which are applied to the action. Formate varies by filter type
|
175
|
+
required : true
|
176
|
+
|
177
|
+
- name : action
|
178
|
+
short : a
|
179
|
+
desc : The subaction to be performed within the target action
|
180
|
+
required : true
|
181
|
+
|
182
|
+
- name : sql
|
183
|
+
desc : The sql query to be executed
|
184
|
+
required : true
|
185
|
+
|
186
|
+
- name : sqlvar
|
187
|
+
desc : The sql query to be executed
|
188
|
+
required : true
|
189
|
+
|
190
|
+
- name : sqlfile
|
191
|
+
desc : The file containing the sql query to be executed
|
192
|
+
required : true
|
193
|
+
|
194
|
+
- name : timeout
|
195
|
+
desc : The timeout value in seconds for certain actions, such as reporting
|
196
|
+
required : true
|
197
|
+
|
198
|
+
- name : attempts
|
199
|
+
desc : The max number of attempts for iterative actions
|
200
|
+
required : true
|
201
|
+
|
202
|
+
- name : loop_sleep
|
203
|
+
desc : The sleep interval in seconds between action iterations
|
204
|
+
required : true
|
205
|
+
|
206
|
+
- comment : Nexpose Console credentials
|
207
|
+
|
208
|
+
- name : config
|
209
|
+
desc : The config yaml file containing the connection details of the Nexpose Console Server
|
210
|
+
required : true
|
211
|
+
|
212
|
+
- name : nsc_server
|
213
|
+
desc : The ip or hostname of the Nexpose Console Server
|
214
|
+
required : true
|
215
|
+
|
216
|
+
- name : nsc_user
|
217
|
+
desc : The username to login to the Nexpose Console Server
|
218
|
+
required : true
|
219
|
+
|
220
|
+
- name : nsc_pass
|
221
|
+
desc : The password to login to the Nexpose Console Server
|
222
|
+
required : true
|
223
|
+
|
224
|
+
- name : logpath
|
225
|
+
desc : The path for writing the logs
|
226
|
+
required : true
|
227
|
+
|
228
|
+
- name : scanpath
|
229
|
+
desc : The path for exported/imported scans
|
230
|
+
required : true
|
231
|
+
}
|
232
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Nexposecli
|
4
|
+
# Allowed Search and Filter Operators by field, in Set form
|
5
|
+
CVSS_SCORE_OPS = Set["IS", "IS_NOT", "IN_RANGE", "GREATER_THAN", "LESS_THAN"]
|
6
|
+
IP_RANGE_OPS = Set["IN", "NOT_IN"]
|
7
|
+
OS_OPS = Set["CONTAINS", "NOT_CONTAINS", "IS_EMPTY", "IS_NOT_EMPTY"]
|
8
|
+
RISK_SCORE_OPS = Set["IS", "IS_NOT", "IN_RANGE", "GREATER_THAN", "LESS_THAN"]
|
9
|
+
SITE_ID_OPS = Set["IN", "NOT_IN"]
|
10
|
+
SCAN_DATE_OPS = Set["ON_OR_BEFORE", "ON_OR_AFTER", "BETWEEN", "EARLIER_THAN", "WITHIN_THE_LAST"]
|
11
|
+
end
|
data/lib/nexposecli/version.rb
CHANGED
data/lib/nexposecli.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require "nexposecli/version"
|
2
2
|
require "nexposecli/argparse"
|
3
|
+
require "nexposecli/args"
|
4
|
+
require "nexposecli/ops"
|
5
|
+
require "nexposecli/role"
|
6
|
+
require "nexposecli/scan"
|
3
7
|
|
4
8
|
module Nexposecli
|
5
|
-
class Chatter
|
6
|
-
def say_hello
|
7
|
-
puts 'This is nexposecli. Coming Soon.'
|
8
|
-
end
|
9
|
-
end
|
10
9
|
end
|
data/nexposecli.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.summary = 'Ruby command-line utility for Rapid7 Nexpose'
|
11
11
|
spec.description = 'This experimental gem provides a Ruby command-line utility to the Nexpose vulnerability management product by Rapid7.'
|
12
12
|
spec.homepage = 'https://github.com/frozenr7/nexposecli'
|
13
|
-
spec.license = 'BSD'
|
13
|
+
spec.license = 'BSD-3-Clause'
|
14
14
|
|
15
15
|
spec.files = `git ls-files`.split($\)
|
16
16
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.required_ruby_version = '>= 2.1'
|
21
|
-
spec.add_runtime_dependency "nexpose",
|
22
|
-
spec.add_runtime_dependency "netaddr",
|
21
|
+
spec.add_runtime_dependency "nexpose", '~> 4.0', '>= 4.0.4'
|
22
|
+
spec.add_runtime_dependency "netaddr", '~> 1.5', '>= 1.5.1'
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.12"
|
25
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexposecli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Gomez
|
@@ -9,12 +9,15 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-06-
|
12
|
+
date: 2016-06-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nexpose
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '4.0'
|
18
21
|
- - ">="
|
19
22
|
- !ruby/object:Gem::Version
|
20
23
|
version: 4.0.4
|
@@ -22,6 +25,9 @@ dependencies:
|
|
22
25
|
prerelease: false
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
24
27
|
requirements:
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '4.0'
|
25
31
|
- - ">="
|
26
32
|
- !ruby/object:Gem::Version
|
27
33
|
version: 4.0.4
|
@@ -29,6 +35,9 @@ dependencies:
|
|
29
35
|
name: netaddr
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
31
37
|
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
32
41
|
- - ">="
|
33
42
|
- !ruby/object:Gem::Version
|
34
43
|
version: 1.5.1
|
@@ -36,6 +45,9 @@ dependencies:
|
|
36
45
|
prerelease: false
|
37
46
|
version_requirements: !ruby/object:Gem::Requirement
|
38
47
|
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '1.5'
|
39
51
|
- - ">="
|
40
52
|
- !ruby/object:Gem::Version
|
41
53
|
version: 1.5.1
|
@@ -103,6 +115,10 @@ files:
|
|
103
115
|
- bin/setup
|
104
116
|
- lib/nexposecli.rb
|
105
117
|
- lib/nexposecli/argparse.rb
|
118
|
+
- lib/nexposecli/args.rb
|
119
|
+
- lib/nexposecli/ops.rb
|
120
|
+
- lib/nexposecli/role.rb
|
121
|
+
- lib/nexposecli/scan.rb
|
106
122
|
- lib/nexposecli/version.rb
|
107
123
|
- nexposecli-0.1.11.gem
|
108
124
|
- nexposecli.gemspec
|
@@ -110,7 +126,7 @@ files:
|
|
110
126
|
- spec/spec_helper.rb
|
111
127
|
homepage: https://github.com/frozenr7/nexposecli
|
112
128
|
licenses:
|
113
|
-
- BSD
|
129
|
+
- BSD-3-Clause
|
114
130
|
metadata: {}
|
115
131
|
post_install_message:
|
116
132
|
rdoc_options: []
|