Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge develop to master to fix #1511, #1540 #1551

Open
wants to merge 98 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
56de0be
Fix AWS when building for arm64
FlorinAsavoaie Sep 2, 2022
732bd73
fixing typo
yaleman Sep 9, 2022
41e360e
Handle empty function 'maxInstances'
fernando-gallego Sep 15, 2022
4799df8
docs.microsoft.com->learn.microsoft.com
tkmru Sep 19, 2022
b9c47f2
Merge pull request #1459 from tkmru/fix/docs-to-learn
michyweb Sep 21, 2022
dff1a4b
Merge pull request #1456 from yaleman/typo
michyweb Sep 21, 2022
888916f
Merge pull request #1452 from FlorinAsavoaie/fix/aws-arm64
michyweb Sep 21, 2022
5507cc6
Kubescout Alpha
liyun-li Sep 22, 2022
cf44beb
Merge pull request #1460 from liyun-li/develop
michyweb Sep 22, 2022
8887ad2
azure/rules/findings/rbac-administering-resource-locks-assigned.json:…
elimisteve Sep 29, 2022
b324389
Exclude SMTP port 25 from rule
rbailey-godaddy Oct 5, 2022
981670f
Bug fix
liyun-li Oct 5, 2022
3d5a1aa
Secret redaction logic improvement
liyun-li Oct 6, 2022
d6e0e28
Add checks on lists because why not
liyun-li Oct 6, 2022
3e3fd65
remove unnecessary typing
liyun-li Oct 10, 2022
6563ac8
Merge pull request #1468 from liyun-li/develop
michyweb Oct 11, 2022
d3002c2
Format findings
x4v13r64 Oct 20, 2022
d56bf14
Format findings
x4v13r64 Oct 20, 2022
79667f1
Format findings
x4v13r64 Oct 20, 2022
7403e8b
Support LBs
x4v13r64 Oct 20, 2022
860cdb2
Support additional parameters
x4v13r64 Oct 20, 2022
9315ae0
Add default values
x4v13r64 Oct 21, 2022
a32df60
Add findings
x4v13r64 Oct 21, 2022
1b6aa70
Format
x4v13r64 Oct 21, 2022
75c8b68
Format
x4v13r64 Oct 21, 2022
9e8bbc8
Catch task exceptions
x4v13r64 Oct 21, 2022
ba8e184
Catch ranges from 1-65535
x4v13r64 Oct 27, 2022
a748c41
Better logic
x4v13r64 Oct 27, 2022
5c29988
Improve rule
x4v13r64 Oct 27, 2022
ec8fa81
Add missing rule to ruleset
x4v13r64 Oct 27, 2022
65a8bf5
Evaluate public access prevention
x4v13r64 Oct 27, 2022
884d41f
Guard vs undefined EnableTerminationProtection
rscottbailey Oct 28, 2022
12f554e
Defend vs NotificationARNs
rscottbailey Oct 28, 2022
7ca0500
Add check for redirect to HTTPS
x4v13r64 Nov 15, 2022
0f2b48e
Include services when failure
x4v13r64 Nov 15, 2022
4892251
Enhancement/S3-TlsVersion
twilson-bf Nov 28, 2022
92cda50
Improve check
x4v13r64 Dec 12, 2022
65cac92
Fix finding logic
x4v13r64 Dec 12, 2022
9349d03
Update main workflow
michyweb Jan 3, 2023
0a2534d
workflow test
michyweb Jan 3, 2023
afee500
update main workflow
michyweb Jan 3, 2023
3a4acf2
fix throttling test
michyweb Jan 3, 2023
eb57832
Merge pull request #1492 from michyweb/master
michyweb Jan 3, 2023
8749775
Merge pull request #1487 from nccgroup/bugfix/gke-findings
michyweb Jan 3, 2023
205d996
Merge pull request #1482 from nccgroup/enhancement/include-on-fail
michyweb Jan 3, 2023
cbc48e7
Merge pull request #1481 from nccgroup/enhancement/check-elbv2-redirects
michyweb Jan 3, 2023
ded64a9
Merge pull request #1476 from nccgroup/enhancement/catch-1-6
michyweb Jan 3, 2023
963cb91
Merge pull request #1477 from nccgroup/enhancement/public-access-prev…
michyweb Jan 3, 2023
795fc59
Merge pull request #1475 from nccgroup/enhancement/catch_task_exceptions
michyweb Jan 3, 2023
185f1d5
Merge pull request #1474 from nccgroup/enhancement/gcp-lb-support
michyweb Jan 3, 2023
d9708d3
Merge pull request #1464 from elimisteve/patch-1
michyweb Jan 3, 2023
efb7b5a
Merge pull request #1485 from twilson-bf/Enhancement/S3-TlsVersion
michyweb Jan 3, 2023
23ec346
Merge pull request #1479 from rbailey-godaddy/bugfix/aws-cloudformati…
michyweb Jan 3, 2023
72ce1b5
Handle storage profiles without img ref
fernando-gallego Jan 16, 2023
6475f25
Update functions_v1.py
fernando-gallego Jan 16, 2023
ffcf1a9
Update functions_v1.py
fernando-gallego Jan 16, 2023
a4f1722
Update azure-mgmt-authorization
zachfey Mar 2, 2023
ba1b21e
add dashboard_name to rule
wrightmalone Mar 9, 2023
8f93753
Changing regex to comply with python3.11
fl0mb Mar 13, 2023
b9261c8
Don't swallow unexpected exceptions
ncc-akis Mar 30, 2023
8ae2a0a
GCP credential expiry check
ncc-akis Mar 31, 2023
7d8d81f
Merge pull request #1520 from ncc-akis/bugfix/handle_gcp_api_errors
fernando-gallego Mar 31, 2023
b75d315
fix(gcp): sql-component api is deprecated
saez0pub Apr 5, 2023
6cd1de5
fix(gcp): gke cluster subnetwork can be cross project
saez0pub Apr 5, 2023
6584afb
fix(gcp): False positive on pubsup only cloud functions
saez0pub Apr 5, 2023
b1d9602
fix(gcp): None as cloudfunctions environment_variables
saez0pub Apr 5, 2023
b5d0b6c
Remove credentials validity checks which cause issues
HIKster Apr 6, 2023
d18a9c7
Fix JSON formatting of policies
liyun-li Apr 11, 2023
0548ff1
fix case insensitive conditional
cckev Apr 18, 2023
f495d9e
formatting
cckev Apr 18, 2023
a236eb8
Merge pull request #1524 from liyun-li/fix-json
liyun-li May 5, 2023
e730a50
Merge pull request #1510 from fl0mb/bugfix/1480-python3.11-regex-change
fernando-gallego May 15, 2023
db7890f
Update regexp for Python 3.11
fernando-gallego May 15, 2023
18f0cee
Better API failsafe
liyun-li May 18, 2023
d6a0601
Merge branch 'nccgroup:develop' into develop
liyun-li May 18, 2023
0ef92cf
Merge pull request #1535 from liyun-li/develop
liyun-li May 18, 2023
4bdc430
Merge branch 'develop' into bugfix/s3-policy-key-name-case-sensitive
cckev May 19, 2023
764ad94
directly writing strings in lowercase
cckev May 19, 2023
86d5961
Merge pull request #1467 from rbailey-godaddy/bugfix/smtp-double-jeop…
liyun-li May 19, 2023
06bc502
fix issue #1537
michyweb May 24, 2023
b775a41
Adding coverage in python 3.11 to the CI Workflow
michyweb May 24, 2023
6549177
Merge branch 'develop' into bugfix/s3-policy-key-name-case-sensitive
cckev May 25, 2023
dc75b2e
remove key_map
cckev May 25, 2023
6ee3eaf
Merge pull request #1526 from cckev/bugfix/s3-policy-key-name-case-se…
michyweb May 26, 2023
27d208e
Merge pull request #1523 from HIKster/develop
fernando-gallego May 29, 2023
73459b6
Merge pull request #1506 from wrightmalone/bugfix/1505-failed-to-proc…
fernando-gallego May 29, 2023
fc23d9d
Merge pull request #1504 from zachfey/bugfix/1503-fix-az-aad-fetch-ad…
fernando-gallego May 29, 2023
d6cf479
Update __main__.py
fernando-gallego May 30, 2023
acf7bda
Merge pull request #1522 from saez0pub/fix/gcp_audit
liyun-li Jun 5, 2023
36d8bd9
Update __init__.py
michyweb Jun 6, 2023
40d699c
Update setup.py
fernando-gallego Jun 13, 2023
0798a3a
Update testing.yml
fernando-gallego Jun 14, 2023
3d3fa71
Update setup.py
fernando-gallego Jun 14, 2023
baedf24
Stop hideAll selector affecting non-list elements
ncc-akis Jun 29, 2023
98e514e
Highlight non-compliant LB ports
ncc-akis Jun 29, 2023
0ef4154
Special case no longer needed
ncc-akis Jun 29, 2023
cb7299d
Merge pull request #1548 from ncc-akis/bugfix/lb_exceptions
michyweb Jun 29, 2023
d0bd308
Merge pull request #1 from cyberqueenmeg/develop
cyberqueenmeg Jun 29, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 5 additions & 5 deletions .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ on:
jobs:
build:

runs-on: ubuntu-latest
runs-on: ubuntu-20.04
strategy:
matrix:
python-version: [3.6, 3.7, 3.8]
python-version: [3.9, 3.10, 3.11]

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Cache pip
Expand Down Expand Up @@ -52,4 +52,4 @@ jobs:
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1
with:
file: ./coverage.xml
file: ./coverage.xml
2 changes: 2 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ recursive-include ScoutSuite/providers/aliyun *
recursive-include ScoutSuite/providers/aliyun/rules *
recursive-include ScoutSuite/providers/oci *
recursive-include ScoutSuite/providers/oci/rules *
recursive-include ScoutSuite/providers/kubernetes *
recursive-include ScoutSuite/providers/kubernetes/rules *
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ The following cloud providers are currently supported:
- Google Cloud Platform
- Alibaba Cloud (alpha)
- Oracle Cloud Infrastructure (alpha)
- Kubernetes clusters on a cloud provider (alpha)

## Installation

Expand Down Expand Up @@ -64,3 +65,5 @@ Additional details can be found in the [wiki](https://github.com/nccgroup/ScoutS

**NCC Scout now has a free tier under our "Freemium" offering**.
This offering provides access to NCC Group’s extended rulesets, keeping your cloud environment protected in-line with best practice configuration and cloud technologies. To sign up for the service, head on to https://cyberstore.nccgroup.com/our-services/service-details/16/cloud-account-monitoring.


2 changes: 1 addition & 1 deletion ScoutSuite/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
__author__ = 'NCC Group'
__version__ = '5.12.0'
__version__ = '5.13.0RC1'

ERRORS_LIST = []

Expand Down
35 changes: 34 additions & 1 deletion ScoutSuite/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
from ScoutSuite.output.utils import get_filename
from ScoutSuite.providers import get_provider
from ScoutSuite.providers.base.authentication_strategy_factory import get_authentication_strategy
# Dirty workaround for compatibility with Python >= 3.10
import collections
collections.Callable = collections.abc.Callable


def run_from_cli():
Expand Down Expand Up @@ -52,6 +55,12 @@ def run_from_cli():
organization_id=args.get('organization_id'), all_projects=args.get('all_projects'),
# Aliyun
access_key_id=args.get('access_key_id'), access_key_secret=args.get('access_key_secret'),
# Kubernetes
kubernetes_cluster_provider=args.get('kubernetes_cluster_provider'),
kubernetes_config_file=args.get('kubernetes_config_file'),
kubernetes_context=args.get('kubernetes_context'),
kubernetes_persist_config=args.get('kubernetes_persist_config'),
kubernetes_azure_subscription_id=args.get('kubernetes_azure_subscription_id'),
# General
report_name=args.get('report_name'), report_dir=args.get('report_dir'),
timestamp=args.get('timestamp'),
Expand Down Expand Up @@ -98,6 +107,12 @@ def run(provider,
project_id=None, folder_id=None, organization_id=None, all_projects=False,
# Aliyun
access_key_id=None, access_key_secret=None,
# Kubernetes
kubernetes_cluster_provider=None,
kubernetes_config_file=None,
kubernetes_context=None,
kubernetes_persist_config=True,
kubernetes_azure_subscription_id=None,
# General
report_name=None, report_dir=None,
timestamp=False,
Expand Down Expand Up @@ -150,6 +165,12 @@ async def _run(provider,
project_id, folder_id, organization_id, all_projects,
# Aliyun
access_key_id, access_key_secret,
# Kubernetes
kubernetes_cluster_provider,
kubernetes_config_file,
kubernetes_context,
kubernetes_persist_config,
kubernetes_azure_subscription_id,
# General
report_name, report_dir,
timestamp,
Expand Down Expand Up @@ -198,7 +219,15 @@ async def _run(provider,
username=username,
password=password,
access_key_id=access_key_id,
access_key_secret=access_key_secret)
access_key_secret=access_key_secret,

# Kubernetes
kubernetes_cluster_provider=kubernetes_cluster_provider,
kubernetes_config_file=kubernetes_config_file,
kubernetes_context=kubernetes_context,
kubernetes_persist_config=kubernetes_persist_config,
kubernetes_azure_subscription_id=kubernetes_azure_subscription_id,
kubernetes_fetch_local=fetch_local)

if not credentials:
return 101
Expand All @@ -219,6 +248,10 @@ async def _run(provider,
folder_id=folder_id,
organization_id=organization_id,
all_projects=all_projects,
# Kubernetes
kubernetes_config_file=kubernetes_config_file,
kubernetes_context=kubernetes_context,
kubernetes_cluster_provider=kubernetes_cluster_provider,
# Other
report_dir=report_dir,
timestamp=timestamp,
Expand Down
43 changes: 43 additions & 0 deletions ScoutSuite/core/cli_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def __init__(self):
self._init_azure_parser()
self._init_aliyun_parser()
self._init_oci_parser()
self._init_kubernetes_parser()

def _init_aws_parser(self):
parser = self.subparsers.add_parser("aws",
Expand Down Expand Up @@ -254,6 +255,37 @@ def _init_oci_parser(self):
default=None,
help='Name of the profile')

def _init_kubernetes_parser(self):
kubernetes_parser = self.subparsers.add_parser("kubernetes",
parents=[self.common_providers_args_parser],
help="Run Scout against a Kubernetes cluster")

kubernetes_scope = kubernetes_parser.add_argument_group('Additional arguments')

kubernetes_scope.add_argument('-c',
'--cluster-provider',
dest='kubernetes_cluster_provider',
default=None,
choices=['aks', 'eks', 'gke'],
help='Cluster contexts to scan. If no cloud provider is specified, ScoutSuite will use the default Kubernetes configuration.')
kubernetes_scope.add_argument('--config-file',
dest='kubernetes_config_file',
default=None,
help='Name of the kube-config file. By default, it will use Kubernetes\' default directory.')
kubernetes_scope.add_argument('--context',
dest='kubernetes_context',
default=None,
help='Cluster context to scan. By default, current_context from config file will be used.')
kubernetes_scope.add_argument('--do-not-persist-config',
dest='kubernetes_persist_config',
action='store_false',
default=True,
help='If specified, config file will NOT be updated when changed (e.g GCP token refresh).')
kubernetes_scope.add_argument('--subscription-id',
dest='kubernetes_azure_subscription_id',
action='store',
default=None,
help='If unspecified, the default subscription will be used.')

def _init_common_args_parser(self):
parser = self.common_providers_args_parser.add_argument_group('Scout Arguments')
Expand Down Expand Up @@ -404,4 +436,15 @@ def parse_args(self, args=None):
if v.get('subscription_ids') and v.get('all_subscriptions'):
self.parser.error('--subscription-ids and --all-subscriptions are mutually exclusive options')

# Kubernetes
elif v.get('provider') == 'kubernetes':
cluster_provider = v.get('kubernetes_cluster_provider')
# change ruleset based on cluster provider
if cluster_provider:
args.ruleset = f'{cluster_provider}.json'

# only use subscription_id if kubernetes_cluster_provider is 'aks'
if cluster_provider != 'aks' and v.get('kubernetes_azure_subscription_id'):
self.parser.error('--subscription-id is only used when analyzing AKS clusters')

return args
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ <h4>Listeners</h4>
<ul>
{{#each listeners}}
<li class="list-group-item-text">
{{@key}} ({{Protocol}}{{#if SslPolicy}}, {{SslPolicy}}{{/if}})
<span id="elb.regions.{{../region}}.vpcs.{{../vpc}}.elbs.{{@../key}}.listeners.{{@key}}">{{@key}} ({{Protocol}}{{#if SslPolicy}}, {{SslPolicy}}{{/if}})</span>
</li>
{{/each}}
</ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ <h4>Listeners</h4>
<ul>
{{#each listeners}}
<li class="list-group-item-text">
{{@key}} ({{Protocol}}{{#if SslPolicy}}, {{SslPolicy}}{{/if}})
<span id="elbv2.regions.{{../region}}.vpcs.{{../vpc}}.lbs.{{@../key}}.listeners.{{@key}}">{{@key}} ({{Protocol}}{{#if SslPolicy}}, {{SslPolicy}}{{/if}})</span>
</li>
{{/each}}
</ul>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<!-- computeengine global_forwarding_rules -->
<script id="services.computeengine.projects.id.global_forwarding_rules.partial" type="text/x-handlebars-template">
<div id="resource-name" 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">ID: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.id"><samp>{{value_or_none id}}</samp></span></div>
<div class="list-group-item-text item-margin">Name: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.name"><samp>{{value_or_none name}}</samp></span></div>
<div class="list-group-item-text item-margin">Creation Timestamp: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.creation_timestamp"><samp>{{format_date creation_timestamp}}</samp></span></div>
<div class="list-group-item-text item-margin">Description: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.description"><samp>{{value_or_none description}}</samp></span></div>
<div class="list-group-item-text item-margin">Network: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.network"><samp>{{value_or_none network}}</samp></span></div>
<div class="list-group-item-text item-margin">Subnetwork: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.subnetwork"><samp>{{value_or_none subnetwork}}</samp></span></div>
<div class="list-group-item-text item-margin">IP Address: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.ip_address"><samp>{{value_or_none ip_address}}</samp></span></div>
<div class="list-group-item-text item-margin">IP Protocol: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.ip_protocol"><samp>{{value_or_none ip_protocol}}</samp></span></div>
<div class="list-group-item-text item-margin">IP Version: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.ip_version"><samp>{{value_or_none ipVersion}}</samp></span></div>
<div class="list-group-item-text item-margin">Allow Global Access: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.allow_global_access"><samp>{{value_or_none allowGlobalAccess}}</samp></span></div>
<div class="list-group-item-text item-margin">All Ports: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.all_ports"><samp>{{value_or_none allPorts}}</samp></span></div>
<div class="list-group-item-text item-margin">Port Range: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.port_range"><samp>{{value_or_none port_range}}</samp></span></div>
<div class="list-group-item-text item-margin">Ports: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.ports"><samp>{{value_or_none ports}}</samp></span></div>
<div class="list-group-item-text item-margin">Target: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.target"><samp>{{value_or_none target}}</samp></span></div>
<div class="list-group-item-text item-margin">Load Balancing Scheme: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.load_balancing_scheme"><samp>{{value_or_none load_balancing_scheme}}</samp></span></div>
<div class="list-group-item-text item-margin">Network Tier: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.network_tier"><samp>{{value_or_none network_tier}}</samp></span></div>
<div class="list-group-item-text item-margin">Backend Service: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.backend_service"><samp>{{value_or_none backendService}}</samp></span></div>
<div class="list-group-item-text item-margin">Service Name: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.service_name"><samp>{{value_or_none serviceName}}</samp></span></div>
<div class="list-group-item-text item-margin">Service Label: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.service_label"><samp>{{value_or_none serviceLabel}}</samp></span></div>
<div class="list-group-item-text item-margin">Labels: <span id="computeengine.projects.{{project}}.global_forwarding_rules.{{@key}}.labels"><samp>{{value_or_none labels}}</samp></span></div>
</div>
</script>

<script>
Handlebars.registerPartial("services.computeengine.projects.id.global_forwarding_rules", $("#services\\.computeengine\\.projects\\.id\\.global_forwarding_rules\\.partial").html());
</script>

<!-- Single computeengine global_forwarding_rule template -->
<script id="single_computeengine_global_forwarding_rule-template" type="text/x-handlebars-template">
{{> modal-template template='services.computeengine.projects.id.global_forwarding_rules'}}
</script>
<script>
var single_computeengine_global_forwarding_rule_template = Handlebars.compile($("#single_computeengine_global_forwarding_rule-template").html());
</script>
Loading