Skip to content

Commit

Permalink
Merge pull request #636 from nccgroup/develop
Browse files Browse the repository at this point in the history
release/5.8.0
  • Loading branch information
x4v13r64 committed Mar 22, 2020
2 parents 6cadac7 + a934ee4 commit b9e7809
Show file tree
Hide file tree
Showing 860 changed files with 1,842 additions and 406 deletions.
Empty file modified .coveragerc 100644 → 100755
Empty file.
23 changes: 23 additions & 0 deletions .flake8
@@ -0,0 +1,23 @@
[flake8]
select =
E901,
E999,
F821,
F822,
F823
statistics = True
show-source = True
max-line-length = 127
max-complexity = 10
exclude =
.git,
__pycache__,
docs/source/conf.py,
old,
build,
dist,
venv

[pycodestyle]
max_line_length = 127
ignore = E501
Empty file modified .github/ISSUE_TEMPLATE/bug_report.md 100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/feature_request.md 100644 → 100755
Empty file.
Empty file modified .github/PULL_REQUEST_TEMPLATE.md 100644 → 100755
Empty file.
Empty file modified .gitignore 100644 → 100755
Empty file.
11 changes: 8 additions & 3 deletions .travis.yml 100644 → 100755
Expand Up @@ -6,25 +6,30 @@ sudo: false
python:
- "3.5"
- "3.6"
- "3.7"
- "3.8"

matrix:
include:
- python: "3.7"
dist: xenial # required for Python 3.7 (travis-ci/travis-ci#9069)
sudo: required # required for Python 3.7 (travis-ci/travis-ci#9069)
- python: "3.8"
dist: bionic
sudo: required

install:
- pip install -U setuptools
- pip install -r requirements.txt
- pip install flake8
- pip install coveralls
- pip install codecov
- pip install autopep8

before_script:
# Stop the build if there are Python syntax errors or undefined names
- flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics
# Exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
- flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- flake8 .
- autopep8 --diff --recursive --max-line-length 127 .

# Command to run tests
script:
Expand Down
Empty file modified CODE_OF_CONDUCT.md 100644 → 100755
Empty file.
Empty file modified CONTRIBUTING.md 100644 → 100755
Empty file.
Empty file modified Dockerfile 100644 → 100755
Empty file.
Empty file modified LICENSE 100644 → 100755
Empty file.
Empty file modified MANIFEST.in 100644 → 100755
Empty file.
Empty file modified README.md 100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion ScoutSuite/__init__.py 100644 → 100755
@@ -1,5 +1,5 @@
__author__ = 'NCC Group'
__version__ = '5.7.0'
__version__ = '5.8.0'

ERRORS_LIST = []

Expand Down
14 changes: 11 additions & 3 deletions ScoutSuite/__main__.py 100644 → 100755
Expand Up @@ -57,6 +57,7 @@ def run_from_cli():
report_name=args.get('report_name'), report_dir=args.get('report_dir'),
timestamp=args.get('timestamp'),
services=args.get('services'), skipped_services=args.get('skipped_services'),
list_services=args.get('list_services'),
result_format=args.get('result_format'),
database_name=args.get('database_name'),
host_ip=args.get('host_ip'),
Expand Down Expand Up @@ -101,7 +102,7 @@ def run(provider,
# General
report_name=None, report_dir=None,
timestamp=False,
services=[], skipped_services=[],
services=[], skipped_services=[], list_services=None,
result_format='json',
database_name=None, host_ip='127.0.0.1', host_port=8000,
max_workers=10,
Expand Down Expand Up @@ -153,7 +154,7 @@ async def _run(provider,
# General
report_name, report_dir,
timestamp,
services, skipped_services,
services, skipped_services, list_services,
result_format,
database_name, host_ip, host_port,
regions,
Expand Down Expand Up @@ -204,7 +205,6 @@ async def _run(provider,
except Exception as e:
print_exception('Authentication failure: {}'.format(e))
return 101

# Create a cloud provider object
cloud_provider = get_provider(provider=provider,
# AWS
Expand Down Expand Up @@ -238,6 +238,13 @@ async def _run(provider,
Server.init(database_file, host_ip, host_port)
return

# If this command, run and exit
if list_services:
available_services = [x for x in dir(cloud_provider.services) if
not (x.startswith('_') or x in ['credentials', 'fetch'])]
print_info('The available services are: "{}"'.format('", "'.join(available_services)))
return 0

# Complete run, including pulling data from provider
if not fetch_local:

Expand Down Expand Up @@ -284,6 +291,7 @@ async def _run(provider,
print_info('Applying display filters')
filter_rules = Ruleset(cloud_provider=cloud_provider.provider_code,
environment_name=cloud_provider.environment,
filename='filters.json',
rule_type='filters',
account_id=cloud_provider.account_id)
processing_engine = ProcessingEngine(filter_rules)
Expand Down
Empty file modified ScoutSuite/core/__init__.py 100644 → 100755
Empty file.
7 changes: 6 additions & 1 deletion ScoutSuite/core/cli_parser.py 100644 → 100755
Expand Up @@ -183,7 +183,7 @@ def _init_azure_parser(self):
# Service Principal credentials in an auth file
azure_auth_modes.add_argument('--file-auth',
action='store',
type=argparse.FileType('r'),
type=argparse.FileType('rb'),
dest='file_auth',
metavar="FILE",
help='Run Scout with the specified credential file')
Expand Down Expand Up @@ -333,6 +333,11 @@ def _init_common_args_parser(self):
default=[],
nargs='+',
help='Name of in-scope services, defaults to all.')
parser.add_argument('--list-services',
dest='list_services',
default=False,
action='store_true',
help='List available services.')
parser.add_argument('--skip',
dest='skipped_services',
default=[],
Expand Down
Empty file modified ScoutSuite/core/conditions.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/core/console.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/core/exceptions.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/core/fs.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/core/processingengine.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/core/rule.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/core/rule_definition.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/core/ruleset.py 100644 → 100755
Empty file.
18 changes: 9 additions & 9 deletions ScoutSuite/core/server.py 100644 → 100755
Expand Up @@ -25,7 +25,7 @@ def __init__(self, filename):
@cherrypy.tools.json_out()
def summary(self):
"""
Returns the stripped down data of the results that doesn't scale up when using a lot of ressources,
Returns the stripped down data of the results that doesn't scale up when using a lot of resources,
used to render the summary.
Should be the first call from the server.
Can be found at GET /api/summary
Expand All @@ -48,8 +48,8 @@ def summary(self):
@cherrypy.tools.json_out()
def data(self, key=None):
"""
Return the data at the requested key. Doesn't returns nested dictionnaries and lists.
If one of the value is a dictionnary, it will return {'type': 'dict', 'keys': <Array of all the keys>}
Return the data at the requested key. Doesn't returns nested dictionaries and lists.
If one of the value is a dictionary, it will return {'type': 'dict', 'keys': <Array of all the keys>}
If one of the value is a list, it will return {'type': 'list', 'count': <number of elements in the list>}
Can be found at GET /api/data?key=<KEY>
Expand Down Expand Up @@ -85,9 +85,9 @@ def full(self, key=None):
@cherrypy.tools.json_out()
def page(self, key=None, page=None, pagesize=None):
"""
Return a page of the data at the requested key. Doesn't returns nested dictionnaries and lists.
Return a page of the data at the requested key. Doesn't returns nested dictionaries and lists.
For example, if you set pagesize=10 and page=2, it should return element 10-19
If one of the value is a dictionnary, it will return {'type': 'dict', 'keys': <Array of all the keys>}
If one of the value is a dictionary, it will return {'type': 'dict', 'keys': <Array of all the keys>}
If one of the value is a list, it will return {'type': 'list', 'count': <number of elements in the list>}
Can be found at GET /api/page?key=<KEY>&page=<PAGE>&pagesize=<PAGESIZE>
Expand Down Expand Up @@ -138,9 +138,9 @@ def init(database_filename, host, port):
@staticmethod
def get_item(data, key):
"""
Get a specific informations from its key.
Get a specific information from its key.
:param data: The dictionnary in which the information is stored.
:param data: The dictionary in which the information is stored.
:param host: The key where the information is located.
:return: The nested data at the requested location.
"""
Expand All @@ -158,10 +158,10 @@ def get_item(data, key):
@staticmethod
def strip_nested_data(data):
"""
Strip nested lists and dictionnaries from the provided object to reduce its size.
Strip nested lists and dictionaries from the provided object to reduce its size.
:param data: The object to strip.
:return: The input data stripped of its nested lists and dictionnaries.
:return: The input data stripped of its nested lists and dictionaries.
"""
if not isinstance(data, dict):
return data
Expand Down
Empty file modified ScoutSuite/core/utils.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/data/aws/ip-ranges/aws-in-ec2.json 100644 → 100755
Empty file.
Empty file modified ScoutSuite/data/aws/ip-ranges/aws-in-us.json 100644 → 100755
Empty file.
Empty file modified ScoutSuite/data/aws/ip-ranges/aws.json 100644 → 100755
Empty file.
Empty file modified ScoutSuite/data/icmp_message_types.json 100644 → 100755
Empty file.
Empty file modified ScoutSuite/data/protocols.json 100644 → 100755
Empty file.
Empty file modified ScoutSuite/output/__init__.py 100644 → 100755
Empty file.
Empty file modified ScoutSuite/output/data/html/conditionals/json_format.html 100644 → 100755
Empty file.
Empty file modified ScoutSuite/output/data/html/conditionals/sqlite_format.html 100644 → 100755
Empty file.
Empty file modified ScoutSuite/output/data/html/partials/about_scoutsuite.html 100644 → 100755
Empty file.
Empty file modified ScoutSuite/output/data/html/partials/accordion.html 100644 → 100755
Empty file.
Empty file modified ScoutSuite/output/data/html/partials/accordion_policy.html 100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified ScoutSuite/output/data/html/partials/aws/left_menu_for_vpc.html 100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
1 change: 1 addition & 0 deletions ScoutSuite/output/data/html/partials/aws/services.cloudtrail.regions.html 100644 → 100755
Expand Up @@ -12,6 +12,7 @@ <h4>Information</h4>
{{#ifPositive trails_count}}true{{else}}false{{/ifPositive}}
</span>
</li>
</ul>
</div>
<div class="list-group-item">
<div class="accordion">
Expand Down
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
26 changes: 18 additions & 8 deletions ScoutSuite/output/data/html/partials/aws/services.ec2.regions.id.vpcs.id.instances.html 100644 → 100755
Expand Up @@ -6,17 +6,17 @@ <h4 class="list-group-item-heading">{{name}}</h4>
<div class="list-group-item">
<h4>Information</h4>
<ul>
<li class="list-group-item-text">Region: {{region}}</li>
<li class="list-group-item-text">VPC: {{getValueAt 'services.ec2.regions' region 'vpcs' vpc 'name'}} ({{vpc}})</li>
<li class="list-group-item-text">ID: {{id}}</li>
<li class="list-group-item-text">Reservation ID: {{reservation_id}}</li>
<li class="list-group-item-text">ID: <samp>{{id}}</samp></li>
<li class="list-group-item-text">Region: <samp>{{region}}</samp></li>
<li class="list-group-item-text">VPC: <samp>{{getValueAt 'services.ec2.regions' region 'vpcs' vpc 'name'}} ({{vpc}})</samp></li>
<li class="list-group-item-text">Reservation ID: <samp>{{reservation_id}}</samp></li>
<li class="list-group-item-text">Monitoring: <span id="ec2.regions.{{region}}.vpcs.{{vpc}}.instances.{{@key}}.monitoring_disabled">{{convert_bool_to_enabled monitoring_enabled}}</span></li>
<li class="list-group-item-text">Access Key name: {{KeyName}}</li>
<li class="list-group-item-text">State: {{makeTitle State.Name}}</li>
<li class="list-group-item-text">Access Key Name: <samp>{{KeyName}}</samp></li>
<li class="list-group-item-text">State: <samp>{{makeTitle State.Name}}</samp></li>
<li class="list-group-item-text">Instance Type:
<span id="services.ec2.regions.vpcs.instances-unscannable-instance-types-{{id}}"> {{InstanceType}}<span>
<span id="services.ec2.regions.vpcs.instances-unscannable-instance-types-{{id}}"> <samp>{{InstanceType}}</samp></span>
</li>
<li class="list-group-item-text">Up since: {{LaunchTime}}</li>
<li class="list-group-item-text">Up Since: {{format_date LaunchTime}}</li>
</ul>
</div>
<div class="list-group-item" style="padding-bottom: 0 !important;">
Expand All @@ -25,13 +25,23 @@ <h4>Network interfaces</h4>
{{> network_interface region = ../region vpc = ../vpc network_interface = @../key}}
{{/each}}
</div>
{{#if metadata_options}}
<div class="list-group-item">
<h4>Metadata Options</h4>
<ul id="ec2.regions.{{region}}.vpcs.{{vpc}}.instances.{{@key}}.metadata_options">
<li>Endpoint: <samp>{{metadata_options.HttpEndpoint}}</samp></li>
<li>HTTP Tokens: <samp>{{metadata_options.HttpTokens}}</samp></li>
</ul>
</div>
{{/if}}
{{#if user_data}}
<div class="list-group-item" style="padding-bottom: 0 !important;">
<h4>User data</h4>
<div>
<code>{{#each (split_lines user_data)}} {{this}}<br>{{/each}}</code>
</div>
{{#if user_data_secrets}}
<br>
<h5 id="ec2.regions.{{region}}.vpcs.{{vpc}}.instances.{{@key}}.potential_secrets">Potential Secrets</h5>
<ul>
{{#each user_data_secrets}}
Expand Down
Expand Up @@ -6,10 +6,10 @@ <h4 class="list-group-item-heading">{{name}}</h4>

<div class="list-group-item">
<h4 class="list-group-item-heading">Information</h4>
<div class="list-group-item-text">ID: {{id}}</div>
<div class="list-group-item-text">Region: {{region}}</div>
<div class="list-group-item-text">ID: <samp>{{id}}</samp></div>
<div class="list-group-item-text">Region: <samp>{{region}}</samp></div>
<div class="list-group-item-text">VPC: {{getValueAt 'services.vpc.regions' region 'vpcs' vpc 'name'}} ({{vpc}})</div>
<div class="list-group-item-text">Description: {{description}}</div>
<div class="list-group-item-text">Description: <samp>{{description}}</samp></div>
</div>

{{#each rules}}
Expand Down
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
@@ -0,0 +1,52 @@

<!-- Key partial -->
<script id="services.kms.regions.id.keys.partial" type="text/x-handlebars-template">
{{#unless scout2_link}}
<div id="resource-name" class="list-group-item active">
<h4 class="list-group-item-heading">{{name}}</h4>
</div>
<div class="list-group-item">
<h4>Information</h4>
<ul>
<li class="list-group-item-text">ID: <span id="kms.regions.{{region}}.keys.{{@key}}.id"><samp>{{id}}</samp></span></li>
<li class="list-group-item-text">ARN: <span id="kms.regions.{{region}}.keys.{{@key}}.arn"><samp>{{arn}}</samp></span></li>
<li class="list-group-item-text">Description: <span id="kms.regions.{{region}}.keys.{{@key}}.description"><samp>{{value_or_none description}}</samp></span></li>
<li class="list-group-item-text">Creation Date: <span id="kms.regions.{{region}}.keys.{{@key}}.creation_date">{{format_date creation_date}}</span></li>
<li class="list-group-item-text">Status: <span id="kms.regions.{{region}}.keys.{{@key}}.key_enabled">{{convert_bool_to_enabled key_enabled}}</span></li>
<li class="list-group-item-text">Rotation: <span id="kms.regions.{{region}}.keys.{{@key}}.rotation_enabled">{{convert_bool_to_enabled rotation_enabled}}</span></li>
<li class="list-group-item-text">Origin: <span id="kms.regions.{{region}}.keys.{{@key}}.origin"><samp>{{value_or_none origin}}</samp></span></li>
<li class="list-group-item-text">Key Manager: <span id="kms.regions.{{region}}.keys.{{@key}}.key_manager"><samp>{{value_or_none key_manager}}</samp></span></li>
</ul>
</div>
<div class="list-group-item">
{{#if aliases.length}}
<h4 class="list-group-item-heading accordion-heading">Aliases</h4>
<ul>
{{#each this.aliases}}
<li><samp>{{name}}</samp></li>
{{/each}}
</ul>
{{else}}
<h4 class="list-group-item-heading accordion-heading text-secondary">Aliases</h4>
{{/if}}
</div>
<div class="list-group-item">
{{#if policy}}
{{> accordion_policy name = 'Key Policy' document = policy policy_path = (concat 'kms.regions' region 'keys' @key 'policy')}}
{{else}}
<h4 class="list-group-item-heading accordion-heading text-secondary">Key Policy</h4>
{{/if}}
</div>
{{/unless}}
</script>
<script>
Handlebars.registerPartial("services.kms.regions.id.keys", $("#services\\.kms\\.regions\\.id\\.keys\\.partial").html());
</script>

<!-- Single KMS instance template -->
<script id="single_kms_key-template" type="text/x-handlebars-template">
{{> modal-template template='services.kms.regions.id.keys' }}
</script>
<script>
var single_kms_key_template = Handlebars.compile($("#single_kms_key-template").html());
</script>
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
45 changes: 23 additions & 22 deletions ScoutSuite/output/data/html/partials/aws/services.redshift.regions.id.parameter_groups.html 100644 → 100755
@@ -1,26 +1,27 @@
<!-- Redshift parameter group partial -->
<!-- Redshift parameter group partial -->

<script id="services.redshift.regions.id.parameter_groups.partial" type="text/x-handlebars-template">
<div class="list-group-item active">
<h4 class="list-group-item-heading">{{resource_key}}</h4>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">Information</h4>
<div class="list-group-item-text item-margin">Description: {{Description}}</div>
<div class="list-group-item-text item-margin">Group Family: {{ParameterGroupFamily}}</div>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">Parameters</h4>
<ul>
<script id="services.redshift.regions.id.parameter_groups.partial" type="text/x-handlebars-template">
<div class="list-group-item active">
<h4 class="list-group-item-heading">{{name}}</h4>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">Information</h4>
<div class="list-group-item-text item-margin">Description: <samp>{{description}}</samp></div>
<div class="list-group-item-text item-margin">Group Family: <samp>{{family}}</samp></div>
<div class="list-group-item-text item-margin">Default Parameter Group: <samp>{{is_default}}</samp></div>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">Parameters</h4>
<ul>
{{#each parameters}}
<li class="list-group-item-text">{{@key}}:
<span id="redshift.regions.{{../region}}.parameter_groups.{{@../key}}.{{@key}}">{{value}}</span>
</li>
<li class="list-group-item-text"><samp>{{@key}}</samp>:
<span id="redshift.regions.{{../region}}.parameter_groups.{{@../key}}.{{@key}}"><samp>{{value}}</samp></span>
</li>
{{/each}}
</ul>
</div>
</script>
<script>
Handlebars.registerPartial("services.redshift.regions.id.parameter_groups", $("#services\\.redshift\\.regions\\.id\\.parameter_groups\\.partial").html());
</script>
</ul>
</div>
</script>
<script>
Handlebars.registerPartial("services.redshift.regions.id.parameter_groups", $("#services\\.redshift\\.regions\\.id\\.parameter_groups\\.partial").html());
</script>

Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified ScoutSuite/output/data/html/partials/aws/services.s3.acls.html 100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.

0 comments on commit b9e7809

Please sign in to comment.