Lesson 07 Configuration & Infrastructure Weaknesses
Theme:

Theory: Configuration & Infrastructure Weaknesses

Why misconfiguration remains the most exploited attack surface — and how to find, audit, and fix it before adversaries do.

Misconfiguration: The #1 Attack Vector

Year after year, misconfiguration tops the OWASP Top 10, appears in the majority of penetration test reports, and accounts for some of the largest data breaches in history. Unlike software vulnerabilities that require a coding mistake in application logic, misconfigurations are failures to properly apply security controls that already exist. The defaults ship insecure, the documentation is ignored, and the blast radius is enormous.

What makes misconfiguration so dangerous is its ubiquity. Every layer of a modern stack — cloud provider, operating system, web server, container runtime, orchestrator, database, DNS, firewall — ships with configuration that must be hardened. A single oversight at any layer can undermine every other security control in the environment. An attacker does not need a zero-day when the front door is unlocked.

From a CTF and red-team perspective, configuration weaknesses are often the fastest path to escalation. They require no exploit development, no shellcode, and no advanced tooling. A misconfigured S3 bucket leaks credentials; those credentials assume an overly permissive IAM role; that role accesses the production database. The entire kill chain is built from configuration errors.

Cloud Misconfigurations

Cloud environments are particularly prone to misconfiguration because they expose thousands of settings through APIs, and a single aws s3api put-bucket-acl command can make terabytes of data public. The three most common cloud misconfigurations are open storage buckets, overly permissive IAM policies, and exposed metadata endpoints.

Open S3 Buckets and Storage

Public S3 buckets have been responsible for breaches at Capital One, Twitch, and dozens of other organizations. The root cause is almost always an ACL or bucket policy that grants s3:GetObject to * (everyone):

{
  "Effect": "Allow",
  "Principal": "*",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::company-backups/*"
}

To audit your own buckets, use the AWS CLI:

# List all buckets and their public access status
aws s3api list-buckets --query 'Buckets[].Name' --output text | \
  xargs -I {} aws s3api get-public-access-block --bucket {}

# Check a specific bucket's ACL
aws s3api get-bucket-acl --bucket my-bucket

# Find buckets with public policies
aws s3api get-bucket-policy-status --bucket my-bucket

Overly Permissive IAM Policies

The principle of least privilege is well understood but rarely practiced. Wildcard actions ("Action": "*") and wildcard resources ("Resource": "*") are alarmingly common, especially in development accounts that get promoted to production. A single IAM role with AdministratorAccess attached to a Lambda function gives any code running in that function full control over the AWS account.

# Find IAM policies with wildcard actions
aws iam list-policies --scope Local --query 'Policies[].Arn' --output text | \
  xargs -I {} aws iam get-policy-version \
    --policy-arn {} \
    --version-id $(aws iam get-policy --policy-arn {} \
      --query 'Policy.DefaultVersionId' --output text) \
    --query 'PolicyVersion.Document'

# List roles with AdministratorAccess
aws iam list-entities-for-policy \
  --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

Exposed Metadata Endpoints

Cloud instances expose metadata services at well-known addresses. On AWS, http://169.254.169.254/latest/meta-data/ returns instance identity, network configuration, and — critically — temporary IAM credentials. If an application is vulnerable to SSRF (Server-Side Request Forgery), an attacker can reach the metadata endpoint and steal credentials. IMDSv2 (Instance Metadata Service v2) mitigates this by requiring a session token, but many instances still run IMDSv1.

# Check if an instance requires IMDSv2
aws ec2 describe-instances \
  --query 'Reservations[].Instances[].{ID:InstanceId, IMDS:MetadataOptions.HttpTokens}' \
  --output table

Web Server Misconfigurations

Web servers are the most internet-facing component of any stack, which means their misconfigurations are directly reachable by attackers. The most common issues are default credentials, directory listing, verbose error pages, and unnecessary services.

Default Credentials

Admin panels for Tomcat (tomcat/tomcat), Jenkins (admin/admin), phpMyAdmin, and dozens of other services ship with well-known default credentials. Attackers maintain databases of these defaults and automate login attempts. In CTF environments, default credentials are one of the first things to try.

Directory Listing and Information Disclosure

When directory indexing is enabled, browsing to a folder without an index file reveals the complete file listing. This can expose backup files (.bak, .sql.gz), configuration files (web.config, .env), and source code. A sample misconfigured Nginx block:

# MISCONFIGURED: directory listing enabled
server {
    listen 80;
    server_name files.example.com;
    root /var/www/uploads;
    autoindex on;          # This should be off
}

# HARDENED: disable listing, restrict file types
server {
    listen 80;
    server_name files.example.com;
    root /var/www/uploads;
    autoindex off;
    location ~* \.(sql|bak|env|config|log)$ {
        deny all;
    }
}

Verbose Error Pages

Stack traces, database connection strings, internal IP addresses, and framework versions revealed in error pages give attackers a detailed map of the application's internals. Production servers should return generic error pages and log details server-side only.

Unnecessary Services

Running services that are not required expands the attack surface. Common offenders include debug endpoints left enabled in production, database ports exposed to the internet, and management interfaces (e.g., JMX, Redis CLI) bound to 0.0.0.0 instead of 127.0.0.1.

Container and Kubernetes Misconfigurations

Container orchestration adds another layer of configuration that is frequently misconfigured, often with devastating consequences.

Privileged Containers

Running a container with --privileged or securityContext.privileged: true gives it full access to the host kernel. An attacker who gains code execution inside a privileged container can escape to the host trivially:

# MISCONFIGURED: privileged container
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: app
    image: myapp:latest
    securityContext:
      privileged: true       # NEVER do this in production
      runAsUser: 0            # Running as root compounds the risk

Exposed Dashboards

The Kubernetes Dashboard, when exposed without authentication, grants full cluster access through a web browser. Similarly, etcd endpoints, the kubelet API, and the API server itself are frequent targets:

# Check for unauthenticated kubelet access
curl -sk https://<node-ip>:10250/pods

# Check for exposed Kubernetes API
curl -sk https://<api-server>:6443/version

# Audit service accounts with cluster-admin
kubectl get clusterrolebindings -o json | \
  jq '.items[] | select(.roleRef.name=="cluster-admin") | .subjects'

Default Service Accounts

Every Kubernetes namespace has a default service account. If pods do not specify a different account, they inherit whatever permissions the default account has. In many clusters, the default service account has been granted excessive permissions, allowing any pod to list secrets, create deployments, or escalate privileges.

# Audit with kube-bench (CIS Kubernetes Benchmark)
kube-bench run --targets master,node,policies

# Check what the default service account can do
kubectl auth can-i --list --as=system:serviceaccount:default:default

Network Misconfigurations

Network-level misconfigurations are often invisible to application-layer scanners but provide direct access to internal services.

Open Ports and Weak Firewall Rules

Services bound to 0.0.0.0 are reachable from any network interface. Combined with permissive firewall rules (or no firewall at all), internal services become internet-facing. Nmap is the standard tool for discovering open ports:

# TCP SYN scan of common ports (fast, stealthy)
nmap -sS -T4 -p- --min-rate 1000 target.example.com

# Service version detection on discovered ports
nmap -sV -p 22,80,443,3306,6379,8080 target.example.com

# Run default NSE scripts for common vulnerabilities
nmap -sC -sV -p 22,80,443 target.example.com

# UDP scan for SNMP, DNS, NTP (slower, often overlooked)
nmap -sU -p 53,123,161,500 target.example.com

SNMP Community Strings

SNMP v1 and v2c use "community strings" as passwords, and the defaults (public for read, private for write) are rarely changed. An attacker with SNMP read access can enumerate network interfaces, routing tables, running processes, and installed software. Write access allows reconfiguring devices remotely:

# Test default SNMP community strings
nmap -sU -p 161 --script snmp-brute target.example.com

# Walk the SNMP tree with default community string
snmpwalk -v2c -c public target.example.com

AI-Assisted Configuration Auditing

Large language models like Claude excel at reviewing configuration files because they can reason about the intent of each setting, cross-reference it against security best practices, and explain the risk in plain language. This is one of the highest-value applications of AI in the security workflow.

To use Claude for config auditing, paste the configuration file (or relevant sections) into your prompt and ask for a security review. Claude can identify:

Example prompt for Claude:

Review this Kubernetes deployment YAML for security issues.
Flag anything that violates CIS Kubernetes Benchmark recommendations.
For each finding, explain the risk and provide the hardened version.

[paste YAML here]

AI-assisted auditing does not replace automated scanners — it complements them. Scanners find known patterns; LLMs reason about novel combinations and context-specific risks.

Tooling: Infrastructure Scanning Methodology

A systematic config audit uses multiple tools at different layers:

ToolTargetWhat It Finds
NmapNetworkOpen ports, service versions, running scripts for known vulns
ScoutSuiteCloud (AWS, Azure, GCP)Multi-cloud security audit: IAM, storage, compute, networking
ProwlerAWSCIS AWS Benchmark checks, PCI-DSS, HIPAA compliance
kube-benchKubernetesCIS Kubernetes Benchmark compliance for masters and nodes

Scanning Methodology

  1. Enumerate: Discover all assets (Nmap for network, cloud provider APIs for cloud resources)
  2. Baseline: Run automated scanners (ScoutSuite, Prowler, kube-bench) to identify deviations from benchmarks
  3. Deep-dive: Manually review high-risk configurations (IAM policies, network ACLs, container security contexts)
  4. AI-augment: Feed complex configs to Claude for contextual analysis and hardening recommendations
  5. Remediate: Prioritize findings by severity and blast radius; fix critical issues first
  6. Validate: Re-run scanners to confirm fixes; add checks to CI/CD pipeline to prevent regression
# Run ScoutSuite against an AWS account
scout aws --no-browser --report-dir ./scoutsuite-report

# Run Prowler for CIS AWS checks
prowler aws --compliance cis_level1_aws

# Run kube-bench against a Kubernetes cluster
kube-bench run --targets master,node,policies --json > kube-bench-report.json
WARNING — Authorization Required: Only scan infrastructure that you own or have explicit written authorization to test. Unauthorized scanning is illegal under the Computer Fraud and Abuse Act (CFAA) and equivalent laws in most jurisdictions. In CTF environments, you are authorized to scan the challenge infrastructure. In professional engagements, always have a signed scope document before running any scanner. Even well-intentioned scanning of third-party systems can trigger alerts, cause service disruption, and result in legal consequences.

Further Reading

Challenge Resources

Download Files

Intentionally vulnerable configuration files. Each contains multiple security weaknesses to identify, analyze, and remediate. All files are plain text (.txt) and safe to open.