metasploit-credential 1.0.0.pre.rails.pre.4.0c → 1.0.0
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/CONTRIBUTING.md +20 -41
- data/app/models/metasploit/credential/core.rb +1 -1
- data/app/models/metasploit/credential/login.rb +1 -1
- data/app/models/metasploit/credential/postgres_md5.rb +4 -0
- data/app/models/metasploit/credential/search/operator/type.rb +2 -2
- data/lib/metasploit/credential/creation.rb +1 -1
- data/lib/metasploit/credential/exporter/core.rb +5 -5
- data/lib/metasploit/credential/exporter/pwdump.rb +2 -2
- data/lib/metasploit/credential/importer/pwdump.rb +6 -5
- data/lib/metasploit/credential/migrator.rb +1 -1
- data/lib/metasploit/credential/version.rb +32 -7
- data/spec/lib/metasploit/credential/creation_spec.rb +6 -8
- data/spec/lib/metasploit/credential/exporter/core_spec.rb +99 -84
- data/spec/lib/metasploit/credential/exporter/pwdump_spec.rb +14 -16
- data/spec/lib/metasploit/credential/importer/core_spec.rb +10 -12
- data/spec/lib/metasploit/credential/importer/multi_spec.rb +4 -6
- data/spec/lib/metasploit/credential/importer/pwdump_spec.rb +11 -13
- data/spec/lib/metasploit/credential/importer/zip_spec.rb +5 -7
- data/spec/lib/metasploit/credential/migrator_spec.rb +8 -9
- data/spec/lib/metasploit/credential/version_spec.rb +3 -139
- data/spec/lib/metasploit/credential_spec.rb +4 -15
- data/spec/models/mdm/service_spec.rb +3 -5
- data/spec/models/mdm/session_spec.rb +2 -4
- data/spec/models/mdm/task_spec.rb +4 -6
- data/spec/models/mdm/user_spec.rb +2 -4
- data/spec/models/mdm/workspace_spec.rb +2 -4
- data/spec/models/metasploit/credential/blank_username_spec.rb +4 -7
- data/spec/models/metasploit/credential/core_spec.rb +43 -45
- data/spec/models/metasploit/credential/login/status_spec.rb +19 -21
- data/spec/models/metasploit/credential/login_spec.rb +33 -35
- data/spec/models/metasploit/credential/nonreplayable_hash_spec.rb +3 -5
- data/spec/models/metasploit/credential/ntlm_hash_spec.rb +13 -15
- data/spec/models/metasploit/credential/origin/cracked_password_spec.rb +5 -7
- data/spec/models/metasploit/credential/origin/import_spec.rb +7 -10
- data/spec/models/metasploit/credential/origin/manual_spec.rb +7 -9
- data/spec/models/metasploit/credential/origin/service_spec.rb +9 -11
- data/spec/models/metasploit/credential/origin/session_spec.rb +10 -12
- data/spec/models/metasploit/credential/password_hash_spec.rb +4 -6
- data/spec/models/metasploit/credential/password_spec.rb +3 -5
- data/spec/models/metasploit/credential/postgres_md5_spec.rb +4 -6
- data/spec/models/metasploit/credential/private_spec.rb +7 -9
- data/spec/models/metasploit/credential/public_spec.rb +4 -6
- data/spec/models/metasploit/credential/realm_spec.rb +12 -14
- data/spec/models/metasploit/credential/replayable_hash_spec.rb +3 -5
- data/spec/models/metasploit/credential/ssh_key_spec.rb +15 -17
- data/spec/models/metasploit/credential/username_spec.rb +5 -9
- data/spec/models/metasploit_data_models/search/visitor/relation_spec.rb +1 -3
- data/spec/spec_helper.rb +95 -25
- data/spec/support/shared/contexts/mdm/workspace.rb +1 -1
- data/spec/support/shared/examples/core_validations.rb +117 -42
- data/spec/support/shared/examples/single_table_inheritance_database_columns.rb +2 -2
- data/spec/support/shared/examples/timestamp_database_column.rb +2 -2
- metadata +30 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d101098c3d7cc3ab27a13313cb0033a34349272
|
4
|
+
data.tar.gz: 357e125b89d9737aef2a6597a173a90e1bd149fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dc70a5df26e28577fd90e7d01e4c739b27e4377e52b5f79ad73ea105b6768c2277ba46df76797b3eb234ef8a19c71b1aedf092e171d307d1564533c5dbda6b5
|
7
|
+
data.tar.gz: f454884167aee38773a88c79b73ad07190f60ac75e08d9fd43c3bf30c7d579f5f4fbc1a4d8468740ba0daa42eef43e1667dea4f662a9ecb265ba4a29e4b1ab67
|
data/CONTRIBUTING.md
CHANGED
@@ -25,9 +25,9 @@ issue tracking software.
|
|
25
25
|
|
26
26
|
### `PRERELEASE`
|
27
27
|
|
28
|
-
1. Update `PRERELEASE` to match the `SUMMARY` in the branch name. If you branched from `master`, and [version.rb](lib/metasploit/credential/version.rb) does not have `PRERELEASE` defined, then adding the following lines after `PATCH`:
|
28
|
+
1. Update `PRERELEASE` to match the `SUMMARY` in the branch name. If you branched from `master`, and [version.rb](lib/metasploit/credential/version.rb) does not have `PRERELEASE` defined, then adding the following lines after `PATCH`:
|
29
29
|
```
|
30
|
-
# The prerelease version, scoped to the {PATCH} version number.
|
30
|
+
# The prerelease version, scoped to the {MAJOR}, {MINOR}, and {PATCH} version number.
|
31
31
|
PRERELEASE = '<SUMMARY>'
|
32
32
|
```
|
33
33
|
2. `rake spec`
|
@@ -36,21 +36,27 @@ PRERELEASE = '<SUMMARY>'
|
|
36
36
|
|
37
37
|
### Your changes
|
38
38
|
|
39
|
-
Make your changes or however many commits you like,
|
39
|
+
Make your changes or however many commits you like, committing each with `git commit`.
|
40
40
|
|
41
41
|
### Pre-Pull Request Testing
|
42
42
|
|
43
|
+
#### Specs
|
43
44
|
1. Run specs one last time before opening the Pull Request: `rake spec`
|
44
45
|
2. Verify there was no failures.
|
45
46
|
|
47
|
+
#### Documentation
|
48
|
+
1. Generate yard documentation to ensure all new code is documented: `rake yard`
|
49
|
+
2. Verify there were no `[warn]`ings.
|
50
|
+
3. Verify there were no undocumented objects.
|
51
|
+
|
46
52
|
### Push
|
47
53
|
|
48
|
-
Push your branch to your fork on
|
54
|
+
Push your branch to your fork on github: `git push TYPE/ISSUE/SUMMARY`
|
49
55
|
|
50
56
|
### Pull Request
|
51
57
|
|
52
58
|
* [Create new Pull Request](https://github.com/rapid7/metasploit-credential/compare/)
|
53
|
-
* Add a Verification Steps comment
|
59
|
+
* Add a Verification Steps to the description comment
|
54
60
|
|
55
61
|
```
|
56
62
|
# Verification Steps
|
@@ -60,7 +66,13 @@ Push your branch to your fork on gitub: `git push push TYPE/ISSUE/SUMMARY`
|
|
60
66
|
## `rake spec`
|
61
67
|
- [ ] `rake spec`
|
62
68
|
- [ ] VERIFY no failures
|
69
|
+
|
70
|
+
## `rake yard`
|
71
|
+
- [ ] `rake yard`
|
72
|
+
- [ ] VERIFY no `[warn]`ings
|
73
|
+
- [ ] VERIFY no undocumented objects
|
63
74
|
```
|
75
|
+
|
64
76
|
You should also include at least one scenario to manually check the changes outside of specs.
|
65
77
|
|
66
78
|
* Add a Post-merge Steps comment
|
@@ -105,7 +117,7 @@ Perform these steps prior to pushing to DESTINATION or the build will be broke o
|
|
105
117
|
- [ ] Change `PRERELEASE` from `SOURCE_SUMMARY` to `DESTINATION_SUMMARY` to match the branch (DESTINATION) summary (DESTINATION_SUMMARY)
|
106
118
|
|
107
119
|
## Gem build
|
108
|
-
- [ ] gem build
|
120
|
+
- [ ] gem build metasploit-credential.gemspec
|
109
121
|
- [ ] VERIFY the prerelease suffix has change on the gem.
|
110
122
|
|
111
123
|
## RSpec
|
@@ -117,38 +129,5 @@ Perform these steps prior to pushing to DESTINATION or the build will be broke o
|
|
117
129
|
- [ ] `git push origin DESTINATION`
|
118
130
|
```
|
119
131
|
|
120
|
-
|
121
|
-
|
122
|
-
The 'Release Steps' are a reminder to the reviewer of the Pull Request of how to release the gem.
|
123
|
-
|
124
|
-
```
|
125
|
-
# Release
|
126
|
-
|
127
|
-
Complete these steps on DESTINATION
|
128
|
-
|
129
|
-
## `VERSION`
|
130
|
-
|
131
|
-
### Compatible changes
|
132
|
-
|
133
|
-
If your change are compatible with the previous branch's API, then increment [`PATCH`](lib/metasploit/credential/version.rb).
|
134
|
-
|
135
|
-
### Incompatible changes
|
136
|
-
|
137
|
-
If your changes are incompatible with the previous branch's API, then increment [`MINOR`](lib/metasploit/credential/version.rb) and reset [`PATCH`](lib/metasploit/credential/version.rb) to `0`.
|
138
|
-
|
139
|
-
- [ ] Following the rules for [semantic versioning 2.0](http://semver.org/spec/v2.0.0.html), update [`MINOR`](lib/metasploit/credential/version.rb) and [`PATCH`](lib/metasploit/credential/version.rb) and commit the changes.
|
140
|
-
|
141
|
-
## MRI Ruby
|
142
|
-
- [ ] `rvm use ruby-2.1@metasploit_data_models`
|
143
|
-
- [ ] `rm Gemfile.lock`
|
144
|
-
- [ ] `bundle install`
|
145
|
-
- [ ] `rake release`
|
146
|
-
```
|
147
|
-
|
148
|
-
### Downstream dependencies
|
149
|
-
|
150
|
-
When releasing new versions, the following projects may need to be updated:
|
151
|
-
|
152
|
-
* [metasploit-framework](https://github.com/rapid7/metasploit-framework)
|
153
|
-
* [metasploit-pro-ui](https://github.com/rapid7/pro/tree/master/ui)
|
154
|
-
* [metasploit-pro-engine](https://github.com/rapid7/pro/tree/master/engine)
|
132
|
+
To update the [CHANGELOG.md](CHANGELOG.md) with the merged changes or release the merged code see
|
133
|
+
[RELEASING.md](RELEASING.md)
|
@@ -12,7 +12,7 @@ class Metasploit::Credential::Core < ActiveRecord::Base
|
|
12
12
|
#
|
13
13
|
|
14
14
|
# @!attribute tasks
|
15
|
-
# The
|
15
|
+
# The `Mdm::Task`s using this to track what tasks interacted with a given core.
|
16
16
|
#
|
17
17
|
# @return [ActiveRecord::Relation<Mdm::Task>]
|
18
18
|
has_and_belongs_to_many :tasks,
|
@@ -9,7 +9,7 @@ class Metasploit::Credential::Login < ActiveRecord::Base
|
|
9
9
|
#
|
10
10
|
|
11
11
|
# @!attribute tasks
|
12
|
-
# The
|
12
|
+
# The `Mdm::Task`s using this to track what tasks interacted with a given core.
|
13
13
|
#
|
14
14
|
# @return [ActiveRecord::Relation<Mdm::Task>]
|
15
15
|
has_and_belongs_to_many :tasks,
|
@@ -2,7 +2,11 @@
|
|
2
2
|
# to authenticate to PostgreSQL servers. It is composed of a hexadecimal string of 32 charachters prepended by the string
|
3
3
|
# 'md5'
|
4
4
|
class Metasploit::Credential::PostgresMD5 < Metasploit::Credential::ReplayableHash
|
5
|
+
#
|
6
|
+
# CONSTANTS
|
7
|
+
#
|
5
8
|
|
9
|
+
# Valid format for {Metasploit::Credential::Private#data}
|
6
10
|
DATA_REGEXP = /md5([a-f0-9]{32})/
|
7
11
|
|
8
12
|
#
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Operator that searches a polymorphic `#type` attribute. Search terms are restricted to set of `Class#name`s and
|
2
2
|
# `Class#model_name.human` with the `Class#model_name.human` being translated to `Class#name` in the operation returned
|
3
|
-
# by
|
3
|
+
# by `#operate_on`.
|
4
4
|
class Metasploit::Credential::Search::Operator::Type < Metasploit::Model::Search::Operator::Attribute
|
5
5
|
#
|
6
6
|
# Attributes
|
@@ -40,7 +40,7 @@ class Metasploit::Credential::Search::Operator::Type < Metasploit::Model::Search
|
|
40
40
|
@class_names ||= []
|
41
41
|
end
|
42
42
|
|
43
|
-
# Maps `Class.model_name.human` to `Class.name` for
|
43
|
+
# Maps `Class.model_name.human` to `Class.name` for {#class_set}.
|
44
44
|
#
|
45
45
|
# @return [Hash{String => String}] Maps `Class.model_name.name`s to `Class.name`s so `Class.model_names.name` can be
|
46
46
|
# converted to `Class.name` for the in database search.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Implements a set of "convenience methods" for creating credentials and related portions of the object graph. Creates
|
2
2
|
# {Metasploit::Credential::Core} objects and their attendant relationships as well as {Metasploit::Credential::Login}
|
3
|
-
# objects and their attendant
|
3
|
+
# objects and their attendant `Mdm::Host` and `Mdm::Service` objects.
|
4
4
|
module Metasploit::Credential::Creation
|
5
5
|
|
6
6
|
# Returns true if ActiveRecord has an active database connection, false otherwise.
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# and `Mdm::Server` information is exported as well. Exported data can be optionally scoped to include only
|
4
4
|
# a certain whitelist of database IDs.
|
5
5
|
#
|
6
|
-
# The {#export!} method creates a zip file on disk containing a CSV with the data. If the
|
6
|
+
# The {#export!} method creates a zip file on disk containing a CSV with the data. If the `workspace` contains
|
7
7
|
# {Metasploit::Credential::SSHKey} objects on the exported {Metasploit::Credential::Core} objects, the keys are
|
8
8
|
# exported to files inside a subdirectory of the zip file.
|
9
9
|
# @example Exporting all Cores
|
@@ -41,7 +41,7 @@ class Metasploit::Credential::Exporter::Core
|
|
41
41
|
# The downcased and Symbolized name of the default object type to export
|
42
42
|
DEFAULT_MODE = LOGIN_MODE
|
43
43
|
|
44
|
-
# An argument to
|
44
|
+
# An argument to `Dir::mktmpdir`
|
45
45
|
TEMP_ZIP_PATH_PREFIX = "metasploit-exports"
|
46
46
|
|
47
47
|
|
@@ -49,10 +49,10 @@ class Metasploit::Credential::Exporter::Core
|
|
49
49
|
# Attributes
|
50
50
|
#
|
51
51
|
|
52
|
-
# @!attribute export_data
|
52
|
+
# @!attribute [rw] export_data
|
53
53
|
# Holds the raw information from the database before it is formatted into the {#data} attribute
|
54
54
|
# @return [Array]
|
55
|
-
|
55
|
+
attr_writer :export_data
|
56
56
|
|
57
57
|
# @!attribute finalized_zip_file
|
58
58
|
# The final output artifacts, zipped
|
@@ -109,7 +109,7 @@ class Metasploit::Credential::Exporter::Core
|
|
109
109
|
end
|
110
110
|
|
111
111
|
# Returns a platform-agnostic filesystem path where the key data will be saved as a file
|
112
|
-
# @param line [Hash] the result of {#line_for_login} or #
|
112
|
+
# @param line [Hash] the result of {#line_for_login} or {#line_for_core}
|
113
113
|
# @return [String]
|
114
114
|
def path_for_key(datum)
|
115
115
|
core = datum.is_a?(Metasploit::Credential::Core) ? datum : datum.core
|
@@ -70,10 +70,10 @@ class Metasploit::Credential::Exporter::Pwdump
|
|
70
70
|
# Attributes
|
71
71
|
#
|
72
72
|
|
73
|
-
# @!attribute logins
|
73
|
+
# @!attribute [rw] logins
|
74
74
|
# Holds the raw information from the database before it is formatted into the {#data} attribute
|
75
75
|
# @return [Array<Metasploit::Credential::Login>]
|
76
|
-
|
76
|
+
attr_writer :logins
|
77
77
|
|
78
78
|
|
79
79
|
#
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# Implements importation behavior for pwdump files exported by Metasploit as well as files from the John the Ripper
|
2
2
|
# hash cracking suite: http://www.openwall.com/john/
|
3
3
|
#
|
4
|
-
# Please note that in the case of data exported from Metasploit, the dataset will contain information on the
|
5
|
-
# and
|
4
|
+
# Please note that in the case of data exported from Metasploit, the dataset will contain information on the `Mdm::Host`
|
5
|
+
# and `Mdm::Service` objects that are related to the credential. This means that Metasploit exports will be limited to
|
6
6
|
# containing {Metasploit::Credential::Login} objects, which is the legacy behavior of this export prior to the creation
|
7
7
|
# of this library.
|
8
8
|
class Metasploit::Credential::Importer::Pwdump
|
@@ -25,9 +25,10 @@ class Metasploit::Credential::Importer::Pwdump
|
|
25
25
|
# Matches lines that contain usernames and plaintext passwords
|
26
26
|
PLAINTEXT_REGEX = /^[\s]*([\x21-\x7f]+)[\s]+([\x21-\x7f]+)?/n
|
27
27
|
|
28
|
+
# Matches lines taht contain MD5 hashes for PostgreSQL
|
28
29
|
POSTGRES_REGEX = /^[\s]*([\x21-\x7f]+):md5([0-9a-f]{32})$/
|
29
30
|
|
30
|
-
# Matches a line that we use to get information for creating
|
31
|
+
# Matches a line that we use to get information for creating `Mdm::Host` and `Mdm::Service` objects
|
31
32
|
# TODO: change to use named groups from 1.9+
|
32
33
|
SERVICE_COMMENT_REGEX = /^#[\s]*([0-9.]+):([0-9]+)(\x2f(tcp|udp))?[\s]*(\x28([^\x29]*)\x29)?/n
|
33
34
|
|
@@ -70,7 +71,7 @@ class Metasploit::Credential::Importer::Pwdump
|
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
73
|
-
# Perform the import of the credential data, creating
|
74
|
+
# Perform the import of the credential data, creating `Mdm::Host` and `Mdm::Service` objects as needed,
|
74
75
|
# parsing out data by matching against regex constants that match the various kinds of valid lines found
|
75
76
|
# in the file. Ignore lines which match none of the REGEX constants.
|
76
77
|
# @return [void]
|
@@ -159,7 +160,7 @@ class Metasploit::Credential::Importer::Pwdump
|
|
159
160
|
end
|
160
161
|
|
161
162
|
# Take an msfpwdump comment string and parse it into information necessary for
|
162
|
-
# creating
|
163
|
+
# creating `Mdm::Host` and `Mdm::Service` objects.
|
163
164
|
# @param comment_string [String] a string starting with a '#' that conforms to {SERVICE_COMMENT_REGEX}
|
164
165
|
# @return [Hash]
|
165
166
|
def service_info_from_comment_string(comment_string)
|
@@ -104,7 +104,7 @@ class Metasploit::Credential::Migrator
|
|
104
104
|
# @return [String]
|
105
105
|
def key_data_from_file(path)
|
106
106
|
# Sometimes we will set the :pass attribute to a file path containing the key
|
107
|
-
if File.
|
107
|
+
if File.exist?(path)
|
108
108
|
File.read(path)
|
109
109
|
# In other cases we store the entire SSH key directly in the :pass attribute
|
110
110
|
elsif Metasploit::Credential::SSHKey.new(data: path).private?
|
@@ -4,20 +4,30 @@ module Metasploit
|
|
4
4
|
module Credential
|
5
5
|
# Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
|
6
6
|
module Version
|
7
|
+
#
|
8
|
+
# CONSTANTS
|
9
|
+
#
|
10
|
+
|
7
11
|
# The major version number.
|
8
12
|
MAJOR = 1
|
9
13
|
# The minor version number, scoped to the {MAJOR} version number.
|
10
14
|
MINOR = 0
|
11
|
-
# The patch number, scoped to the {MINOR} version
|
15
|
+
# The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
|
12
16
|
PATCH = 0
|
13
|
-
# the prerelease identifier
|
14
|
-
PRERELEASE = 'rails-4.0c'
|
15
17
|
|
16
|
-
#
|
18
|
+
#
|
19
|
+
# Module Methods
|
20
|
+
#
|
21
|
+
|
22
|
+
# The full version string, including the {Metasploit::Credential::Version::MAJOR},
|
23
|
+
# {Metasploit::Credential::Version::MINOR}, {Metasploit::Credential::Version::PATCH}, and optionally, the
|
24
|
+
# `Metasploit::Credential::Version::PRERELEASE` in the
|
17
25
|
# {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
|
18
26
|
#
|
19
|
-
# @return [String] '{MAJOR}.{MINOR}.{PATCH}'
|
20
|
-
#
|
27
|
+
# @return [String] '{Metasploit::Credential::Version::MAJOR}.{Metasploit::Credential::Version::MINOR}.{Metasploit::Credential::Version::PATCH}'
|
28
|
+
# on master.
|
29
|
+
# '{Metasploit::Credential::Version::MAJOR}.{Metasploit::Credential::Version::MINOR}.{Metasploit::Credential::Version::PATCH}-PRERELEASE'
|
30
|
+
# on any branch other than master.
|
21
31
|
def self.full
|
22
32
|
version = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
23
33
|
|
@@ -27,9 +37,24 @@ module Metasploit
|
|
27
37
|
|
28
38
|
version
|
29
39
|
end
|
40
|
+
|
41
|
+
# The full gem version string, including the {Metasploit::Credential::Version::MAJOR},
|
42
|
+
# {Metasploit::Credential::Version::MINOR}, {Metasploit::Credential::Version::PATCH}, and optionally, the
|
43
|
+
# `Metasploit::Credential::Version::PRERELEASE` in the
|
44
|
+
# {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
|
45
|
+
#
|
46
|
+
# @return [String] '{Metasploit::Credential::Version::MAJOR}.{Metasploit::Credential::Version::MINOR}.{Metasploit::Credential::Version::PATCH}'
|
47
|
+
# on master. '{Metasploit::Credential::Version::MAJOR}.{Metasploit::Credential::Version::MINOR}.{Metasploit::Credential::Version::PATCH}.PRERELEASE'
|
48
|
+
# on any branch other than master.
|
49
|
+
def self.gem
|
50
|
+
full.gsub('-', '.pre.')
|
51
|
+
end
|
30
52
|
end
|
31
53
|
|
32
|
-
#
|
54
|
+
# (see Version.gem)
|
55
|
+
GEM_VERSION = Version.gem
|
56
|
+
|
57
|
+
# (see Version.full)
|
33
58
|
VERSION = Version.full
|
34
59
|
end
|
35
60
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Metasploit::Credential::Creation do
|
1
|
+
RSpec.describe Metasploit::Credential::Creation do
|
4
2
|
include_context 'Mdm::Workspace'
|
5
3
|
let(:dummy_class) {
|
6
4
|
Class.new do
|
@@ -42,7 +40,7 @@ describe Metasploit::Credential::Creation do
|
|
42
40
|
|
43
41
|
it 'replicates realm in new credential' do
|
44
42
|
expect {
|
45
|
-
|
43
|
+
test_object.create_cracked_credential(
|
46
44
|
core_id: old_core.id,
|
47
45
|
workspace_id: workspace.id,
|
48
46
|
username: public.username,
|
@@ -160,7 +158,7 @@ describe Metasploit::Credential::Creation do
|
|
160
158
|
|
161
159
|
it 'should create an Mdm::Service in state "open"' do
|
162
160
|
service = test_object.create_credential_service opts
|
163
|
-
service.state.
|
161
|
+
expect(service.state).to eq("open")
|
164
162
|
end
|
165
163
|
end
|
166
164
|
|
@@ -483,7 +481,7 @@ describe Metasploit::Credential::Creation do
|
|
483
481
|
task_id: task.id
|
484
482
|
}
|
485
483
|
core = test_object.create_credential(opts)
|
486
|
-
core.tasks.
|
484
|
+
expect(core.tasks).to include(task)
|
487
485
|
end
|
488
486
|
|
489
487
|
end
|
@@ -526,7 +524,7 @@ describe Metasploit::Credential::Creation do
|
|
526
524
|
task_id: task.id
|
527
525
|
}
|
528
526
|
core = test_object.create_credential_core(opts)
|
529
|
-
core.tasks.
|
527
|
+
expect(core.tasks).to include(task)
|
530
528
|
end
|
531
529
|
|
532
530
|
end
|
@@ -563,7 +561,7 @@ describe Metasploit::Credential::Creation do
|
|
563
561
|
status: Metasploit::Model::Login::Status::SUCCESSFUL,
|
564
562
|
}
|
565
563
|
login = test_object.create_credential_login(login_data)
|
566
|
-
login.tasks.
|
564
|
+
expect(login.tasks).to include(task)
|
567
565
|
|
568
566
|
end
|
569
567
|
|
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Metasploit::Credential::Exporter::Core do
|
1
|
+
RSpec.describe Metasploit::Credential::Exporter::Core do
|
4
2
|
include_context 'Mdm::Workspace'
|
5
3
|
include_context 'export objects'
|
6
4
|
|
@@ -24,19 +22,19 @@ describe Metasploit::Credential::Exporter::Core do
|
|
24
22
|
end
|
25
23
|
|
26
24
|
it 'should be in LOGIN_MODE by default' do
|
27
|
-
core_exporter.mode.
|
25
|
+
expect(core_exporter.mode).to eq(Metasploit::Credential::Exporter::Core::LOGIN_MODE)
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
describe "#export!" do
|
32
30
|
it 'should create the zipfile' do
|
33
31
|
core_exporter.export!
|
34
|
-
File.exists?(core_exporter.output_zipfile_path).
|
32
|
+
expect(File.exists?(core_exporter.output_zipfile_path)).to eq(true)
|
35
33
|
end
|
36
34
|
|
37
35
|
it 'should output to a directory whose name contains the standardized identifier' do
|
38
36
|
core_exporter.export!
|
39
|
-
core_exporter.output_final_directory_path.
|
37
|
+
expect(core_exporter.output_final_directory_path).to include(Metasploit::Credential::Exporter::Core::CREDS_DUMP_FILE_IDENTIFIER)
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
@@ -46,14 +44,14 @@ describe Metasploit::Credential::Exporter::Core do
|
|
46
44
|
describe "when the argument is a Core" do
|
47
45
|
it 'should be formed from the Public#username and the Private#id' do
|
48
46
|
key_path = core_exporter.path_for_key(core)
|
49
|
-
Pathname.new(key_path).basename.to_s.
|
47
|
+
expect(Pathname.new(key_path).basename.to_s).to eq(key_path_basename_string)
|
50
48
|
end
|
51
49
|
end
|
52
50
|
|
53
51
|
describe "when the argument is a Login" do
|
54
52
|
it 'should be formed from the Public#username and the Private#id' do
|
55
53
|
key_path = core_exporter.path_for_key(login)
|
56
|
-
Pathname.new(key_path).basename.to_s.
|
54
|
+
expect(Pathname.new(key_path).basename.to_s).to eq(key_path_basename_string)
|
57
55
|
end
|
58
56
|
end
|
59
57
|
end
|
@@ -62,20 +60,27 @@ describe Metasploit::Credential::Exporter::Core do
|
|
62
60
|
let(:result_hash) { core_exporter.line_for_core(core) }
|
63
61
|
|
64
62
|
it 'should produce values in the proper order' do
|
65
|
-
result_hash.values.
|
66
|
-
|
63
|
+
expect(result_hash.values).to eq(
|
64
|
+
[
|
65
|
+
core.public.username,
|
66
|
+
core.private.type,
|
67
|
+
core.private.data,
|
68
|
+
core.realm.key,
|
69
|
+
core.realm.value
|
70
|
+
]
|
71
|
+
)
|
67
72
|
end
|
68
73
|
|
69
74
|
it 'should produce a hash with the public username' do
|
70
|
-
result_hash[:username].
|
75
|
+
expect(result_hash[:username]).to eq(core.public.username)
|
71
76
|
end
|
72
77
|
|
73
78
|
it 'should produce a hash with the private data' do
|
74
|
-
result_hash[:private_data].
|
79
|
+
expect(result_hash[:private_data]).to eq(core.private.data)
|
75
80
|
end
|
76
81
|
|
77
82
|
it 'should produce a hash with the name of the private type' do
|
78
|
-
result_hash[:private_type].
|
83
|
+
expect(result_hash[:private_type]).to eq(core.private.type)
|
79
84
|
end
|
80
85
|
end
|
81
86
|
|
@@ -84,84 +89,94 @@ describe Metasploit::Credential::Exporter::Core do
|
|
84
89
|
let(:result_hash) { core_exporter.line_for_login(login) }
|
85
90
|
|
86
91
|
it 'should produce values in the proper order' do
|
87
|
-
result_hash.values.
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
92
|
+
expect(result_hash.values).to eq(
|
93
|
+
[
|
94
|
+
core.public.username,
|
95
|
+
core.private.type,
|
96
|
+
core.private.data,
|
97
|
+
core.realm.key,
|
98
|
+
core.realm.value,
|
99
|
+
login.service.host.address,
|
100
|
+
login.service.port,
|
101
|
+
login.service.name,
|
102
|
+
login.service.proto,
|
103
|
+
login.status,
|
104
|
+
login.access_level,
|
105
|
+
login.last_attempted_at
|
106
|
+
]
|
107
|
+
)
|
93
108
|
end
|
94
109
|
|
95
110
|
it 'should produce a hash with the service host address' do
|
96
|
-
result_hash[:host_address].
|
111
|
+
expect(result_hash[:host_address]).to eq(login.service.host.address.to_s)
|
97
112
|
end
|
98
113
|
|
99
114
|
it 'should produce a hash with the service port' do
|
100
|
-
result_hash[:service_port].
|
115
|
+
expect(result_hash[:service_port]).to eq(login.service.port)
|
101
116
|
end
|
102
117
|
|
103
118
|
it 'should produce a hash with the service name' do
|
104
|
-
result_hash[:service_name].
|
119
|
+
expect(result_hash[:service_name]).to eq(login.service.name)
|
105
120
|
end
|
106
121
|
|
107
122
|
it 'should produce a hash with the service protocol' do
|
108
|
-
result_hash[:service_protocol].
|
123
|
+
expect(result_hash[:service_protocol]).to eq(login.service.proto)
|
109
124
|
end
|
110
125
|
|
111
126
|
it 'should produce a hash with the login status' do
|
112
|
-
result_hash[:status].
|
127
|
+
expect(result_hash[:status]).to eq(login.status)
|
113
128
|
end
|
114
129
|
|
115
130
|
it 'should produce a hash with the login access_level' do
|
116
|
-
result_hash[:access_level].
|
131
|
+
expect(result_hash[:access_level]).to eq(login.access_level)
|
117
132
|
end
|
118
133
|
|
119
134
|
it 'should produce a hash with the login last_attempted_at' do
|
120
|
-
result_hash[:last_attempted_at].
|
135
|
+
expect(result_hash[:last_attempted_at]).to eq(login.last_attempted_at)
|
121
136
|
end
|
122
137
|
|
123
138
|
it 'should produce a hash with the public information' do
|
124
|
-
result_hash[:username].
|
139
|
+
expect(result_hash[:username]).to eq(login.core.public.username)
|
125
140
|
end
|
126
141
|
|
127
142
|
it 'should produce a hash with the private data' do
|
128
|
-
result_hash[:private_data].
|
143
|
+
expect(result_hash[:private_data]).to eq(login.core.private.data)
|
129
144
|
end
|
130
145
|
|
131
146
|
it 'should produce a hash with the demodulized name of the private type' do
|
132
|
-
result_hash[:private_type].
|
147
|
+
expect(result_hash[:private_type]).to eq(login.core.private.type)
|
133
148
|
end
|
134
149
|
end
|
135
150
|
|
136
151
|
describe "#output" do
|
137
152
|
it 'should be a writable File' do
|
138
153
|
file_stat = core_exporter.output.stat
|
139
|
-
file_stat.
|
154
|
+
expect(file_stat).to be_writable
|
140
155
|
end
|
141
156
|
|
142
157
|
it 'should not be opened in binmode' do
|
143
|
-
core_exporter.output.
|
158
|
+
expect(core_exporter.output).not_to be_binmode
|
144
159
|
end
|
145
160
|
end
|
146
161
|
|
147
162
|
describe "#output_directory_path" do
|
148
163
|
it 'should be in the platform-agnostic temp directory' do
|
149
|
-
core_exporter.output_final_directory_path.
|
164
|
+
expect(core_exporter.output_final_directory_path).to include(Dir.tmpdir)
|
150
165
|
end
|
151
166
|
|
152
167
|
it 'should have the set export prefix' do
|
153
|
-
core_exporter.output_final_directory_path.
|
168
|
+
expect(core_exporter.output_final_directory_path).to include(Metasploit::Credential::Exporter::Core::TEMP_ZIP_PATH_PREFIX)
|
154
169
|
end
|
155
170
|
|
156
171
|
describe "uniqueness for export" do
|
157
172
|
let(:path_fragment){ "export-#{Time.now.to_s}" }
|
158
173
|
|
159
174
|
before(:each) do
|
160
|
-
core_exporter.
|
175
|
+
allow(core_exporter).to receive(:output_final_subdirectory_name).and_return(path_fragment)
|
161
176
|
end
|
162
177
|
|
163
178
|
it 'should include a special time-stamped directory to contain the export data being staged' do
|
164
|
-
core_exporter.output_final_directory_path.
|
179
|
+
expect(core_exporter.output_final_directory_path).to include(core_exporter.output_final_subdirectory_name)
|
165
180
|
end
|
166
181
|
end
|
167
182
|
end
|
@@ -169,44 +184,44 @@ describe Metasploit::Credential::Exporter::Core do
|
|
169
184
|
describe "#data" do
|
170
185
|
describe "in LOGIN_MODE" do
|
171
186
|
before(:each) do
|
172
|
-
core_exporter.
|
187
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::LOGIN_MODE
|
173
188
|
end
|
174
189
|
|
175
190
|
describe "when whitelist_ids is present" do
|
176
191
|
before(:each) do
|
177
|
-
core_exporter.
|
192
|
+
allow(core_exporter).to receive(:whitelist_ids).and_return([login1.id])
|
178
193
|
end
|
179
194
|
|
180
195
|
it 'should contain only those objects whose IDs are in the whitelist' do
|
181
|
-
core_exporter.data.
|
196
|
+
expect(core_exporter.data).not_to include(login2)
|
182
197
|
end
|
183
198
|
end
|
184
199
|
|
185
200
|
describe "when whitelist_ids is blank" do
|
186
201
|
it 'should be the same as #export_data' do
|
187
|
-
core_exporter.data.
|
202
|
+
expect(core_exporter.data).to eq(core_exporter.export_data)
|
188
203
|
end
|
189
204
|
end
|
190
205
|
end
|
191
206
|
|
192
207
|
describe "in CORE_MODE" do
|
193
208
|
before(:each) do
|
194
|
-
core_exporter.
|
209
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::CORE_MODE
|
195
210
|
end
|
196
211
|
|
197
212
|
describe "when whitelist_ids is present" do
|
198
213
|
before(:each) do
|
199
|
-
core_exporter.
|
214
|
+
allow(core_exporter).to receive(:whitelist_ids).and_return([core1.id])
|
200
215
|
end
|
201
216
|
|
202
217
|
it 'should contain only those objects whose IDs are in the whitelist' do
|
203
|
-
core_exporter.data.
|
218
|
+
expect(core_exporter.data).not_to include(core2)
|
204
219
|
end
|
205
220
|
end
|
206
221
|
|
207
222
|
describe "when whitelist_ids is blank" do
|
208
223
|
it 'should be the same as #export_data' do
|
209
|
-
core_exporter.data.
|
224
|
+
expect(core_exporter.data).to eq(core_exporter.export_data)
|
210
225
|
end
|
211
226
|
end
|
212
227
|
end
|
@@ -215,22 +230,22 @@ describe Metasploit::Credential::Exporter::Core do
|
|
215
230
|
describe "#export_data" do
|
216
231
|
describe "in CORE_MODE" do
|
217
232
|
before(:each) do
|
218
|
-
core_exporter.
|
233
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::CORE_MODE
|
219
234
|
end
|
220
235
|
|
221
236
|
it 'should grab data using the proper scope' do
|
222
|
-
Metasploit::Credential::Core.
|
237
|
+
expect(Metasploit::Credential::Core).to receive(:workspace_id).with(core_exporter.workspace.id)
|
223
238
|
core_exporter.export_data
|
224
239
|
end
|
225
240
|
end
|
226
241
|
|
227
242
|
describe "in LOGIN_MODE" do
|
228
243
|
before(:each) do
|
229
|
-
core_exporter.
|
244
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::LOGIN_MODE
|
230
245
|
end
|
231
246
|
|
232
247
|
it 'should grab data using the proper scope' do
|
233
|
-
Metasploit::Credential::Login.
|
248
|
+
expect(Metasploit::Credential::Login).to receive(:in_workspace_including_hosts_and_services).with(core_exporter.workspace)
|
234
249
|
core_exporter.export_data
|
235
250
|
end
|
236
251
|
end
|
@@ -240,7 +255,7 @@ describe Metasploit::Credential::Exporter::Core do
|
|
240
255
|
describe "#render_manifest_and_output_keys" do
|
241
256
|
describe "in CORE_MODE" do
|
242
257
|
before(:each) do
|
243
|
-
core_exporter.
|
258
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::CORE_MODE
|
244
259
|
core_exporter.render_manifest_output_and_keys
|
245
260
|
path = core_exporter.output_final_directory_path + '/' + Metasploit::Credential::Importer::Zip::MANIFEST_FILE_NAME
|
246
261
|
|
@@ -260,34 +275,34 @@ describe Metasploit::Credential::Exporter::Core do
|
|
260
275
|
end
|
261
276
|
|
262
277
|
it 'should contain the Public#username for all Core objects' do
|
263
|
-
@core_publics.
|
264
|
-
@core_publics.
|
278
|
+
expect(@core_publics).to include(core1.public.username)
|
279
|
+
expect(@core_publics).to include(core2.public.username)
|
265
280
|
end
|
266
281
|
|
267
282
|
it 'should contain the Private#type for all Core objects' do
|
268
|
-
@core_private_types.
|
269
|
-
@core_private_types.
|
283
|
+
expect(@core_private_types).to include(core1.private.type)
|
284
|
+
expect(@core_private_types).to include(core2.private.type)
|
270
285
|
end
|
271
286
|
|
272
287
|
it 'should contain the Private#data for all Core objects' do
|
273
|
-
@core_private_data.
|
274
|
-
@core_private_data.
|
288
|
+
expect(@core_private_data).to include(core1.private.data)
|
289
|
+
expect(@core_private_data).to include(core2.private.data)
|
275
290
|
end
|
276
291
|
|
277
292
|
it 'should contain the Realm#key for all Core objects' do
|
278
|
-
@core_realm_keys.
|
279
|
-
@core_realm_keys.
|
293
|
+
expect(@core_realm_keys).to include(core1.realm.key)
|
294
|
+
expect(@core_realm_keys).to include(core2.realm.key)
|
280
295
|
end
|
281
296
|
|
282
297
|
it 'should contain the Realm#value for all Core objects' do
|
283
|
-
@core_realm_values.
|
284
|
-
@core_realm_values.
|
298
|
+
expect(@core_realm_values).to include(core1.realm.value)
|
299
|
+
expect(@core_realm_values).to include(core2.realm.value)
|
285
300
|
end
|
286
301
|
end
|
287
302
|
|
288
303
|
describe "in LOGIN_MODE" do
|
289
304
|
before(:each) do
|
290
|
-
core_exporter.
|
305
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::LOGIN_MODE
|
291
306
|
core_exporter.render_manifest_output_and_keys
|
292
307
|
path = core_exporter.output_final_directory_path + '/' + Metasploit::Credential::Importer::Zip::MANIFEST_FILE_NAME
|
293
308
|
|
@@ -316,47 +331,47 @@ describe Metasploit::Credential::Exporter::Core do
|
|
316
331
|
|
317
332
|
|
318
333
|
it 'should contain the Public#username for all Login objects' do
|
319
|
-
@login_publics.
|
320
|
-
@login_publics.
|
334
|
+
expect(@login_publics).to include(login1.core.public.username)
|
335
|
+
expect(@login_publics).to include(login2.core.public.username)
|
321
336
|
end
|
322
337
|
|
323
338
|
it 'should contain the Private#type for all Login objects' do
|
324
|
-
@login_private_types.
|
325
|
-
@login_private_types.
|
339
|
+
expect(@login_private_types).to include(login1.core.private.type)
|
340
|
+
expect(@login_private_types).to include(login2.core.private.type)
|
326
341
|
end
|
327
342
|
|
328
343
|
it 'should contain the Private#data for all Login objects' do
|
329
|
-
@login_private_data.
|
330
|
-
@login_private_data.
|
344
|
+
expect(@login_private_data).to include(login1.core.private.data)
|
345
|
+
expect(@login_private_data).to include(login2.core.private.data)
|
331
346
|
end
|
332
347
|
|
333
348
|
it 'should contain the Realm#key for all Login objects' do
|
334
|
-
@login_realm_keys.
|
335
|
-
@login_realm_keys.
|
349
|
+
expect(@login_realm_keys).to include(login1.core.realm.key)
|
350
|
+
expect(@login_realm_keys).to include(login2.core.realm.key)
|
336
351
|
end
|
337
352
|
|
338
353
|
it 'should contain the Realm#value for all Login objects' do
|
339
|
-
@login_realm_values.
|
340
|
-
@login_realm_values.
|
354
|
+
expect(@login_realm_values).to include(login1.core.realm.value)
|
355
|
+
expect(@login_realm_values).to include(login2.core.realm.value)
|
341
356
|
end
|
342
357
|
|
343
358
|
it 'should contain the associated Mdm::Host#address for all Login objects' do
|
344
|
-
@login_host_addresses.
|
359
|
+
expect(@login_host_addresses).to include(login1.service.host.address.to_s, login2.service.host.address.to_s)
|
345
360
|
end
|
346
361
|
|
347
362
|
it 'should contain the associated Mdm::Service#port (stringified) for all Login objects' do
|
348
|
-
@login_service_ports.
|
349
|
-
@login_service_ports.
|
363
|
+
expect(@login_service_ports).to include(login1.service.port.to_s)
|
364
|
+
expect(@login_service_ports).to include(login2.service.port.to_s)
|
350
365
|
end
|
351
366
|
|
352
367
|
it 'should contain the associated Mdm::Service#name for all Login objects' do
|
353
|
-
@login_service_names.
|
354
|
-
@login_service_names.
|
368
|
+
expect(@login_service_names).to include(login1.service.name)
|
369
|
+
expect(@login_service_names).to include(login2.service.name)
|
355
370
|
end
|
356
371
|
|
357
372
|
it 'should contain the associated Mdm::Service#proto for all Login objects' do
|
358
|
-
@login_service_protocols.
|
359
|
-
@login_service_protocols.
|
373
|
+
expect(@login_service_protocols).to include(login1.service.proto)
|
374
|
+
expect(@login_service_protocols).to include(login2.service.proto)
|
360
375
|
end
|
361
376
|
end
|
362
377
|
end
|
@@ -364,7 +379,7 @@ describe Metasploit::Credential::Exporter::Core do
|
|
364
379
|
describe "#render_zip" do
|
365
380
|
describe "when there are no SSH keys in the dataset" do
|
366
381
|
before(:each) do
|
367
|
-
core_exporter.
|
382
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::CORE_MODE
|
368
383
|
core_exporter.render_manifest_output_and_keys
|
369
384
|
core_exporter.render_zip
|
370
385
|
end
|
@@ -374,7 +389,7 @@ describe Metasploit::Credential::Exporter::Core do
|
|
374
389
|
Zip::File.open(core_exporter.output_zipfile_path) do |zip_file|
|
375
390
|
manifest_entry = zip_file.glob(Metasploit::Credential::Importer::Zip::MANIFEST_FILE_NAME).first
|
376
391
|
end
|
377
|
-
manifest_entry.
|
392
|
+
expect(manifest_entry).not_to be_blank
|
378
393
|
end
|
379
394
|
|
380
395
|
it 'should not contain a keys directory' do
|
@@ -382,7 +397,7 @@ describe Metasploit::Credential::Exporter::Core do
|
|
382
397
|
Zip::File.open(core_exporter.output_zipfile_path) do |zip_file|
|
383
398
|
keys_entry = zip_file.glob(Metasploit::Credential::Importer::Zip::KEYS_SUBDIRECTORY_NAME).first
|
384
399
|
end
|
385
|
-
keys_entry.
|
400
|
+
expect(keys_entry).to be_blank
|
386
401
|
end
|
387
402
|
end
|
388
403
|
|
@@ -395,7 +410,7 @@ describe Metasploit::Credential::Exporter::Core do
|
|
395
410
|
workspace: workspace)}
|
396
411
|
|
397
412
|
before(:each) do
|
398
|
-
core_exporter.
|
413
|
+
allow(core_exporter).to receive(:mode).and_return Metasploit::Credential::Exporter::Core::CORE_MODE
|
399
414
|
core_exporter.render_manifest_output_and_keys
|
400
415
|
core_exporter.render_zip
|
401
416
|
end
|
@@ -405,7 +420,7 @@ describe Metasploit::Credential::Exporter::Core do
|
|
405
420
|
Zip::File.open(core_exporter.output_zipfile_path) do |zip_file|
|
406
421
|
manifest_entry = zip_file.glob(Metasploit::Credential::Importer::Zip::MANIFEST_FILE_NAME).first
|
407
422
|
end
|
408
|
-
manifest_entry.
|
423
|
+
expect(manifest_entry).not_to be_blank
|
409
424
|
end
|
410
425
|
|
411
426
|
it 'should contain a keys directory' do
|
@@ -413,7 +428,7 @@ describe Metasploit::Credential::Exporter::Core do
|
|
413
428
|
Zip::File.open(core_exporter.output_zipfile_path) do |zip_file|
|
414
429
|
keys_entry = zip_file.glob(Metasploit::Credential::Importer::Zip::KEYS_SUBDIRECTORY_NAME).first
|
415
430
|
end
|
416
|
-
keys_entry.
|
431
|
+
expect(keys_entry).not_to be_blank
|
417
432
|
end
|
418
433
|
|
419
434
|
describe "the keys directory" do
|
@@ -425,12 +440,12 @@ describe Metasploit::Credential::Exporter::Core do
|
|
425
440
|
end
|
426
441
|
|
427
442
|
it 'should contain a key for each SSH private in the export' do
|
428
|
-
@key_entries.size.
|
443
|
+
expect(@key_entries.size).to eq(core_exporter.data[:core].select{ |d| d.private.type == Metasploit::Credential::SSHKey.name }.size)
|
429
444
|
end
|
430
445
|
|
431
446
|
it 'should contain key files named with Public#username and Private#id for each Core that uses an SSHKey' do
|
432
447
|
key_names = @key_entries.map{ |e| e.to_s.gsub("#{Metasploit::Credential::Importer::Zip::KEYS_SUBDIRECTORY_NAME}/", '') }
|
433
|
-
key_names.
|
448
|
+
expect(key_names).to include("#{core_with_key.public.username}-#{core_with_key.private.id}")
|
434
449
|
end
|
435
450
|
|
436
451
|
end
|