Nessus6 0.1.1 → 0.1.2
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/.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
|
+
[](https://codeclimate.com/github/kkirsche/Nessus6) [](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
|