agentsclimarketplace

Scoutsuite

Skill jph4cks/redhound-arsenal/scoutsuite

Build, extend, and operate ScoutSuite — a multi-cloud security auditing tool by NCC Group. Use when performing cloud security assessments against AWS, Azure, GCP, Alibaba Cloud, or OCI. Use when the user asks about cloud misconfigurations, CIS benchmark checks, IAM analysis, or generating HTML security reports. Covers installation, provider authentication, scanning, rule engine, custom rules, findings triage, CI/CD integration, and cloud assessment workflow.From its SKILL.md

Install
npx -y skills add jph4cks/redhound-arsenal --skill scoutsuite

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

12.6 KB, ~3.1k tokens by cl100k_base, as published. Nobody here has run it

scoutsuite Agent Skill

When to Use This Skill

Use this skill when:

  • Running a cloud security assessment against AWS, Azure, GCP, OCI, or Alibaba Cloud
  • The user wants to enumerate misconfigurations, over-permissive IAM, or public exposure
  • Generating an HTML or JSON security report for a cloud environment
  • Writing or customizing ScoutSuite rules for specific compliance requirements
  • Integrating cloud scanning into a CI/CD security gate
  • Triaging ScoutSuite findings (danger/warning/info) and building remediation plans

What ScoutSuite Does

ScoutSuite is a multi-cloud security auditing tool that collects configuration data from cloud provider APIs and evaluates it against a built-in rule engine. It produces an interactive HTML report categorizing findings into danger, warning, and informational levels across all major services. Unlike Prowler or CloudSploit, ScoutSuite maintains its own offline graph of all collected resources, enabling cross-service correlation without repeated API calls.

Installation

# Recommended: virtualenv
python3 -m venv scoutsuite-env
source scoutsuite-env/bin/activate

# Install from PyPI
pip install scoutsuite

# Or install from source (latest)
git clone https://github.com/nccgroup/ScoutSuite.git
cd ScoutSuite
pip install -r requirements.txt
pip install .

# Verify
scout --version

Cloud Provider SDK Dependencies

# AWS
pip install boto3

# Azure
pip install msrestazure azure-mgmt-*  # pulled automatically with scoutsuite

# GCP
pip install google-auth google-cloud-*  # pulled automatically

# All providers in one shot (already included via requirements.txt)
pip install scoutsuite[all]

Supported Providers

ProviderFlagNotes
AWSawsIAM, EC2, S3, RDS, Lambda, CloudTrail, etc.
AzureazureSubscriptions, AAD, Storage, VMs, NSGs
GCPgcpProjects, GCS, GCE, IAM, Cloud SQL
AlibabaaliyunECS, OSS, RAM, RDS
OCIociCompute, Object Storage, IAM, VCN

Authentication Methods

AWS Authentication

# Named profile (recommended)
scout aws --profile prod-readonly

# Environment variables
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_DEFAULT_REGION=us-east-1
scout aws

# Assume a role
scout aws --profile base-profile --role-arn arn:aws:iam::123456789:role/AuditRole

# MFA-protected
scout aws --profile mfa-profile --mfa-serial arn:aws:iam::123456789:mfa/user --mfa-code 123456

# All regions (default is all enabled regions)
scout aws --profile prod --all-regions

# Specific regions only
scout aws --profile prod --regions us-east-1 us-west-2

Minimum AWS IAM permissions for read-only scan: Attach SecurityAudit managed policy plus ReadOnlyAccess for full coverage. For a minimal custom policy, ScoutSuite needs Get*, List*, Describe* across all services being scanned.

Azure Authentication

# Interactive browser login (default)
scout azure --cli

# Service principal
scout azure --service-principal \
  --tenant-id <tenant-id> \
  --subscription-id <sub-id> \
  --client-id <app-id> \
  --client-secret <secret>

# Managed identity (from Azure VM)
scout azure --msi

# Specific subscription
scout azure --cli --subscription-id <sub-id>

GCP Authentication

# Application Default Credentials (gcloud auth application-default login)
scout gcp --user-account --project-id my-project

# Service account key file
scout gcp --service-account --key-file /path/to/sa-key.json --project-id my-project

# All projects accessible to the account
scout gcp --user-account --all-projects

# Specific folder
scout gcp --user-account --folder-id 123456789

OCI Authentication

# Uses ~/.oci/config automatically
scout oci --tenancy-id ocid1.tenancy.oc1..xxx

# Specific profile from config
scout oci --profile AUDIT

Core Scanning Workflow

# Basic AWS scan — outputs to ./scoutsuite-report/
scout aws --profile prod

# Specify output directory
scout aws --profile prod --report-dir /tmp/scout-prod-$(date +%Y%m%d)

# Run only specific services
scout aws --profile prod --services ec2 iam s3 rds

# Skip specific services
scout aws --profile prod --exceptions-file exceptions.json

# Force overwrite existing report
scout aws --profile prod --force

# Parallelism (default 10 threads)
scout aws --profile prod --max-workers 20

# Full multi-cloud example
scout gcp --service-account --key-file sa.json --project-id myproject --report-dir ./gcp-audit

Understanding Findings

Severity Levels

LevelColorMeaning
dangerRedCritical misconfiguration — direct security risk
warningOrangeElevated risk — deviates from best practice
infoBlueInformational — no immediate risk, useful context

Navigating the HTML Report

  1. Open scoutsuite-report/scoutsuite_results_aws-<profile>.html in a browser
  2. Left sidebar: services (IAM, EC2, S3, RDS, Lambda, CloudTrail, KMS…)
  3. Click a service → see rule violations with counts
  4. Click a rule → see all affected resources with raw JSON evidence
  5. Filter by severity using the top toggles
  6. Export finding data via the JSON file: scoutsuite-report/scoutsuite_results_aws-<profile>.js

Programmatic Access to Results

import json, re

# Strip the JS wrapper to get raw JSON
with open('scoutsuite-report/scoutsuite_results_aws-prod.js') as f:
    raw = f.read()
data = json.loads(re.sub(r'^scoutsuite_results\s*=\s*', '', raw).rstrip(';'))

# Enumerate danger-level findings
for svc, svc_data in data['services'].items():
    for rule_id, rule in svc_data.get('findings', {}).items():
        if rule.get('level') == 'danger' and rule.get('flagged_items', 0) > 0:
            print(f"[DANGER] {svc}/{rule_id}: {rule['flagged_items']} items")

Rule Engine

Rule File Structure

Rules live in ScoutSuite/providers/<provider>/rules/ruleset-default.json and individual JSON files under rules/findings/.

{
  "description": "Root account used recently",
  "rationale": "Root account usage indicates shared credentials or privilege abuse.",
  "remediation": "Disable root access keys; enable MFA.",
  "compliance": [{"name": "CIS AWS", "version": "1.4", "reference": "1.7"}],
  "references": ["https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-account.html"],
  "dashboard_name": "Root account used recently",
  "display_path": "iam.root.LastUsedDate",
  "path": "iam.root.LastUsedDate",
  "conditions": ["and", ["iam.root.LastUsedDate", "withinlastdays", "1"]],
  "id": "root-account-used-recently",
  "level": "danger"
}

Custom Rule Creation

# Create a custom ruleset directory
mkdir -p ~/.scoutsuite/rules/findings

# Write a custom rule: detect S3 buckets without versioning
cat > ~/.scoutsuite/rules/findings/s3-versioning-disabled.json << 'EOF'
{
  "description": "S3 bucket versioning disabled",
  "rationale": "Versioning protects against accidental deletion and ransomware.",
  "remediation": "Enable versioning on all S3 buckets.",
  "path": "s3.buckets.id",
  "conditions": ["and",
    ["s3.buckets.id.Versioning", "notEqual", "Enabled"]
  ],
  "id": "s3-versioning-disabled",
  "level": "warning"
}
EOF

# Use custom ruleset
scout aws --profile prod --ruleset ~/.scoutsuite/rules/ruleset-custom.json

Ruleset Configuration

{
  "name": "Custom Ruleset",
  "about": "Org-specific security rules",
  "rules": {
    "s3-versioning-disabled": {"enabled": true, "level": "danger"},
    "root-account-no-mfa": {"enabled": true, "level": "danger"},
    "ec2-security-group-open-to-all": {"enabled": true, "level": "danger"},
    "cloudtrail-not-enabled": {"enabled": false}
  }
}

Filtering and Exceptions

# Exclude specific resources from findings (not from collection)
# exceptions.json:
{
  "ec2": {
    "security_groups": ["sg-xxxxxx", "sg-yyyyyy"]
  },
  "s3": {
    "buckets": ["my-public-website-bucket"]
  }
}

scout aws --profile prod --exceptions-file exceptions.json

CI/CD Integration

GitHub Actions Example

name: Cloud Security Scan
on:
  schedule:
    - cron: '0 6 * * 1'  # Weekly Monday 6AM
  workflow_dispatch:

jobs:
  scoutsuite:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/ScoutSuiteAuditRole
          aws-region: us-east-1

      - name: Install ScoutSuite
        run: pip install scoutsuite

      - name: Run ScoutSuite
        run: scout aws --report-dir ./report --force

      - name: Check for danger findings
        run: |
          python3 - << 'EOF'
          import json, re, sys
          with open('./report/scoutsuite_results_aws-default.js') as f:
              data = json.loads(re.sub(r'^scoutsuite_results\s*=\s*', '', f.read()).rstrip(';'))
          dangers = sum(
              rule.get('flagged_items', 0)
              for svc in data['services'].values()
              for rule in svc.get('findings', {}).values()
              if rule.get('level') == 'danger'
          )
          print(f"Danger findings: {dangers}")
          sys.exit(1 if dangers > 0 else 0)
          EOF

      - name: Upload report
        uses: actions/upload-artifact@v3
        with:
          name: scoutsuite-report
          path: ./report/

Common Workflows

External Cloud Pentest Assessment

# 1. Auth check
aws sts get-caller-identity --profile client-audit

# 2. Full scan with timestamped output
REPORT_DIR="./scoutsuite-$(date +%Y%m%d)"
scout aws --profile client-audit --report-dir "$REPORT_DIR" --all-regions

# 3. Extract critical findings for report
python3 extract_dangers.py "$REPORT_DIR"/scoutsuite_results_aws-*.js

# 4. Manually verify top findings in console or CLI
aws iam get-account-password-policy --profile client-audit
aws s3api get-bucket-acl --bucket <bucket-name> --profile client-audit

# 5. Screenshot key report sections for deliverable

Assumed Role / Cross-Account Scan

# Assume audit role in target account
aws sts assume-role \
  --role-arn arn:aws:iam::TARGET_ACCOUNT:role/AuditRole \
  --role-session-name scoutsuite-session \
  --profile source-account \
  | jq -r '.Credentials | "export AWS_ACCESS_KEY_ID=\(.AccessKeyId)\nexport AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey)\nexport AWS_SESSION_TOKEN=\(.SessionToken)"' \
  > assume_role.sh
source assume_role.sh
scout aws --report-dir ./target-account-audit

Troubleshooting

IssueFix
NoCredentialsErrorCheck ~/.aws/credentials or env vars; verify aws sts get-caller-identity
Rate limiting / throttlingAdd --max-workers 5; scan fewer services with --services
AccessDenied for specific serviceAdd missing List*/Describe* permissions or skip service
HTML report blank in browserServe via python3 -m http.server 8080 — browser security blocks local JS
ModuleNotFoundErrorActivate virtualenv; run pip install scoutsuite again
Azure auth loopUse az login first, then scout azure --cli
GCP permission deniedEnsure SA has Security Reviewer + Viewer roles at project/org level
Stale resultsDelete report dir and rerun with --force

Built by Red Hound InfoSec — On-demand offensive security expertise for SMBs. 20+ years of Fortune 500 experience. Penetration testing, attack surface analysis, and security consulting.

Related reading: Azure AD Conditional Access Policies Most Companies Get Wrong

redhound.us | GitHub | Book a consultation

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Gives 0 of the 12 instructions most containers cloud skills give in ~3.1k tokens

Counted across 607 of the 657 authors here whose files we hold, read 2026-08-07

  • Run containers as a non-root userin 66 of 607, across 46 files
  • Use multi-stage buildsin 53 of 607, across 44 files
  • Use Promise.all for independent operationsin 47 of 607, across 13 files
  • Import directly instead of barrel filesin 46 of 607, across 12 files
  • Use ternary instead of AND for conditionalsin 45 of 607, across 12 files
  • Use Set or Map for O(1) lookupsin 42 of 607, across 10 files
  • Create a .dockerignore filein 41 of 607, across 31 files
  • Read individual rule files for detailsin 39 of 607, across 9 files
  • Copy dependency files before source codein 36 of 607, across 23 files
  • Authenticate server actions like API routesin 35 of 607, across 7 files
  • Use next/dynamic for heavy componentsin 34 of 607, across 9 files
  • Use React.cache for per-request deduplicationin 34 of 607, across 10 files

Said here and by no other author read

  • install scoutsuite inside a virtual environment
  • authenticate using a read-only profile or role
  • run scans against the target cloud provider
  • store scan results in a timestamped report directory
  • filter findings using an exceptions file
  • use custom rulesets for organization-specific checks

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 326,970. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.