Skip to content

Commit 7909f2f

Browse files
Merge pull request #1635 from nccgroup/develop
Release 5.14.0
2 parents 7feb470 + 4194142 commit 7909f2f

File tree

122 files changed

+2752
-210
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+2752
-210
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ The following cloud providers are currently supported:
3030
- Alibaba Cloud (alpha)
3131
- Oracle Cloud Infrastructure (alpha)
3232
- Kubernetes clusters on a cloud provider (alpha)
33+
- DigitalOcean Cloud (alpha)
3334

3435
## Installation
3536

ScoutSuite/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
__author__ = 'NCC Group'
2-
__version__ = '5.13.0'
2+
__version__ = '5.14.0'
33

44
ERRORS_LIST = []
55

ScoutSuite/__main__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ def run_from_cli():
6161
kubernetes_context=args.get('kubernetes_context'),
6262
kubernetes_persist_config=args.get('kubernetes_persist_config'),
6363
kubernetes_azure_subscription_id=args.get('kubernetes_azure_subscription_id'),
64+
#DigitalOcean
65+
token=args.get('token'),
66+
access_key=args.get('access_key'),
67+
access_secret=args.get('access_secret'),
6468
# General
6569
report_name=args.get('report_name'), report_dir=args.get('report_dir'),
6670
timestamp=args.get('timestamp'),
@@ -113,6 +117,10 @@ def run(provider,
113117
kubernetes_context=None,
114118
kubernetes_persist_config=True,
115119
kubernetes_azure_subscription_id=None,
120+
#DigitalOcean
121+
token=None,
122+
access_key=None,
123+
access_secret=None,
116124
# General
117125
report_name=None, report_dir=None,
118126
timestamp=False,
@@ -171,6 +179,10 @@ async def _run(provider,
171179
kubernetes_context,
172180
kubernetes_persist_config,
173181
kubernetes_azure_subscription_id,
182+
#DigitalOcean
183+
token,
184+
access_key,
185+
access_secret,
174186
# General
175187
report_name, report_dir,
176188
timestamp,
@@ -221,6 +233,11 @@ async def _run(provider,
221233
access_key_id=access_key_id,
222234
access_key_secret=access_key_secret,
223235

236+
#DigitalOcean
237+
token=token,
238+
access_key=access_key,
239+
access_secret=access_secret,
240+
224241
# Kubernetes
225242
kubernetes_cluster_provider=kubernetes_cluster_provider,
226243
kubernetes_config_file=kubernetes_config_file,

ScoutSuite/core/cli_parser.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def __init__(self):
3030
self._init_aliyun_parser()
3131
self._init_oci_parser()
3232
self._init_kubernetes_parser()
33+
self._init_do_parser()
3334

3435
def _init_aws_parser(self):
3536
parser = self.subparsers.add_parser("aws",
@@ -254,6 +255,32 @@ def _init_oci_parser(self):
254255
dest='profile',
255256
default=None,
256257
help='Name of the profile')
258+
259+
def _init_do_parser(self):
260+
do_parser = self.subparsers.add_parser("do",
261+
parents=[self.common_providers_args_parser],
262+
help="Run Scout against an DigitalOcean account")
263+
264+
parser = do_parser.add_argument_group('Authentication parameters')
265+
266+
parser.add_argument('-t',
267+
'--token',
268+
action='store',
269+
default=None,
270+
dest='token',
271+
help='DO Token')
272+
273+
parser.add_argument('--access_key',
274+
action='store',
275+
default=None,
276+
dest='access_key',
277+
help='Spaces Access Key ID')
278+
parser.add_argument('--access_secret',
279+
action='store',
280+
default=None,
281+
dest='access_secret',
282+
help='Spaces Secret Access Key')
283+
257284

258285
def _init_kubernetes_parser(self):
259286
kubernetes_parser = self.subparsers.add_parser("kubernetes",
@@ -436,6 +463,11 @@ def parse_args(self, args=None):
436463
if v.get('subscription_ids') and v.get('all_subscriptions'):
437464
self.parser.error('--subscription-ids and --all-subscriptions are mutually exclusive options')
438465

466+
# DigitalOcean
467+
if v.get('provider') == 'do':
468+
if (v.get('access_key') or v.get('access_secret')) and not (v.get('access_key') and v.get('access_secret')):
469+
self.parser.error('For DO Spaces service please provide both --access_key and --access_secret')
470+
439471
# Kubernetes
440472
elif v.get('provider') == 'kubernetes':
441473
cluster_provider = v.get('kubernetes_cluster_provider')

ScoutSuite/core/conditions.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,13 @@ def pass_condition(b, test, a):
115115

116116
# Dictionary keys tests
117117
elif test == 'withKey':
118-
result = (a in b)
118+
result = a in b
119119
elif test == 'withoutKey':
120120
result = a not in b
121+
elif test == 'withKeyCaseInsensitive':
122+
result = a.lower() in map(str.lower, b)
123+
elif test == 'withoutKeyCaseInsensitive':
124+
result = a.lower() not in map(str.lower, b)
121125

122126
# String test
123127
elif test == 'containString':
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!-- EC2 regional settings partial -->
2+
<script id="services.ec2.regions.id.regional_settings.partial" type="text/x-handlebars-template">
3+
<div id="resource-name" class="list-group-item active">
4+
<h4 class="list-group-item-heading">{{region}}</h4>
5+
</div>
6+
<div class="list-group-item">
7+
<h4 class="list-group-item-heading">Regional settings</h4>
8+
<ul>
9+
<li class="list-group-item-text">Encryption enabled for EBS Volumes by default: <span id="ec2.regions.{{region}}.regional_settings.{{@key}}.NoDefaultEBSEncryption"><samp>{{ebs_encryption_default}}</samp></span></li>
10+
<li class="list-group-item-text">Default encryption key: <span id="ec2.regions.{{region}}.regional_settings.{{@key}}.ebs_default_encryption_key"><samp>{{ebs_default_encryption_key_id}}</samp></span></li>
11+
</ul>
12+
</div>
13+
</script>
14+
15+
<script>
16+
Handlebars.registerPartial("services.ec2.regions.id.regional_settings", $("#services\\.ec2\\.regions\\.id\\.regional_settings\\.partial").html());
17+
</script>
18+
19+
<!-- Single region template -->
20+
<!-- **UNTESTED** Intended for details popups. Not used at this time. -->
21+
<script id="single_ec2_region-template" type="text/x-handlebars-template">
22+
{{> modal-template template='services.ec2.regions.id.regional_settings'}}
23+
</script>
24+
<script>
25+
var single_ec2_region_template = Handlebars.compile($("#single_ec2_region-template").html());
26+
</script>

ScoutSuite/output/data/html/partials/aws/services.ec2.regions.id.volumes.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,15 @@
44
<h4 class="list-group-item-heading">{{name}}</h4>
55
</div>
66
<div class="list-group-item">
7-
<h4 class="list-group-item-heading">Attributes</h4>
8-
{{> generic_object this}}
7+
<h4 class="list-group-item-heading">Information</h4>
8+
<div class="list-group-item-text item-margin">ID: <span id="ec2.regions.{{region}}.volumes.{{@key}}.id"><samp>{{value_or_none id}}</samp></span></div>
9+
<div class="list-group-item-text item-margin">ARN: <span id="ec2.regions.{{region}}.volumes.{{@key}}.arn"><samp>{{value_or_none arn}}</samp></span></div>
10+
<div class="list-group-item-text item-margin">Name: <span id="ec2.regions.{{region}}.volumes.{{@key}}.name"><samp>{{value_or_none name}}</samp></span></div>
11+
<div class="list-group-item-text item-margin">State: <span id="ec2.regions.{{region}}.volumes.{{@key}}.state"><samp>{{value_or_none State}}</samp></span></div>
12+
<div class="list-group-item-text item-margin">Size: <span id="ec2.regions.{{region}}.volumes.{{@key}}.size"><samp>{{value_or_none Size}} GiB</samp></span></div>
13+
<div class="list-group-item-text item-margin">Volume Type: <span id="ec2.regions.{{region}}.volumes.{{@key}}.volume_type"><samp>{{value_or_none VolumeType}}</samp></span></div>
14+
<div class="list-group-item-text item-margin">Create Time: <span id="ec2.regions.{{region}}.volumes.{{@key}}.create_time"><samp>{{value_or_none CreateTime}}</samp></span></div>
15+
<div class="list-group-item-text item-margin">Encryption: <span id="ec2.regions.{{region}}.volumes.{{@key}}.encrypted">{{convert_bool_to_enabled Encrypted}}</span></div>
916
</div>
1017
</script>
1118

ScoutSuite/output/data/html/partials/aws/services.iam.credential_reports.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ <h4 class="list-group-item-heading">{{name}}</h4>
88
<h4 class="list-group-item-heading">Credentials Report</h4>
99
<div class="list-group-item-text item-margin">Creation Date: {{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'user_creation_time')}}</div>
1010
<div class="list-group-item-text item-margin">Last Used Date: <span id="iam.credential_reports.{{@key}}.inactive_user">{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'last_used')}}</span></div>
11-
<div class="list-group-item-text item-margin">Password Enabled: <span class="iam.credential_reports.{{@key}}.unused_credentials"><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'password_enabled'}}</samp></span></div>
12-
<div class="list-group-item-text item-margin">Password Last Used: <span class="iam.credential_reports.{{@key}}.unused_credentials" id="iam.credential_reports.{{@key}}.password_last_used">{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'password_last_used')}}</span></div>
11+
<div class="list-group-item-text item-margin">Password Enabled: <span {{#ifEqual password_enabled 'true'}}class="iam.credential_reports.{{@key}}.unused_credentials"{{/ifEqual}}><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'password_enabled'}}</samp></span></div>
12+
<div class="list-group-item-text item-margin">Password Last Used: <span {{#ifEqual password_enabled 'true'}}class="iam.credential_reports.{{@key}}.unused_credentials"{{/ifEqual}} id="iam.credential_reports.{{@key}}.password_last_used">{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'password_last_used')}}</span></div>
1313
<div class="list-group-item-text item-margin">Password Last Changed: <span>{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'password_last_changed')}}</span></div>
1414
<div class="list-group-item-text item-margin">MFA Active: <span id="iam.credential_reports.{{@key}}.mfa_active"><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'mfa_active'}}</samp></span></div>
1515
<div class="list-group-item-text item-margin">Hardware MFA Active: <span id="iam.credential_reports.{{@key}}.mfa_active_hardware"><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'mfa_active_hardware'}}</samp></span></div>
16-
<div class="list-group-item-text item-margin">Access Key 1 Active: <span class="iam.credential_reports.{{@key}}.unused_credentials" id="iam.credential_reports.{{@key}}.access_key_1_active"><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_1_active'}}</samp></span></div>
17-
<div class="list-group-item-text item-margin">Access Key 1 Last Used: <span class="iam.credential_reports.{{@key}}.unused_credentials" class="iam.credential_reports.{{@key}}.unused_access_key">{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_1_last_used_date')}}</span></div>
16+
<div class="list-group-item-text item-margin">Access Key 1 Active: <span {{#ifEqual access_key_1_active 'true'}}class="iam.credential_reports.{{@key}}.unused_credentials"{{/ifEqual}} id="iam.credential_reports.{{@key}}.access_key_1_active"><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_1_active'}}</samp></span></div>
17+
<div class="list-group-item-text item-margin">Access Key 1 Last Used: <span {{#ifEqual access_key_1_active 'true'}}class="iam.credential_reports.{{@key}}.unused_credentials"{{/ifEqual}} class="iam.credential_reports.{{@key}}.unused_access_key">{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_1_last_used_date')}}</span></div>
1818
<div class="list-group-item-text item-margin">Access Key 1 Last Rotated: <span>{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_1_last_rotated')}}</span></div>
19-
<div class="list-group-item-text item-margin">Access Key 2 Active: <span class="iam.credential_reports.{{@key}}.unused_credentials" id="iam.credential_reports.{{@key}}.access_key_2_active"><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_2_active'}}</samp></span></div>
20-
<div class="list-group-item-text item-margin">Access Key 2 Last Used: <span class="iam.credential_reports.{{@key}}.unused_credentials" class="iam.credential_reports.{{@key}}.unused_access_key">{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_2_last_used_date')}}</span></div>
19+
<div class="list-group-item-text item-margin">Access Key 2 Active: <span {{#ifEqual access_key_2_active 'true'}}class="iam.credential_reports.{{@key}}.unused_credentials"{{/ifEqual}} id="iam.credential_reports.{{@key}}.access_key_2_active"><samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_2_active'}}</samp></span></div>
20+
<div class="list-group-item-text item-margin">Access Key 2 Last Used: <span {{#ifEqual access_key_2_active 'true'}}class="iam.credential_reports.{{@key}}.unused_credentials"{{/ifEqual}} class="iam.credential_reports.{{@key}}.unused_access_key">{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_2_last_used_date')}}</span></div>
2121
<div class="list-group-item-text item-margin">Access Key 2 Last Rotated: <span>{{ format_date (getValueAt 'services' 'iam' 'credential_reports' @key 'access_key_2_last_rotated')}}</span></div>
2222
<div class="list-group-item-text item-margin">Signing Cert 1 Active: <samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'cert_1_active'}}</samp></div>
2323
<div class="list-group-item-text item-margin">Signing Cert 2 Active: <samp>{{getValueAt 'services' 'iam' 'credential_reports' @key 'cert_2_active'}}</samp></div>

ScoutSuite/output/data/html/partials/azure/services.storageaccounts.subscriptions.id.storage_accounts.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ <h4 class="list-group-item-heading">Information</h4>
1010
<div class="list-group-item-text item-margin">Public Traffic: <span id="storageaccounts.subscriptions.{{@../key}}.storage_accounts.{{@key}}.public_traffic_allowed">{{convert_bool_to_enabled public_traffic_allowed }}</span></div>
1111
<div class="list-group-item-text item-margin">HTTPS Required: <span id="storageaccounts.subscriptions.{{@../key}}.storage_accounts.{{@key}}.https_traffic_enabled">{{convert_bool_to_enabled https_traffic_enabled}}</span></div>
1212
<div class="list-group-item-text item-margin">Microsoft Trusted Services: <span id="storageaccounts.subscriptions.{{@../key}}.storage_accounts.{{@key}}.trusted_microsoft_services_enabled">{{convert_bool_to_enabled trusted_microsoft_services_enabled }}</span></div>
13+
<div class="list-group-item-text item-margin">Access Key Usage: <span id="storageaccounts.subscriptions.{{@../key}}.storage_accounts.{{@key}}.shared_key_access_allowed">{{convert_bool_to_enabled shared_key_access_allowed}}</span></div>
1314
<div class="list-group-item-text item-margin">Last Access Key Rotation:
1415
<span id="storageaccounts.subscriptions.{{@../key}}.storage_accounts.{{@key}}.access_keys_rotated">
1516
{{#if access_keys_last_rotation_date }}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!-- database databases -->
2+
<script id="services.database.databases.partial" type="text/x-handlebars-template">
3+
<div id="resource-name" class="list-group-item active">
4+
<h4 class="list-group-item-heading">{{name}}</h4>
5+
</div>
6+
<div class="list-group-item">
7+
<h4 class="list-group-item-heading">Information</h4>
8+
<div class="list-group-item-text item-margin">Id: <span id="database.databases.{{@key}}.id"><samp>{{value_or_none id}}</samp></span></div>
9+
<div class="list-group-item-text item-margin">Name: <span id="database.databases.{{@key}}.name"><samp>{{value_or_none name}}</samp></span></div>
10+
<div class="list-group-item-text item-margin">Engine: <span id="database.databases.{{@key}}.engine"><samp>{{value_or_none engine}}</samp></span></div>
11+
<div class="list-group-item-text item-margin">Version: <span id="database.databases.{{@key}}.version"><samp>{{value_or_none version}}</samp></span></div>
12+
<div class="list-group-item-text item-margin">Semantic Version: <span id="database.databases.{{@key}}.semantic_version">
13+
<samp>{{value_or_none semantic_version}}</samp></span></div>
14+
<div class="list-group-item-text item-margin">Connection Pools: <span id="database.databases.{{@key}}.connection_pools"><samp>{{value_or_none connection_pools}}</samp></span></div>
15+
<div class="list-group-item-text item-margin">Eviciton Policy: <span id="database.databases.{{@key}}.eviction_policy"><samp>{{value_or_none eviction_policy}}</samp></span></div>
16+
<div class="list-group-item-text item-margin">Legacy Password encryption: <span id="database.databases.{{@key}}.legacy_encryption_users"><samp>{{value_or_none legacy_encryption_users}}</samp></span></div>
17+
<div class="list-group-item-text item-margin">Tags: <span id="database.databases.{{@key}}.tags"><samp>{{value_or_none tags}}</samp></span></div>
18+
<div class="list-group-item-text item-margin">Databases: <span id="database.databases.{{@key}}.databases"><samp>{{value_or_none databases}}</samp></span></div>
19+
<div class="list-group-item-text item-margin">Trusted Sources: <span id="database.databases.{{@key}}.trusted_sources"><samp>{{value_or_none trusted_resources}}</samp></span></div>
20+
</div>
21+
</script>
22+
23+
<script>
24+
Handlebars.registerPartial("services.database.databases", $("#services\\.database\\.databases\\.partial").html());
25+
</script>
26+
27+
<!-- Single database database template -->
28+
<script id="single_database_database-template" type="text/x-handlebars-template">
29+
{{> modal-template template='services.database.databases'}}
30+
</script>
31+
<script>
32+
var single_database_database_template = Handlebars.compile($("#single_database_database-template").html());
33+
</script>

0 commit comments

Comments
 (0)