Skip to content

Commit 76c59ad

Browse files
authored
Merge pull request nccgroup#508 from nccgroup/develop
release/5.4.0
2 parents 7116810 + fdd7974 commit 76c59ad

21 files changed

+139
-70
lines changed

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.3.3'
2+
__version__ = '5.4.0'
33

44
ERRORS_LIST = []
55

ScoutSuite/core/cli_parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def _init_aws_parser(self):
3838
aws_parser = parser.add_argument_group('Authentication modes')
3939
aws_auth_params = parser.add_argument_group('Authentication parameters')
4040

41-
aws_auth_modes = aws_parser.add_mutually_exclusive_group(required=True)
41+
aws_auth_modes = aws_parser.add_mutually_exclusive_group(required=False)
4242

4343
aws_auth_modes.add_argument('-p',
4444
'--profile',

ScoutSuite/core/conditions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import netaddr
55
import re
66

7-
from iampoliciesgonewild import get_actions_from_statement, _expand_wildcard_action
7+
from policyuniverse.expander_minimizer import get_actions_from_statement, _expand_wildcard_action
88

99
from ScoutSuite.core.console import print_error, print_exception
1010

ScoutSuite/core/rule.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88

99
ip_ranges_from_args = 'ip-ranges-from-args'
1010

11-
re_aws_account_id = re.compile(r'_AWS_ACCOUNT_ID_')
11+
re_account_id = re.compile(r'_ACCOUNT_ID_')
1212
re_ip_ranges_from_file = re.compile(r'_IP_RANGES_FROM_FILE_\((.*?)(,.*?)\)')
1313
re_ip_ranges_from_local_file = re.compile(r'_IP_RANGES_FROM_LOCAL_FILE_\((.*?)(,.*?)\)')
1414
re_strip_dots = re.compile(r'(_STRIPDOTS_\((.*?)\))')
1515

1616
testcases = [
1717
{
18-
'name': 'aws_account_id',
19-
'regex': re_aws_account_id
18+
'name': 'account_id',
19+
'regex': re_account_id
2020
},
2121
{
2222
'name': 'ip_ranges_from_file',
Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,32 @@
1+
<!-- Lambda function partial -->
2+
<script id="services.awslambda.regions.id.functions.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">Description: <span id="awslambda.regions.{{region}}.functions.{{@key}}.description"><samp>{{value_or_none description}}</samp></span></div>
9+
<div class="list-group-item-text item-margin">Role: <span id="awslambda.regions.{{region}}.functions.{{@key}}.role"><samp>{{value_or_none role}}</samp></span></div>
10+
<div class="list-group-item-text item-margin">Last Modified: <span id="awslambda.regions.{{region}}.functions.{{@key}}.last_modified"><samp>{{format_date last_modified}}</samp></span></div>
11+
<div class="list-group-item-text item-margin">Runtime: <span id="awslambda.regions.{{region}}.functions.{{@key}}.runtime"><samp>{{value_or_none runtime}}</samp></span></div>
12+
<div class="list-group-item-text item-margin">Version: <span id="awslambda.regions.{{region}}.functions.{{@key}}.version"><samp>{{value_or_none version}}</samp></span></div>
13+
<div class="list-group-item-text item-margin">Revision ID: <span id="awslambda.regions.{{region}}.functions.{{@key}}.revision_id"><samp>{{value_or_none revision_id}}</samp></span></div>
14+
<div class="list-group-item-text item-margin">Code Sha256: <span id="awslambda.regions.{{region}}.functions.{{@key}}.code_sha256"><samp>{{value_or_none code_sha256}}</samp></span></div>
15+
<div class="list-group-item-text item-margin">Handler: <span id="awslambda.regions.{{region}}.functions.{{@key}}.handler"><samp>{{value_or_none handler}}</samp></span></div>
16+
<div class="list-group-item-text item-margin">Code Size: <span id="awslambda.regions.{{region}}.functions.{{@key}}.code_size"><samp>{{value_or_none code_size}}</samp></span></div>
17+
<div class="list-group-item-text item-margin">Memory Size: <span id="awslambda.regions.{{region}}.functions.{{@key}}.memory_size"><samp>{{value_or_none memory_size}}</samp></span></div>
18+
<div class="list-group-item-text item-margin">Timeout: <span id="awslambda.regions.{{region}}.functions.{{@key}}.timeout"><samp>{{value_or_none timeout}}</samp></span></div>
19+
</div>
20+
</script>
121

2-
<!-- Lambda function partial -->
3-
<script id="services.awslambda.regions.id.functions.partial" type="text/x-handlebars-template">
4-
<div class="list-group-item active">
5-
<h4 class="list-group-item-heading">{{name}}</h4>
6-
</div>
7-
<div class="list-group-item">
8-
<h4 class="list-group-item-heading">Attributes</h4>
9-
{{> generic_object resource}}
10-
</div>
11-
</script>
12-
<script>
13-
Handlebars.registerPartial("services.awslambda.regions.id.functions", $("#services\\.awslambda\\.regions\\.id\\.functions\\.partial").html());
14-
</script>
22+
<script>
23+
Handlebars.registerPartial("services.awslambda.regions.id.functions", $("#services\\.awslambda\\.regions\\.id\\.functions\\.partial").html());
24+
</script>
1525

26+
<!-- Single awslambda function template -->
27+
<script id="single_awslambda_function-template" type="text/x-handlebars-template">
28+
{{> modal-template template='services.awslambda.regions.id.functions'}}
29+
</script>
30+
<script>
31+
var single_awslambda_function_template = Handlebars.compile($("#single_awslambda_function-template").html());
32+
</script>

ScoutSuite/output/data/html/partials/aws/services.s3.buckets.html

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ <h4 class="list-group-item-heading">Information</h4>
1515
<div class="list-group-item-text item-margin">Secure transport: <span id="s3.buckets.{{@key}}.secure_transport_enabled">{{convert_bool_to_enabled secure_transport_enabled}}</span></div>
1616
<div class="list-group-item-text item-margin">Static website hosting: <span id="s3.buckets.{{@key}}.web_hosting_enabled">{{convert_bool_to_enabled web_hosting_enabled}}</span></div>
1717
</div>
18+
<div class="list-group-item">
19+
{{#if policy}}
20+
{{> accordion_policy name = 'Bucket Policy' document = policy policy_path = (concat 's3.buckets' @key 'policy')}}
21+
{{else}}
22+
<h4 class="list-group-item-heading accordion-heading text-secondary">Bucket Policy</h4>
23+
{{/if}}
24+
</div>
1825
{{> services.s3.acls resource_type = 'bucket' resource_path = (concat 's3.buckets' @key)}}
19-
{{#if policy}}
20-
<div class="list-group-item">
21-
{{> accordion_policy name = 'Bucket policy' document = policy policy_path = (concat 's3.buckets' @key 'policy')}}
22-
</div>
23-
{{/if}}
2426
{{> services.s3.bucket_iam_policies resource_type = 'groups' resource_count = groups_count}}
2527
{{> services.s3.bucket_iam_policies resource_type = 'roles' resource_count = roles_count}}
2628
{{> services.s3.bucket_iam_policies resource_type = 'users' resource_count = users_count}}

ScoutSuite/output/data/html/report.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
<!-- Fontawesome CSS -->
2222
<link href="inc-fontawesome/css/all.min.css" rel="stylesheet">
23+
<!-- Fallback fonts to solve CORS issue-->
24+
<link href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" rel="stylesheet">
2325
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
2426
<!--[if lt IE 9]>
2527
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>

ScoutSuite/providers/__init__.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
import sys
2-
3-
from ScoutSuite.providers.aws.provider import AWSProvider
4-
from ScoutSuite.providers.azure.provider import AzureProvider
5-
from ScoutSuite.providers.gcp.provider import GCPProvider
6-
from ScoutSuite.providers.aliyun.provider import AliyunProvider
7-
from ScoutSuite.providers.oci.provider import OracleProvider
8-
91
providers_dict = {'aws': 'AWSProvider',
102
'gcp': 'GCPProvider',
113
'azure': 'AzureProvider',
124
'aliyun': 'AliyunProvider',
135
'oci': 'OracleProvider'}
146

157

8+
def get_provider_object(provider):
9+
provider_class = providers_dict.get(provider)
10+
provider_module = __import__('ScoutSuite.providers.{}.provider'.format(provider), fromlist=[provider_class])
11+
provider_object = getattr(provider_module, provider_class)
12+
return provider_object
13+
14+
1615
def get_provider(provider,
1716
profile=None,
1817
project_id=None, folder_id=None, organization_id=None,
@@ -34,8 +33,7 @@ def get_provider(provider,
3433
services = [] if services is None else services
3534
skipped_services = [] if skipped_services is None else skipped_services
3635

37-
provider_class = providers_dict.get(provider)
38-
provider_object = getattr(sys.modules[__name__], provider_class)
36+
provider_object = get_provider_object(provider)
3937
provider_instance = provider_object(profile=profile,
4038
project_id=project_id,
4139
folder_id=folder_id,

ScoutSuite/providers/aws/authentication_strategy.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import boto3
2+
import logging
23

3-
from ScoutSuite.providers.base.authentication_strategy import AuthenticationStrategy, AuthenticationException
44
from ScoutSuite.providers.aws.utils import get_caller_identity
5+
from ScoutSuite.providers.base.authentication_strategy import AuthenticationStrategy, AuthenticationException
56

67

78
class AWSCredentials:
@@ -22,6 +23,11 @@ def authenticate(self,
2223

2324
try:
2425

26+
# Set logging level to error for libraries as otherwise generates a lot of warnings
27+
logging.getLogger('botocore').setLevel(logging.ERROR)
28+
logging.getLogger('botocore.auth').setLevel(logging.ERROR)
29+
logging.getLogger('urllib3').setLevel(logging.ERROR)
30+
2531
if profile:
2632
session = boto3.Session(profile_name=profile)
2733
elif aws_access_key_id and aws_secret_access_key:
@@ -37,7 +43,7 @@ def authenticate(self,
3743
aws_secret_access_key=aws_secret_access_key,
3844
)
3945
else:
40-
raise AuthenticationException('Insufficient credentials provided')
46+
session = boto3.Session()
4147

4248
# Test querying for current user
4349
identity = get_caller_identity(session)

ScoutSuite/providers/aws/facade/base.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
from collections import Counter
2-
3-
from botocore.session import Session
1+
from boto3.session import Session
42

53
from ScoutSuite.providers.aws.facade.awslambda import LambdaFacade
64
from ScoutSuite.providers.aws.facade.basefacade import AWSBaseFacade
@@ -45,20 +43,33 @@ def __init__(self, credentials=None):
4543
self._instantiate_facades()
4644

4745
async def build_region_list(self, service: str, chosen_regions=None, excluded_regions=None, partition_name='aws'):
48-
service = 'ec2containerservice' if service == 'ecs' else service
49-
available_services = await run_concurrently(lambda: Session().get_available_services())
5046

47+
service = 'ec2containerservice' if service == 'ecs' else service
48+
available_services = await run_concurrently(lambda: Session(region_name='eu-west-1').get_available_services())
5149
if service not in available_services:
5250
raise Exception('Service ' + service + ' is not available.')
5351

54-
regions = await run_concurrently(lambda: Session().get_available_regions(service, partition_name))
52+
regions = await run_concurrently(lambda: Session(region_name='eu-west-1').get_available_regions(service,
53+
partition_name))
54+
55+
# identify regions that are not opted-in
56+
ec2_not_opted_in_regions = self.session.client('ec2', 'eu-west-1')\
57+
.describe_regions(AllRegions=True, Filters=[{'Name': 'opt-in-status', 'Values': ['not-opted-in']}])
58+
59+
not_opted_in_regions = []
60+
if ec2_not_opted_in_regions['Regions']:
61+
for r in ec2_not_opted_in_regions['Regions']:
62+
not_opted_in_regions.append(r['RegionName'])
5563

5664
# include specific regions
5765
if chosen_regions:
5866
regions = [r for r in regions if r in chosen_regions]
5967
# exclude specific regions
6068
if excluded_regions:
6169
regions = [r for r in regions if r not in excluded_regions]
70+
# exclude not opted in regions
71+
if not_opted_in_regions:
72+
regions = [r for r in regions if r not in not_opted_in_regions]
6273

6374
return regions
6475

0 commit comments

Comments
 (0)