Nessus6 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +18 -0
- data/Nessus6.gemspec +1 -0
- data/README.md +2 -0
- data/Rakefile +11 -1
- data/bin/console +4 -4
- data/lib/Nessus6.rb +22 -18
- data/lib/Nessus6/editor.rb +88 -0
- data/lib/Nessus6/errors/authentication_error.rb +8 -0
- data/lib/Nessus6/errors/bad_request.rb +10 -6
- data/lib/Nessus6/errors/conflict.rb +9 -5
- data/lib/Nessus6/errors/forbidden.rb +9 -5
- data/lib/Nessus6/errors/internal_server_error.rb +8 -4
- data/lib/Nessus6/errors/not_found.rb +9 -5
- data/lib/Nessus6/errors/unauthorized.rb +11 -7
- data/lib/Nessus6/errors/unknown.rb +7 -3
- data/lib/Nessus6/file.rb +31 -0
- data/lib/Nessus6/folder.rb +72 -0
- data/lib/Nessus6/group.rb +115 -0
- data/lib/Nessus6/permission.rb +46 -0
- data/lib/Nessus6/scan.rb +135 -0
- data/lib/Nessus6/session.rb +106 -0
- data/lib/Nessus6/user.rb +136 -0
- data/lib/Nessus6/verification.rb +29 -0
- data/lib/Nessus6/version.rb +1 -1
- metadata +26 -10
- data/lib/Nessus6/editor/methods.rb +0 -108
- data/lib/Nessus6/file/methods.rb +0 -34
- data/lib/Nessus6/folders/methods.rb +0 -118
- data/lib/Nessus6/groups/methods.rb +0 -202
- data/lib/Nessus6/permissions/methods.rb +0 -66
- data/lib/Nessus6/scans/methods.rb +0 -106
- data/lib/Nessus6/session/methods.rb +0 -142
- data/lib/Nessus6/users/methods.rb +0 -180
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45de2929582d290d256e02d1e7ca7b8cd91cd559
|
4
|
+
data.tar.gz: ef441435d1ef84096b44319284fae90e6ee6dbec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07ad4b0de59890b92c5048c60743aed6c48c932d6a12f7b69cb5d10df72ce1296ccd49a1479d059e1b1df2972f5ded92b86ac1cfd1145d85e85d69a3391466ea
|
7
|
+
data.tar.gz: 23a8777b7b42bafdc63c5bf2e67fbc208b99182801945cdf158ce6ce40fc8203a92a55f954c673f17672c483013addb7377f29390e9ad41fc6014031b9972322
|
data/.travis.yml
CHANGED
@@ -1,3 +1,21 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
+
- 2.0.0
|
4
|
+
- 2.1.0
|
3
5
|
- 2.1.5
|
6
|
+
- 2.2.0
|
7
|
+
- 2.2.1
|
8
|
+
- 2.2.2
|
9
|
+
- rbx-2
|
10
|
+
- ruby-head
|
11
|
+
- jruby-head
|
12
|
+
|
13
|
+
before_install:
|
14
|
+
- gem update --system
|
15
|
+
- gem --version
|
16
|
+
|
17
|
+
gemfile:
|
18
|
+
- Gemfile
|
19
|
+
|
20
|
+
notifications:
|
21
|
+
email: false
|
data/Nessus6.gemspec
CHANGED
@@ -25,5 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
26
|
spec.add_development_dependency "minitest", "~> 5.8"
|
27
27
|
spec.add_development_dependency "yard", "~> 0.8"
|
28
|
+
spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4'
|
28
29
|
spec.add_runtime_dependency "hurley", "~> 0.1"
|
29
30
|
end
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[![Code Climate](https://codeclimate.com/github/kkirsche/Nessus6/badges/gpa.svg)](https://codeclimate.com/github/kkirsche/Nessus6) [![Test Coverage](https://codeclimate.com/github/kkirsche/Nessus6/badges/coverage.svg)](https://codeclimate.com/github/kkirsche/Nessus6/coverage)
|
2
|
+
|
1
3
|
# Nessus6
|
2
4
|
|
3
5
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/Nessus6`. To experiment with that code, run `bin/console` for an interactive prompt.
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'Nessus6'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require
|
10
|
+
# require 'pry'
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/lib/Nessus6.rb
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
require 'hurley'
|
2
|
+
# Must go first
|
3
|
+
require 'Nessus6/verification'
|
4
|
+
# Inherits from verification
|
2
5
|
require 'Nessus6/version'
|
3
|
-
require 'Nessus6/editor
|
4
|
-
require 'Nessus6/session
|
5
|
-
require 'Nessus6/
|
6
|
-
require 'Nessus6/file
|
7
|
-
require 'Nessus6/
|
8
|
-
require 'Nessus6/
|
9
|
-
require 'Nessus6/
|
10
|
-
require 'Nessus6/
|
6
|
+
require 'Nessus6/editor'
|
7
|
+
require 'Nessus6/session'
|
8
|
+
require 'Nessus6/user'
|
9
|
+
require 'Nessus6/file'
|
10
|
+
require 'Nessus6/folder'
|
11
|
+
require 'Nessus6/group'
|
12
|
+
require 'Nessus6/permission'
|
13
|
+
require 'Nessus6/scan'
|
14
|
+
require 'Nessus6/errors/authentication_error'
|
11
15
|
|
12
16
|
module Nessus6
|
13
17
|
# The Client class is used to interact with the Nessus API
|
14
18
|
class Client
|
15
|
-
attr_reader :client, :editor, :session, :
|
16
|
-
:
|
19
|
+
attr_reader :client, :editor, :session, :user, :file, :folder, :group,
|
20
|
+
:permission, :scan
|
17
21
|
|
18
22
|
def initialize(credentials, nessus)
|
19
23
|
nessus[:port] = '8834' unless nessus.key?(:port)
|
@@ -37,9 +41,9 @@ module Nessus6
|
|
37
41
|
@client.header['X-Cookie'] = "token = #{@token}"
|
38
42
|
elsif credentials[:access_key] && credentials[:secret_key]
|
39
43
|
else
|
40
|
-
fail AuthenticationError, 'Authentication credentials
|
41
|
-
'Must provided either username and password or
|
42
|
-
' secret key.'
|
44
|
+
fail Nessus6::Error::AuthenticationError, 'Authentication credentials' \
|
45
|
+
' not provided. Must provided either username and password or ' \
|
46
|
+
'access key and secret key.'
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
@@ -52,12 +56,12 @@ module Nessus6
|
|
52
56
|
def build_clients(client)
|
53
57
|
@session = Nessus6::Session.new client
|
54
58
|
@editor = Nessus6::Editor.new client
|
55
|
-
@
|
59
|
+
@user = Nessus6::User.new client
|
56
60
|
@file = Nessus6::File.new client
|
57
|
-
@
|
58
|
-
@
|
59
|
-
@
|
60
|
-
@
|
61
|
+
@folder = Nessus6::Folder.new client
|
62
|
+
@group = Nessus6::Group.new client
|
63
|
+
@permission = Nessus6::Permission.new client
|
64
|
+
@scan = Nessus6::Scan.new client
|
61
65
|
end
|
62
66
|
end
|
63
67
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/bad_request' # 400
|
3
|
+
require 'Nessus6/errors/forbidden' # 403
|
4
|
+
require 'Nessus6/errors/not_found' # 404
|
5
|
+
require 'Nessus6/errors/conflict' # 409
|
6
|
+
require 'Nessus6/errors/internal_server_error' # 500
|
7
|
+
require 'Nessus6/errors/unknown' # Unknown Error Code
|
8
|
+
|
9
|
+
module Nessus6
|
10
|
+
# The Editor class is for interacting with Nessus6 templates. Templates are
|
11
|
+
# used to create scans or policies with predefined parameters.
|
12
|
+
# https://localhost:8834/api#/resources/editor
|
13
|
+
class Editor
|
14
|
+
include Nessus6::Verification
|
15
|
+
|
16
|
+
public
|
17
|
+
|
18
|
+
def initialize(client)
|
19
|
+
@client = client
|
20
|
+
end
|
21
|
+
|
22
|
+
# Export the given audit file.
|
23
|
+
#
|
24
|
+
# @param type [String] The type of template to retrieve (scan or policy).
|
25
|
+
# @param object_id [String, Fixnum] The unique id of the object.
|
26
|
+
# @param file_id [String, Fixnum] The id of the file to export.
|
27
|
+
# @return [Hash]
|
28
|
+
def audits(type, object_id, file_id)
|
29
|
+
response = @client.get("editor/#{type}/#{object_id}/audits/#{file_id}")
|
30
|
+
verify response,
|
31
|
+
forbidden: 'You do not have permission to export the audit file',
|
32
|
+
not_found: 'Audit file does not exist',
|
33
|
+
internal_server_error: 'Internal server error occurred.'
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the details for the given template.
|
37
|
+
#
|
38
|
+
# @param type [String] The type of template to retrieve (scan or policy).
|
39
|
+
# @param template_uuid [String] The uuid for the template.
|
40
|
+
# @return [Hash] Details for the given template
|
41
|
+
def details(type, template_uuid)
|
42
|
+
response = @client.get("editor/#{type}/templates/#{template_uuid}")
|
43
|
+
verify response,
|
44
|
+
forbidden: 'You do not have permission to open the template',
|
45
|
+
not_found: 'Template does not exist',
|
46
|
+
internal_server_error: 'Internal server error occurred.'
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns the requested object.
|
50
|
+
#
|
51
|
+
# @param type [String] The type of template to retrieve (scan or policy).
|
52
|
+
# @param id [String, Fixnum] The unique id of the object.
|
53
|
+
# @return [Hash] The requested object
|
54
|
+
def edit(type, id)
|
55
|
+
response = @client.get("editor/#{type}/#{id}")
|
56
|
+
verify response,
|
57
|
+
forbidden: 'You do not have permission to open the object',
|
58
|
+
not_found: 'Object does not exist',
|
59
|
+
internal_server_error: 'Internal server error occurred.'
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns the template list.
|
63
|
+
#
|
64
|
+
# @param type [String] The type of template to retrieve (scan or policy).
|
65
|
+
# @return [Hash] { "templates": [ template Resource ] }
|
66
|
+
def list(type)
|
67
|
+
response = @client.get("editor/#{type}/templates")
|
68
|
+
verify response,
|
69
|
+
forbidden: 'You do not have permission to view the list',
|
70
|
+
internal_server_error: 'Internal server error occurred.'
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns the plugin description. This request requires standard user
|
74
|
+
# permissions
|
75
|
+
#
|
76
|
+
# @param policy_id [String, Fixnum] The id of the policy to lookup.
|
77
|
+
# @param family_id [String, Fixnum] The id of the family to lookup within
|
78
|
+
# the policy.
|
79
|
+
# @param plugin_id [String, Fixnum] The id of the plugin to lookup within
|
80
|
+
# the family.
|
81
|
+
# @return [Hash] The plugin output
|
82
|
+
def plugin_description(policy_id, family_id, plugin_id)
|
83
|
+
response = @client.get("editor/policy/#{policy_id}/families/#{family_id}/plugins/#{plugin_id}")
|
84
|
+
verify response,
|
85
|
+
internal_server_error: 'Internal server error occurred.'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
|
1
|
+
module Nessus6
|
2
|
+
module Error
|
3
|
+
# BadRequestError represents HTTP 400 Responses
|
4
|
+
# The server cannot or will not process the request
|
5
|
+
# due to something that is perceived to be a client
|
6
|
+
# error (e.g. malformed request syntax, invalid request
|
7
|
+
# message framing, or deceptive request routing)
|
8
|
+
class BadRequestError < StandardError
|
9
|
+
end
|
10
|
+
end
|
7
11
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
|
1
|
+
module Nessus6
|
2
|
+
module Error
|
3
|
+
# ConflictError represents HTTP 409 Responses
|
4
|
+
# Indicates that the request could not be processed
|
5
|
+
# because of a conflict in the request such as an
|
6
|
+
# edit conflict in the case of multiple updates.
|
7
|
+
class ConflictError < StandardError
|
8
|
+
end
|
9
|
+
end
|
6
10
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
|
1
|
+
module Nessus6
|
2
|
+
module Error
|
3
|
+
# ForbiddenError represents HTTP 403 Responses
|
4
|
+
# The request was a valid request, but the server
|
5
|
+
# is refusing to respond to it. Unlike 401 Unauthorized
|
6
|
+
# responses, authenticating will make no difference
|
7
|
+
class ForbiddenError < StandardError
|
8
|
+
end
|
9
|
+
end
|
6
10
|
end
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
|
1
|
+
module Nessus6
|
2
|
+
module Error
|
3
|
+
# InternalServerError represents HTTP 500 Responses
|
4
|
+
# A generic error message, given when an unexpected condition
|
5
|
+
# was encountered and no more specific message is suitable
|
6
|
+
class InternalServerError < StandardError
|
7
|
+
end
|
8
|
+
end
|
5
9
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
|
1
|
+
module Nessus6
|
2
|
+
module Error
|
3
|
+
# NotFoundError represents HTTP 404 Responses
|
4
|
+
# The requested resource could not be found but may be
|
5
|
+
# available again in the future. Subsequent requests by
|
6
|
+
# the client are permissible.
|
7
|
+
class NotFoundError < StandardError
|
8
|
+
end
|
9
|
+
end
|
6
10
|
end
|
@@ -1,8 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
1
|
+
module Nessus6
|
2
|
+
module Error
|
3
|
+
# UnauthorizedError represents HTTP 401 Responses
|
4
|
+
# Similar to 403 Forbidden, but specifically for use
|
5
|
+
# when authentication is required and has failed or has
|
6
|
+
# not yet been provided. The response must include a
|
7
|
+
# WWW-Authenticate header field containing a challenge
|
8
|
+
# applicable to the requested resource
|
9
|
+
class UnauthorizedError < StandardError
|
10
|
+
end
|
11
|
+
end
|
8
12
|
end
|
@@ -1,4 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module Nessus6
|
2
|
+
module Error
|
3
|
+
# UnknownError represents something that Nessus doesn't
|
4
|
+
# provide an HTTP code for
|
5
|
+
class UnknownError < StandardError
|
6
|
+
end
|
7
|
+
end
|
4
8
|
end
|
data/lib/Nessus6/file.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'hurley'
|
3
|
+
require 'Nessus6/errors/internal_server_error'
|
4
|
+
require 'Nessus6/errors/unknown'
|
5
|
+
|
6
|
+
module Nessus6
|
7
|
+
# The File class is for uploading files to Nessus.
|
8
|
+
# https://localhost:8834/api#/resources/file
|
9
|
+
class File
|
10
|
+
include Nessus6::Verification
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
def initialize(client)
|
15
|
+
@client = client
|
16
|
+
end
|
17
|
+
|
18
|
+
# Uploads a file. This request requires read only user permissions.
|
19
|
+
#
|
20
|
+
# @param file_path [String] Path to the file to upload
|
21
|
+
# @param file_type [String] MIME type. E.g. 'text/plain'
|
22
|
+
# @return [Hash] Returns a :fileuploaded string.
|
23
|
+
def upload(file_path, file_type, encrypted = 0)
|
24
|
+
response = @client.post('file/upload',
|
25
|
+
file: Hurley::UploadIO.new(file_path, file_type),
|
26
|
+
no_enc: encrypted)
|
27
|
+
verify response,
|
28
|
+
internal_server_error: 'File failed to upload'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'Nessus6/errors/internal_server_error'
|
3
|
+
require 'Nessus6/errors/forbidden'
|
4
|
+
require 'Nessus6/errors/bad_request'
|
5
|
+
require 'Nessus6/errors/not_found'
|
6
|
+
require 'Nessus6/errors/unknown'
|
7
|
+
|
8
|
+
module Nessus6
|
9
|
+
# The Folders class is for interacting with Nessus6 folders. Folders are used
|
10
|
+
# to sort and organize a user's scan results.
|
11
|
+
# https://localhost:8834/api#/resources/folders
|
12
|
+
class Folder
|
13
|
+
include Nessus6::Verification
|
14
|
+
|
15
|
+
public
|
16
|
+
|
17
|
+
def initialize(client)
|
18
|
+
@client = client
|
19
|
+
end
|
20
|
+
|
21
|
+
# Creates a new folder for the current user. This request requires
|
22
|
+
# read-only user permissions.
|
23
|
+
#
|
24
|
+
# @param name [String] The name of the folder.
|
25
|
+
# @return [Hash]
|
26
|
+
def create(name)
|
27
|
+
response = @client.post('folders', name: name)
|
28
|
+
verify response,
|
29
|
+
bad_request: 'Folder name is invalid',
|
30
|
+
forbidden: 'You do not have permission to create a folder.',
|
31
|
+
internal_server_error: 'Server failed to create the folder.'
|
32
|
+
end
|
33
|
+
|
34
|
+
# Deletes a folder. This request requires read-only user permissions.
|
35
|
+
#
|
36
|
+
# @param folder_id [String, Fixnum] The id of the folder to delete.
|
37
|
+
# @return [Hash]
|
38
|
+
def delete(folder_id)
|
39
|
+
response = @client.delete("folders/#{folder_id}")
|
40
|
+
verify response,
|
41
|
+
forbidden: 'Cannot delete a system folder.',
|
42
|
+
not_found: 'Folder does not exist.',
|
43
|
+
internal_server_error: 'Server failed to delete the folder.'
|
44
|
+
end
|
45
|
+
|
46
|
+
# Rename a folder for the current user. This request requires read-only
|
47
|
+
# user permissions.
|
48
|
+
#
|
49
|
+
# @param folder_id [String, Fixnum] The id of the folder to edit.
|
50
|
+
# @param name [String] The name of the folder.
|
51
|
+
# @return [Hash]
|
52
|
+
def edit(folder_id, name)
|
53
|
+
response = @client.put("folders/#{folder_id}", name: name)
|
54
|
+
verify response,
|
55
|
+
forbidden: 'Cannot rename a system folder.',
|
56
|
+
not_found: 'Folder does not exist.',
|
57
|
+
internal_server_error: 'Server failed to rename the folder.'
|
58
|
+
end
|
59
|
+
|
60
|
+
alias_method :rename, :edit
|
61
|
+
|
62
|
+
# Returns the current user's scan folders.
|
63
|
+
#
|
64
|
+
# @return [Hash] { "folders": [folder Resource] }
|
65
|
+
def list
|
66
|
+
response = @client.get('folders')
|
67
|
+
verify response,
|
68
|
+
forbidden: 'You do not have permission to view the folder list.',
|
69
|
+
internal_server_error: 'An internal server error occurred.'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|