Cloud Verkenning

“De beste manier om een kasteel te verkennen is niet door tegen de muren te bonken, maar door de bouwtekeningen op te zoeken bij het kadaster.”

De cartograaf in de mist

Er is iets fundamenteel anders aan het verkennen van cloudomgevingen vergeleken met traditionele netwerken. Bij een klassieke pentest begin je met een IP-bereik, scan je poorten, en bouwt je langzaam een beeld op van wat er draait. Het is overzichtelijk. Het is tastbaar. Je kunt het tekenen op een whiteboard.

Cloud is anders. Cloud is een stad die zichzelf voortdurend herbouwt. Servers verschijnen en verdwijnen. IP-adressen roteren. Diensten hebben geen poorten in de traditionele zin – ze hebben API-endpoints, storage URLs, en management consoles die zich verschuilen achter domeinnamen die eruitzien alsof iemand zijn kat over het toetsenbord liet lopen. d3bucket-prod-eu-west-1-acme-backup-2024.s3.amazonaws.com. Ja, dat is een echt patroon.

En toch – en hier wordt het interessant – laat de cloud meer sporen achter dan welk traditioneel netwerk ook. Elke S3 bucket heeft een DNS-naam. Elke Azure-webapp eindigt op .azurewebsites.net. Elke GCP-service staat geregistreerd in certificate transparency logs. De cloud is als een stad die geen gordijnen kent: alles is zichtbaar, als je maar weet waar je moet kijken.

Het probleem is dat de meeste organisaties denken dat hun cloudinfrastructuur onzichtbaar is. Ze geloven oprecht dat het feit dat hun servers “in de cloud” draaien, betekent dat niemand ze kan vinden. Dat is alsof je denkt dat je auto onzichtbaar wordt omdat je hem in een parkeergarage zet. De auto staat er nog. Er staat een nummerbord op. En de parkeergarage heeft ramen.

In dit hoofdstuk gaan we systematisch door elke laag van cloud reconnaissance. We beginnen passief – zonder het doelwit aan te raken – en bouwen op naar technieken die actieve interactie vereisen. Bij elke stap laten we zien welke tools je gebruikt, welke fouten organisaties maken, en hoe IB het proces ondersteunt.

IB Tip: De Command Library bevat cloud-specifieke reconnaissance commands onder de prefix recon_*. Veel van de tools en technieken in dit hoofdstuk zijn beschikbaar als command files die je direct kunt kopieren en aanpassen.


2.1 Passieve reconnaissance

2.1.1 De kunst van het niet aanraken

Passieve reconnaissance in de cloud is een paradox: je verzamelt een enorme hoeveelheid informatie over iemands infrastructuur, en toch heb je geen enkel packet naar hun systemen gestuurd. Alles wat je vindt, is publiekelijk beschikbaar. Dat is het verontrustende deel. Niet dat jij het kunt vinden – maar dat iedereen het kan vinden.

De cloudproviders zelf zijn je beste vrienden bij passieve recon. Ze publiceren hun IP-bereiken. Ze registreren domeinnamen voor hun klanten. Ze loggen certificaten in publieke databases. Het is alsof een beveiligingsbedrijf een lijst publiceert van alle kluizen die het heeft geinstalleerd, inclusief adressen.

2.1.2 DNS: het fundament

Elke cloud reconnaissance begint met DNS. Niet omdat DNS de meest geavanceerde techniek is, maar omdat het de meest informatieve is. DNS-records vertellen je niet alleen waar een server staat – ze vertellen je bij welke cloudprovider, in welke regio, en vaak ook welke dienst wordt gebruikt.

# Basis DNS records opvragen
dig target.com ANY
dig target.com MX
dig target.com TXT
dig target.com NS
dig target.com CNAME

# Specifiek zoeken naar cloud-gerelateerde CNAME records
dig staging.target.com CNAME
dig api.target.com CNAME
dig mail.target.com CNAME
dig cdn.target.com CNAME

Waar je op let bij de resultaten:

DNS Record Cloud-indicatie Voorbeeld
CNAME naar *.amazonaws.com AWS (S3, CloudFront, ELB, API Gateway) bucket.s3.amazonaws.com
CNAME naar *.azurewebsites.net Azure App Service app.azurewebsites.net
CNAME naar *.cloudfront.net AWS CloudFront CDN d1234.cloudfront.net
CNAME naar *.blob.core.windows.net Azure Blob Storage storage.blob.core.windows.net
CNAME naar *.appspot.com Google App Engine project.appspot.com
CNAME naar *.trafficmanager.net Azure Traffic Manager app.trafficmanager.net
CNAME naar *.cloudfunctions.net GCP Cloud Functions region-project.cloudfunctions.net
CNAME naar *.elasticbeanstalk.com AWS Elastic Beanstalk env.elasticbeanstalk.com
MX naar *.google.com Google Workspace aspmx.l.google.com
MX naar *.outlook.com Microsoft 365 target-com.mail.protection.outlook.com
TXT met v=spf1 include:_spf.google.com Google als mailprovider
TXT met v=spf1 include:spf.protection.outlook.com Microsoft als mailprovider
TXT met MS=ms12345678 Microsoft 365 domeinverificatie
TXT met google-site-verification= Google domeinverificatie
TXT met amazonses: AWS SES (Simple Email Service)

Die TXT-records zijn goud waard. Een SPF-record dat include:amazonses.com bevat, vertelt je dat het bedrijf AWS SES gebruikt voor transactionele e-mail. Een domeinverificatie-record voor Microsoft 365 vertelt je dat ze Office 365 draaien. Het is een boodschappenlijst van cloud-diensten, gratis beschikbaar voor iedereen die ernaar vraagt.

En dan zijn er nog de NS-records. Als de nameservers awsdns bevatten, dan gebruikt het bedrijf Route 53. Als ze azure-dns bevatten, Azure DNS. Als ze googledomains bevatten, Google Cloud DNS. De DNS-provider is vaak dezelfde als de primaire cloudprovider. Niet altijd, maar vaak genoeg om er een aanname op te baseren.

# Route 53 detectie
dig target.com NS
# Look for: ns-xxxx.awsdns-xx.org

# Azure DNS detectie
dig target.com NS
# Look for: ns1-xx.azure-dns.com

# Google Cloud DNS detectie
dig target.com NS
# Look for: ns-cloud-xx.googledomains.com

2.1.3 Certificate Transparency logs

Certificate Transparency (CT) logs zijn misschien wel het krachtigste passieve reconnaissance-instrument dat ooit per ongeluk is gecreeerd. Het systeem werd ontworpen om frauduleuze TLS-certificaten te detecteren. Het neveneffect is dat elke certificaataanvraag – voor elk subdomein, elke testomgeving, elke vergeten staging-server – publiekelijk wordt gelogd.

Voor cloudverkenning is dit onbetaalbaar. Organisaties vragen certificaten aan voor hun cloud-endpoints, en daarmee publiceren ze effectief een inventarislijst van hun hele infrastructuur.

# Alle (sub)domeinen ophalen via crt.sh
curl -s "https://crt.sh/?q=%25.target.com&output=json" \
    | jq -r '.[].name_value' \
    | sort -u \
    | tee ct-subdomains.txt

# Filter op cloud-gerelateerde patronen
grep -iE "aws|azure|gcp|cloud|s3|blob|bucket|staging|dev|test|api" ct-subdomains.txt

# Zoek naar wildcard certificaten (vaak cloud load balancers)
curl -s "https://crt.sh/?q=%25.target.com&output=json" \
    | jq -r '.[].name_value' \
    | grep "\*\." \
    | sort -u

Het resultaat is vaak onthullend. dev-api.target.com, staging-app.target.com, jenkins.internal.target.com, grafana-monitoring.target.com. Elk van deze subdomeinen is een potentieel doelwit, en velen ervan waren nooit bedoeld om publiekelijk zichtbaar te zijn.

Het cynische deel? Organisaties besteden duizenden euro’s aan het verbergen van hun infrastructuur achter WAFs en CDNs, maar registreren vrolijk certificaten voor hun interne subdomeinen in publieke CT-logs. Het is alsof je een muur bouwt om je huis en dan een plattegrond van het interieur op de voordeur plakt.

Alternatieve CT-bronnen:

# Censys (gratis tier beschikbaar)
# Via de API:
curl -s "https://search.censys.io/api/v2/certificates/search?q=parsed.names:target.com" \
    -H "Authorization: Basic $(echo -n 'API_ID:API_SECRET' | base64)"

# Certspotter
curl -s "https://api.certspotter.com/v1/issuances?domain=target.com&include_subdomains=true&expand=dns_names" \
    | jq '.[].dns_names[]' \
    | sort -u

# Via subfinder (combineert meerdere bronnen)
subfinder -d target.com -sources certspotter,crtsh -silent

2.1.4 Shodan en Censys: het internet doorzoeken

Shodan en Censys scannen voortdurend het hele internet en indexeren alles wat ze vinden. Voor cloudverkenning bieden ze iets unieks: je kunt zoeken op specifieke cloudproviders, services, en zelfs configuratiefouten – zonder zelf een enkel pakket te versturen.

# Shodan CLI -- zoek naar target's cloud assets
shodan search "hostname:target.com"
shodan search "ssl.cert.subject.cn:target.com"
shodan search "org:\"Target Company B.V.\""

# Cloud-specifieke Shodan queries
shodan search "hostname:target.com cloud:aws"
shodan search "hostname:target.com cloud:azure"
shodan search "hostname:target.com cloud:gcp"

# S3 buckets die HTTP headers lekken
shodan search "x-amz-bucket-region hostname:target.com"

# Onbeveiligde diensten in de cloud
shodan search "org:\"Target Company\" port:27017"  # MongoDB
shodan search "org:\"Target Company\" port:9200"   # Elasticsearch
shodan search "org:\"Target Company\" port:6379"   # Redis

# Censys -- vergelijkbare zoekopdrachten
censys search "services.tls.certificates.leaf.names: target.com"
censys search "services.http.response.headers.server: nginx AND services.tls.certificates.leaf.names: target.com"

Shodan’s cloud filter is bijzonder handig. Het identificeert automatisch of een IP-adres in AWS, Azure, GCP, DigitalOcean, of een andere cloudprovider staat. In combinatie met organisatienaam of domeinnaam krijg je een overzicht van alle publiekelijk bereikbare cloud-assets.

De resultaten laten vaak patronen zien die het bedrijf liever verborgen had gehouden. Een MongoDB-instantie op poort 27017 in AWS, zonder authenticatie. Een Elasticsearch-cluster op poort 9200 in Azure, bereikbaar vanaf het internet. Een Redis-server op poort 6379 in GCP, met het standaard wachtwoord. Het klinkt als een karikatuur, maar het gebeurt dagelijks.

2.1.5 GitHub dorking voor cloud credentials

En dan komen we bij de moeder aller passieve reconnaissance-technieken: het doorzoeken van code repositories op hardcoded credentials. Het is 2026, en ontwikkelaars committen nog steeds AWS access keys naar publieke GitHub-repositories. Het is niet eens meer verrassend. Het is een natuurwet, zoals zwaartekracht of het feit dat wachtwoorden altijd op een Post-it naast het beeldscherm staan.

GitHub’s zoekfunctie is een wapen. Gebruik het.

# GitHub Dorks -- zoek in repositories van het target
# (via github.com/search of gh CLI)

# AWS access keys
org:target-company "AKIA"
org:target-company "aws_access_key_id"
org:target-company "aws_secret_access_key"

# Azure credentials
org:target-company "DefaultEndpointsProtocol=https" "AccountKey"
org:target-company "client_secret"
org:target-company "tenant_id" "client_id"
org:target-company "AZURE_CLIENT_SECRET"

# GCP credentials
org:target-company "private_key_id" "private_key"
org:target-company "type" "service_account"

# Generieke cloud secrets
org:target-company filename:.env
org:target-company filename:credentials
org:target-company filename:config extension:yml "password"
org:target-company filename:docker-compose "AWS_"
org:target-company filename:terraform.tfstate
org:target-company filename:.tfvars

# Database connection strings
org:target-company "mongodb+srv://"
org:target-company "postgresql://" "password"
org:target-company "mysql://" "password"

De AKIA prefix is bijzonder nuttig. Alle AWS access key IDs beginnen met AKIA (voor permanente keys) of ASIA (voor tijdelijke credentials via STS). Als je AKIA vindt in een publieke repository, heb je een AWS access key gevonden. Punt. Er is geen andere reden waarom die string in broncode zou staan.

IB Tip: De Command Library bevat GitHub dorking queries voor cloud credentials. Zoek naar cred_* commands voor credential hunting workflows. Combineer deze met de tools in de volgende secties voor geautomatiseerde scans.

Verdedigingsmaatregel: Implementeer pre-commit hooks die credentials detecteren (bijv. git-secrets, detect-secrets). Gebruik AWS Secrets Manager of Azure Key Vault in plaats van hardcoded credentials. Activeer GitHub’s Secret Scanning en reageer onmiddellijk op alerts. Roteer alle credentials die ooit in een repository hebben gestaan – verwijderen uit de code is niet genoeg, want de git history onthoudt alles.


2.2 Subdomain enumeration

2.2.1 Cloud-specifieke subdomeinen

Traditionele subdomain enumeration richt zich op het vinden van alle subdomeinen van een organisatie. Cloud-specifieke subdomain enumeration gaat een stap verder: het zoekt naar subdomeinen die verwijzen naar cloud-diensten, en identificeert daarmee de cloud-footprint van de organisatie.

De cloudproviders gebruiken voorspelbare naamgevingspatronen. Dat is goed voor de bruikbaarheid, maar het maakt het ook makkelijker om ze te vinden.

Cloud Provider Service Patroon
AWS S3 *.s3.amazonaws.com, *.s3-REGION.amazonaws.com
AWS CloudFront *.cloudfront.net
AWS ELB *.elb.amazonaws.com
AWS API Gateway *.execute-api.REGION.amazonaws.com
AWS Elastic Beanstalk *.elasticbeanstalk.com
AWS EC2 ec2-IP.REGION.compute.amazonaws.com
Azure App Service *.azurewebsites.net
Azure Blob Storage *.blob.core.windows.net
Azure CDN *.azureedge.net
Azure Traffic Manager *.trafficmanager.net
Azure API Management *.azure-api.net
Azure Front Door *.azurefd.net
GCP App Engine *.appspot.com
GCP Cloud Storage storage.googleapis.com/BUCKET
GCP Cloud Functions REGION-PROJECT.cloudfunctions.net
GCP Cloud Run *.run.app
GCP Firebase *.firebaseapp.com, *.web.app

2.2.2 Tools voor subdomain enumeration

subfinder is de snelste en meest betrouwbare tool voor passieve subdomain enumeration. Het combineert tientallen bronnen – CT logs, Shodan, Censys, VirusTotal, en meer – in een enkele scan.

# Basis subdomain enumeration
subfinder -d target.com -o subdomains.txt

# Met alle bronnen en verbose output
subfinder -d target.com -all -v -o subdomains.txt

# Alleen cloud-gerelateerde subdomeinen
subfinder -d target.com -all -silent \
    | grep -iE "aws|azure|gcp|cloud|s3|blob|bucket|cdn|api|staging|dev"

# Meerdere domeinen tegelijk
subfinder -dL domains.txt -all -o all-subdomains.txt

amass gaat dieper. Het voert niet alleen passieve enumeratie uit, maar kan ook actieve DNS bruteforce, zone transfers, en ASN-mapping doen.

# Passieve enumeratie (geen verkeer naar target)
amass enum -passive -d target.com -o amass-passive.txt

# Actieve enumeratie (met toestemming!)
amass enum -active -d target.com -o amass-active.txt

# Intel-modus: ontdek gerelateerde domeinen via ASN en WHOIS
amass intel -org "Target Company B.V." -o amass-intel.txt
amass intel -asn 12345 -o amass-asn.txt

# Combineer passief + brute force + alterations
amass enum -passive -brute -d target.com \
    -w /usr/share/wordlists/cloud-subdomains.txt \
    -o amass-full.txt

cloud_enum is specifiek ontworpen voor het vinden van cloud-assets. Het zoekt niet alleen naar subdomeinen, maar ook naar S3 buckets, Azure blobs, en GCP buckets op basis van naamgevingsconventies.

# Installatie
pip3 install cloud_enum

# Basis scan
cloud_enum -k target -k targetcompany -k target-company

# Met extra keywords en output
cloud_enum -k target -k targetcompany -k target-prod -k target-dev \
    -l cloud_enum_results.txt

# Alleen specifieke providers
cloud_enum -k target --disable-gcp  # Alleen AWS en Azure
cloud_enum -k target --disable-azure --disable-gcp  # Alleen AWS

cloud_enum probeert variaties op de opgegeven keywords: target-dev, target-staging, target-backup, target-prod, target-data, etc. Het is verbazingwekkend hoe vaak organisaties deze voor de hand liggende naamgevingsconventies gebruiken. acme-backup-prod, acme-database-staging, acme-logs-2024. Het is alsof je je kluiscode baseert op je geboortedatum en dan hoopt dat niemand aan je verjaardag denkt.

2.2.3 Dangling DNS en subdomain takeover

Een bijzonder gevaarlijk scenario in cloud-omgevingen is de dangling DNS-record: een CNAME-record dat verwijst naar een cloud-service die niet meer bestaat. De DNS-record is er nog, maar de service erachter is opgeheven. Dit opent de deur voor subdomain takeover – een aanvaller kan de orphaned cloud-resource claimen en daarmee het subdomein overnemen.

# Zoek naar potentiele subdomain takeovers
# Stap 1: Verzamel subdomeinen
subfinder -d target.com -all -silent > subs.txt

# Stap 2: Check welke subdomeinen een CNAME hebben
cat subs.txt | while read sub; do
    cname=$(dig +short CNAME "$sub" 2>/dev/null)
    if [ -n "$cname" ]; then
        echo "$sub -> $cname"
    fi
done | tee cname-records.txt

# Stap 3: Filter op cloud providers
grep -iE "amazonaws|azurewebsites|cloudfront|trafficmanager|herokuapp|azureedge|azurefd|elasticbeanstalk|s3" cname-records.txt

# Stap 4: Check of de cloud resource nog bestaat
# Een NXDOMAIN of specifieke foutpagina duidt op takeover-mogelijkheid
cat cloud-cnames.txt | while read line; do
    sub=$(echo "$line" | awk '{print $1}')
    result=$(curl -s -o /dev/null -w "%{http_code}" "https://$sub" 2>/dev/null)
    echo "$sub: HTTP $result"
done

Veelvoorkomende signalen van kwetsbare subdomeinen:

Cloud Service Signaal van Takeover
AWS S3 NoSuchBucket XML-response
Azure App Service *.azurewebsites.net -- 404 met Azure-branding
Azure Traffic Manager NXDOMAIN op *.trafficmanager.net
AWS CloudFront Bad Request met CloudFront-headers
AWS Elastic Beanstalk NXDOMAIN op *.elasticbeanstalk.com
GitHub Pages 404 -- There isn't a GitHub Pages site here
Heroku No such app
Azure CDN *.azureedge.net NXDOMAIN

Verdedigingsmaatregel: Implementeer een proces voor het opruimen van DNS-records wanneer cloud-resources worden opgeheven. Gebruik tools als subjack of nuclei met subdomain takeover templates om proactief te scannen. Overweeg CNAME-records te vermijden voor kritieke subdomeinen en gebruik in plaats daarvan A-records met IP-adressen die je beheert.

Let op: Subdomain takeover is niet alleen een theoretisch risico. Een aanvaller die een subdomein overneemt, kan phishing-pagina’s hosten onder het domein van de organisatie, cookies stelen die voor het hoofddomein zijn ingesteld, en SSL-certificaten aanvragen die er legitiem uitzien. Het is een van de meest onderschatte cloud-risico’s.


2.3 Storage bucket discovery

2.3.1 De digitale vuilnisbelt

Cloud storage buckets – S3 in AWS, Blob Storage in Azure, Cloud Storage in GCP – zijn de digitale equivalent van opslagruimtes. Organisaties gooien er alles in: backups, logbestanden, klantdata, configuratiebestanden, database dumps. En net als bij fysieke opslagruimtes vergeten ze regelmatig de deur op slot te doen.

Het fundamentele probleem is een mismatch tussen de standaardconfiguratie en de verwachting van de gebruiker. AWS S3 buckets zijn tegenwoordig standaard privaat – maar dat was niet altijd zo. En zelfs nu nog worden ze regelmatig verkeerd geconfigureerd, omdat het permissiemodel verwarrend is. Er zijn bucket-level policies, object-level ACLs, block public access settings, en IAM policies die allemaal met elkaar interageren op manieren die zelfs AWS-engineers niet in een zin kunnen uitleggen.

Het is alsof je een kluis hebt met vier verschillende sloten, drie codepanelen en een vingerafdrukscanner, maar als je een van de sloten openlaat, is de hele kluis open. Dat is S3 bucket security.

2.3.2 S3 Bucket Discovery

AWS S3 buckets hebben voorspelbare URL-patronen:

# Twee URL-stijlen
https://BUCKET.s3.amazonaws.com/
https://s3.amazonaws.com/BUCKET/

# Regio-specifiek
https://BUCKET.s3.REGION.amazonaws.com/
https://s3.REGION.amazonaws.com/BUCKET/

De truc is om de juiste bucketnaam te raden. Organisaties gebruiken voorspelbare patronen:

# Handmatig testen van veelvoorkomende naampatronen
for prefix in target target-com targetcompany target-company; do
    for suffix in "" -dev -staging -prod -backup -data -logs -assets \
                 -media -uploads -static -config -db -database -archive \
                 -internal -private -public -www -web -cdn -test -temp; do
        bucket="${prefix}${suffix}"
        status=$(curl -s -o /dev/null -w "%{http_code}" \
                 "https://${bucket}.s3.amazonaws.com/" 2>/dev/null)
        if [ "$status" != "404" ]; then
            echo "[${status}] ${bucket}"
        fi
    done
done

HTTP-statuscodes en wat ze betekenen:

Code Betekenis
200 Bucket bestaat en is publiekelijk listbaar – jackpot
403 Bucket bestaat maar is niet publiekelijk toegankelijk
404 Bucket bestaat niet
301 Bucket bestaat in een andere regio

Een 403 is geen doodlopende weg. Het bevestigt dat de bucket bestaat, wat op zichzelf al waardevolle informatie is. Bovendien kunnen individuele objecten in een niet-listbare bucket wel publiekelijk leesbaar zijn – het is een veelgemaakte configuratiefout.

2.3.3 Tools voor bucket discovery

S3Scanner is ontworpen voor het vinden en testen van S3 buckets:

# Installatie
pip3 install s3scanner

# Scan vanuit een woordenlijst
s3scanner scan --buckets-file bucket-names.txt

# Dump de inhoud van een publiekelijk toegankelijke bucket
s3scanner dump --bucket target-backup

# Controleer permissies
s3scanner scan --bucket target-company-prod

BlobHunter doet hetzelfde voor Azure Blob Storage:

# Installatie
pip3 install blobhunter

# Scan Azure Blob Storage
# Azure Blob URL patroon: https://ACCOUNT.blob.core.windows.net/CONTAINER
blobhunter -a targetcompany

Azure Blob Storage URLs volgen het patroon:

https://STORAGE_ACCOUNT.blob.core.windows.net/CONTAINER/BLOB

Net als bij S3 zijn de storage account-namen vaak voorspelbaar:

# Azure Blob Storage brute force
for account in target targetcompany targetdata targetbackup targetstorage; do
    for container in data backup logs files uploads assets config; do
        url="https://${account}.blob.core.windows.net/${container}?restype=container&comp=list"
        status=$(curl -s -o /dev/null -w "%{http_code}" "$url" 2>/dev/null)
        if [ "$status" != "404" ] && [ "$status" != "000" ]; then
            echo "[${status}] ${account}/${container}"
        fi
    done
done

GCP Cloud Storage heeft een vergelijkbaar patroon:

# GCP bucket URLs
# https://storage.googleapis.com/BUCKET/
# https://BUCKET.storage.googleapis.com/

# Brute force
for bucket in target target-prod target-backup target-data; do
    status=$(curl -s -o /dev/null -w "%{http_code}" \
             "https://storage.googleapis.com/${bucket}/" 2>/dev/null)
    if [ "$status" != "404" ]; then
        echo "[${status}] gs://${bucket}"
    fi
done

2.3.4 Naamgevingsconventies die je moet proberen

Organisaties zijn voorspelbaar. Dit zijn de meest voorkomende patronen voor storage buckets:

# Basis variaties
target
targetcompany
target-company
target.company
targetcom
target-com

# Omgevingen
target-dev
target-staging
target-prod
target-production
target-uat
target-test
target-qa

# Functie
target-backup
target-backups
target-data
target-database
target-db
target-logs
target-logging
target-media
target-uploads
target-assets
target-static
target-cdn
target-config
target-configuration
target-internal
target-private
target-archive
target-temp
target-tmp
target-public
target-web
target-www
target-images
target-documents
target-reports

# Met jaar/datum
target-backup-2024
target-backup-2025
target-data-2024
target-archive-2023

# Met regio
target-eu-west-1
target-us-east-1
target-eu
target-us

Het klinkt bijna te simpel. Dat is het ook. En toch werkt het. Herhaaldelijk. Bij grote organisaties. Met gevoelige data. Het is een van die momenten waarop je je afvraagt of de hele beveiligingsindustrie een groot sociaal experiment is.

Verdedigingsmaatregel: Gebruik onvoorspelbare namen voor storage buckets. Activeer “Block Public Access” op accountniveau in AWS. Gebruik Azure Private Endpoints. Configureer bucket policies die expliciete Deny bevatten voor publieke toegang. Monitor op public bucket-creatie via CloudTrail/Activity Log/Audit Log.


2.4 Cloud metadata fingerprinting

2.4.1 Hoe herken je welke cloud een target gebruikt?

Voordat je specifieke cloudaanvallen kunt uitvoeren, moet je weten welke cloudprovider het doelwit gebruikt. Soms is dat evident – een CNAME naar amazonaws.com laat weinig aan de verbeelding over. Maar vaak is de cloud-infrastructuur verborgen achter CDNs, load balancers en custom domeinnamen.

Er zijn meerdere technieken om de cloudprovider te identificeren:

2.4.2 HTTP headers

HTTP-responses bevatten verrassend veel informatie over de onderliggende infrastructuur:

# Haal HTTP headers op
curl -sI https://target.com

# Zoek naar cloud-specifieke headers
curl -sI https://target.com | grep -iE "x-amz|x-ms|x-goog|x-azure|server|x-cache|via"
Header Cloud Provider Voorbeeld
x-amz-request-id AWS S3, API Gateway
x-amz-cf-id AWS CloudFront CDN
x-amz-cf-pop AWS CloudFront Edge location
x-amzn-requestid AWS ALB, API Gateway
x-ms-request-id Azure Diverse services
x-ms-version Azure Blob Storage
x-azure-ref Azure Front Door CDN/WAF
x-goog-* GCP Cloud Storage, etc.
Server: AmazonS3 AWS S3
Server: Microsoft-IIS Azure App Service (IIS)
Server: Google Frontend GCP App Engine
Via: 1.1 *.cloudfront.net AWS CloudFront CDN
X-Cache: Hit from cloudfront AWS CloudFront CDN cache hit
X-Served-By: cache-* Fastly CDN CDN

2.4.3 IP-bereiken en ASN lookup

De cloudproviders publiceren hun IP-bereiken. Je kunt een IP-adres opzoeken om te bepalen bij welke provider het hoort:

# IP-adres van het target ophalen
target_ip=$(dig +short target.com | head -1)

# ASN lookup via whois
whois -h whois.cymru.com " -v $target_ip"

# Of via de Team Cymru bulk service
echo "$target_ip" | nc whois.cymru.com 43

# BGP/ASN lookup via ipinfo.io
curl -s "https://ipinfo.io/$target_ip" | jq '.org, .company.name'

De grote cloudproviders hebben herkenbare ASN-nummers:

Provider ASN Organisatie
AWS AS16509 Amazon.com, Inc.
AWS AS14618 Amazon.com, Inc.
Azure AS8075 Microsoft Corporation
Azure AS8068 Microsoft Corporation
GCP AS15169 Google LLC
GCP AS396982 Google LLC
DigitalOcean AS14061 DigitalOcean, LLC
Cloudflare AS13335 Cloudflare, Inc.
Oracle Cloud AS31898 Oracle Corporation

AWS publiceert zijn volledige IP-bereik in JSON-formaat:

# Download AWS IP-bereiken
curl -s https://ip-ranges.amazonaws.com/ip-ranges.json \
    | jq '.prefixes[] | select(.ip_prefix | startswith("'$(echo $target_ip | cut -d. -f1-2)'"))'

# Check of een IP in AWS zit
curl -s https://ip-ranges.amazonaws.com/ip-ranges.json \
    | jq --arg ip "$target_ip" \
    '.prefixes[] | select(.ip_prefix as $prefix |
     ($ip | split(".") | .[0:2] | join(".")) ==
     ($prefix | split("/")[0] | split(".") | .[0:2] | join(".")))'

Azure en GCP publiceren vergelijkbare bestanden:

# Azure IP-bereiken (download link verandert regelmatig)
# Zoek op: "Azure IP Ranges and Service Tags" in Microsoft Download Center

# GCP IP-bereiken
dig TXT _cloud-netblocks.googleusercontent.com @ns1.google.com

2.4.4 Overige fingerprinting-methoden

# Nmap service detection op cloud ports
nmap -sV -p 443 target.com

# SSL-certificaat details
echo | openssl s_client -connect target.com:443 2>/dev/null \
    | openssl x509 -noout -text \
    | grep -E "Issuer|Subject|DNS"

# Bekijk de certificate chain -- cloud load balancers
# hebben vaak herkenbare intermediate certificates
echo | openssl s_client -connect target.com:443 -showcerts 2>/dev/null \
    | grep "s:/"

Cloudproviders gebruiken specifieke certificate authorities en patronen in hun TLS-certificaten. AWS Certificate Manager-certificaten worden uitgegeven door Amazon Trust Services. Azure-certificaten komen vaak van DigiCert of Microsoft IT TLS CA. Google gebruikt zijn eigen Google Trust Services. Het certificaat zelf is een vingerafdruk.

Verdedigingsmaatregel: Gebruik een CDN of reverse proxy voor je publiekelijk bereikbare endpoints. Verwijder overbodige HTTP-headers (veel webservers en frameworks lekken standaard informatie). Configureer custom domain names in plaats van de standaard cloud-domeinnamen. Geen van deze maatregelen maakt je onvindbaar, maar ze verhogen de drempel.


2.5 Credential hunting

2.5.1 Het digitale sleutelrek

Credentials zijn de sleutels tot de cloud. Een AWS access key geeft je API-toegang. Een Azure service principal met client secret geeft je Azure-toegang. Een GCP service account key geeft je GCP-toegang. En al deze sleutels worden met een deprimerende regelmaat achtergelaten op plekken waar ze niet horen.

Het probleem is structureel. Ontwikkelaars moeten credentials gebruiken om met cloud-APIs te praten. Die credentials moeten ergens staan. En “ergens” is te vaak een .env-bestand dat per ongeluk is gecommit, een Docker Compose-bestand met hardcoded wachtwoorden, of een Terraform state file die in een publieke S3 bucket ligt.

Het is het digitale equivalent van je huissleutel onder de deurmat leggen. Iedereen weet dat het daar ligt. Iedereen weet dat het geen goed idee is. En toch doen miljoenen mensen het elke dag.

2.5.2 Geautomatiseerde credential scanning

TruffleHog doorzoekt git-repositories op high-entropy strings en bekende credential-patronen:

# Scan een enkele repository
trufflehog git https://github.com/target-company/repo.git

# Scan een hele GitHub-organisatie
trufflehog github --org target-company

# Scan ook git history (waar verwijderde credentials nog leven)
trufflehog git https://github.com/target-company/repo.git --only-verified

# Scan een lokale directory
trufflehog filesystem /pad/naar/code

# Scan met JSON output voor verdere verwerking
trufflehog github --org target-company --json | jq '.'

TruffleHog v3 verifieert gevonden credentials automatisch – het probeert daadwerkelijk in te loggen met gevonden AWS keys, GitHub tokens, etc. Dit is enorm waardevol, maar het betekent ook dat je actief credentials test. Zorg dat je daar toestemming voor hebt.

Gitleaks is een alternatief met een focus op snelheid en configureerbaarheid:

# Scan een repository
gitleaks detect --source https://github.com/target-company/repo.git

# Scan met uitgebreide regex-patronen
gitleaks detect --source /pad/naar/repo -v

# Genereer een rapport
gitleaks detect --source /pad/naar/repo --report-format json --report-path leaks.json

# Alleen de huidige staat scannen (niet de history)
gitleaks detect --source /pad/naar/repo --no-git

2.5.3 Herkenbare credential-patronen

Weten waar je naar zoekt is het halve werk:

Credential Type Patroon Voorbeeld
AWS Access Key ID AKIA[A-Z0-9]{16} AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key 40 chars base64 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS Session Token ASIA[A-Z0-9]{16} + token Lange base64 string
Azure Client Secret Variabel (UUID-achtig) abc8Q~abcdefghij...
Azure Connection String DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...
GCP Service Account Key JSON met "type": "service_account" JSON-bestand
GCP API Key AIza[A-Za-z0-9_-]{35} AIzaSyD-abcdefghijklmnopqrstuvwxyz12
GitHub Token ghp_[A-Za-z0-9]{36} ghp_abcdefghij1234567890abcdefghij12
Slack Token xoxb- of xoxp- xoxb-123456789012-...
Terraform State "type": "aws_iam_access_key" In .tfstate bestanden

2.5.4 Pastebin en publieke dumps

Naast code repositories lekken credentials naar paste sites, forums, en publieke databases:

# Zoek op Pastebin (handmatig of via Google dorks)
# site:pastebin.com "target.com" "password"
# site:pastebin.com "target.com" "aws_access"

# Dehashed / breach databases (legale toegang vereist)
# Zoek op bedrijfsdomeinen voor gelekte credentials

# VirusTotal -- soms bevatten geanalyseerde malware samples hardcoded creds
# https://www.virustotal.com -- zoek op domeinnaam

2.5.5 .env bestanden en configuratie-endpoints

Een verbazingwekkend aantal webapplicaties heeft .env-bestanden die publiekelijk toegankelijk zijn. Dit bestand bevat doorgaans alle omgevingsvariabelen van de applicatie – inclusief database-credentials, API-keys en cloud-secrets.

# Test of .env publiekelijk toegankelijk is
curl -s https://target.com/.env
curl -s https://target.com/.env.local
curl -s https://target.com/.env.production
curl -s https://target.com/.env.backup

# Laravel-specifiek
curl -s https://target.com/.env
# Bevat vaak: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, DB_PASSWORD

# Node.js configuratie
curl -s https://target.com/config.js
curl -s https://target.com/config.json

# Spring Boot actuator (vaak met cloud credentials)
curl -s https://target.com/actuator/env
curl -s https://target.com/actuator/configprops

De Spring Boot Actuator-endpoint /actuator/env is een bijzonder rijke bron. Het toont alle omgevingsvariabelen van de applicatie, inclusief AWS keys, database-wachtwoorden en interne service-URLs. Spring Boot maskeert gevoelige waarden standaard met sterretjes, maar oudere versies en misconfiguraties laten de volledige waarden zien.

Verdedigingsmaatregel: Gebruik secrets management (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault). Blokkeer toegang tot .env bestanden in je webserver-configuratie. Schakel actuator endpoints uit of beveilig ze. Draai regelmatig geautomatiseerde scans met TruffleHog of Gitleaks op je eigen repositories. Roteer credentials onmiddellijk na een lek – verwijderen is niet genoeg.


2.6 Cloud API reconnaissance

2.6.1 Het onbeveiligde loket

Elke cloudprovider heeft API-endpoints die informatie weggeven zonder authenticatie. Niet per ongeluk – het is by design. De provider wil dat tools en services bepaalde informatie kunnen opvragen zonder dat je eerst inlogt. Het probleem is dat aanvallers dezelfde endpoints gebruiken.

2.6.2 AWS Account ID discovery

Een AWS account ID is een 12-cijferig getal dat uniek is voor elke AWS-account. Op zichzelf lijkt het onschuldig. Maar met een account ID kun je IAM-rollen raden, S3 bucket policies analyseren, en cross-account aanvallen voorbereiden.

# Methode 1: Via een publiekelijk toegankelijke S3 bucket
# Als je een bucket vindt, staat de account ID vaak in de bucket policy
aws s3api get-bucket-policy --bucket target-public-bucket --no-sign-request 2>/dev/null \
    | jq -r '.Policy' | jq '.Statement[].Principal.AWS'

# Methode 2: Via STS en een bekende IAM-rol
# Als je een AWS access key hebt (zelfs met minimale rechten):
aws sts get-caller-identity
# Output bevat: Account ID, ARN, UserId

# Methode 3: Via IAM role enumeration (met geldige credentials)
# Probeer AssumeRole met geraden rolnamen
for role in admin AdminRole ec2-role lambda-role; do
    aws sts assume-role \
        --role-arn "arn:aws:iam::ACCOUNT_ID:role/$role" \
        --role-session-name test 2>&1 \
        | grep -v "AccessDenied" && echo "Role exists: $role"
done

# Methode 4: Via error messages
# Veel AWS services lekken de account ID in foutmeldingen
# Bijv. een 403 op een S3 object kan de bucket-owner account ID bevatten

Een bijzonder slimme techniek is het gebruik van s3:GetBucketPolicy op publieke buckets. Als een bucket een policy heeft die verwijst naar een specifiek AWS-account, staat dat account ID letterlijk in de policy. Het is alsof de eigenaar van een kluis zijn naam en adres op de buitenkant heeft gegraveerd.

2.6.3 Azure Tenant Enumeration

Azure Active Directory (nu Entra ID) tenants zijn enumereerbaar via publieke endpoints. Je kunt bepalen of een organisatie Azure gebruikt, wat hun tenant ID is, en welke domeinen eraan gekoppeld zijn.

# Check of een domein Azure AD/Entra ID gebruikt
curl -s "https://login.microsoftonline.com/target.com/.well-known/openid-configuration" \
    | jq '.authorization_endpoint'
# Als het een geldig antwoord geeft, gebruikt het bedrijf Azure AD

# Haal de tenant ID op
curl -s "https://login.microsoftonline.com/target.com/.well-known/openid-configuration" \
    | jq -r '.token_endpoint' \
    | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'

# Alternatief: via de GetCredentialType API
# Bepaalt of een account bestaat en welk authenticatieprotocol wordt gebruikt
curl -s -X POST "https://login.microsoftonline.com/common/GetCredentialType" \
    -H "Content-Type: application/json" \
    -d '{"Username":"admin@target.com"}' \
    | jq '.IfExistsResult'
# 0 = account bestaat, 1 = account bestaat niet, 5 = bestaat niet,
# 6 = bestaat in een ander domein

# Enumereer gebruikersnamen (voorzichtig: kan rate-limited worden)
for user in admin info hr finance ceo cfo; do
    result=$(curl -s -X POST \
        "https://login.microsoftonline.com/common/GetCredentialType" \
        -H "Content-Type: application/json" \
        -d "{\"Username\":\"${user}@target.com\"}" \
        | jq -r '.IfExistsResult')
    echo "$user@target.com: $result"
done

Die GetCredentialType API is een van de meest misbruikte Azure-endpoints. Het was bedoeld om de login-ervaring te verbeteren – zodat de browser weet of het Microsoft-authenticatie of federatie moet gebruiken. Het neveneffect is dat je kunt enumereren welke accounts bestaan. Microsoft heeft rate limiting toegevoegd, maar met voldoende geduld kun je nog steeds een aanzienlijke lijst opbouwen.

2.6.4 GCP Project Discovery

GCP gebruikt project IDs als primaire organisatie-eenheid. Projects zijn minder makkelijk te enumereren dan AWS accounts of Azure tenants, maar er zijn methoden:

# GCP project IDs lekken vaak in:
# - Firebase configuraties (publiekelijk in JavaScript)
# - Cloud Storage bucket names (vaak: PROJECT_ID.appspot.com)
# - Error messages van GCP services
# - Google APIs die project IDs bevatten in URLs

# Check Firebase configuratie
curl -s "https://target.com/__/firebase/init.json" 2>/dev/null | jq '.'

# Firebase projecten zoeken
curl -s "https://target.firebaseio.com/.json"
# Als dit data retourneert, is de Firebase database publiekelijk leesbaar

# GCP API discovery via CORS misconfigs
# App Engine apps zijn bereikbaar via: PROJECT_ID.appspot.com
for project in target targetapp target-prod target-api; do
    status=$(curl -s -o /dev/null -w "%{http_code}" "https://${project}.appspot.com")
    if [ "$status" != "404" ] && [ "$status" != "000" ]; then
        echo "[${status}] ${project}.appspot.com"
    fi
done

Firebase-databases zijn een bijzonder veelvoorkomend doelwit. De Firebase Realtime Database is standaard beveiligd met regels, maar ontwikkelaars overschrijven die regels regelmatig met ".read": true om tijdens de ontwikkeling makkelijker te kunnen testen. En dan vergeten ze het terug te zetten. Het resultaat: complete databases met gebruikersgegevens, berichten, en applicatiedata die door iedereen te lezen zijn via een simpele HTTP-request.

Verdedigingsmaatregel: Beperk de informatie die publieke API-endpoints weggeven. Gebruik Smart Lockout in Azure AD om brute force te detecteren. Beveilig Firebase met adequate security rules. Monitor login-pogingen op ongebruikelijke patronen.


2.7 SSL/TLS en cloud

2.7.1 Certificaten als informatiebron

SSL/TLS-certificaten zijn meer dan een beveiligingsmechanisme – ze zijn een informatiebron. Elk certificaat bevat de domeinnamen waarvoor het is uitgegeven (Subject Alternative Names), de issuer, de geldigheidsperiode, en soms zelfs organisatie-informatie. In cloudcontexten onthullen certificaten vaak de onderliggende infrastructuur.

# Haal certificaatdetails op
echo | openssl s_client -connect target.com:443 -servername target.com 2>/dev/null \
    | openssl x509 -noout -text

# Alleen Subject Alternative Names (alle domeinen op het certificaat)
echo | openssl s_client -connect target.com:443 -servername target.com 2>/dev/null \
    | openssl x509 -noout -ext subjectAltName

# Bekijk de volledige certificate chain
echo | openssl s_client -connect target.com:443 -servername target.com -showcerts 2>/dev/null

# Haal de issuer op (onthult vaak cloud-specifieke CA)
echo | openssl s_client -connect target.com:443 -servername target.com 2>/dev/null \
    | openssl x509 -noout -issuer

2.7.2 Wildcard certificaten

Wildcard certificaten (*.target.com) zijn bijzonder informatief in cloudomgevingen. Een wildcard certificaat op een cloud load balancer beschermt vaak tientallen subdomeinen – en de SAN-lijst onthult ze allemaal.

Maar er is een subtiel risico: als een organisatie een wildcard certificaat gebruikt voor al hun cloud-services, dan deelt elke service dezelfde private key. Compromitteer een service, en je hebt de TLS-private key voor alles.

2.7.3 Cloud load balancer detectie

Cloud load balancers hebben herkenbare kenmerken in hun TLS-configuratie:

# Detecteer het type load balancer via TLS
# AWS ALB/NLB: Amazon-uitgegeven certificaten
# Azure Application Gateway: Microsoft-uitgegeven certificaten
# GCP HTTPS Load Balancer: Google-uitgegeven certificaten

# Gebruik testssl.sh voor uitgebreide TLS-analyse
testssl.sh --quiet target.com

# Of sslyze voor geautomatiseerde checks
sslyze target.com --regular
Kenmerk AWS Azure GCP
Typische CA Amazon Trust Services DigiCert / Microsoft Google Trust Services
Cipher suites AWS-specifieke set Azure-specifieke set Google-specifieke set
TLS versies TLS 1.2/1.3 TLS 1.2/1.3 TLS 1.2/1.3
ALPN h2, http/1.1 h2, http/1.1 h2, http/1.1
Herkenbaar header Server: awselb/2.0 x-azure-ref via: 1.1 google

Verdedigingsmaatregel: Gebruik managed certificates van de cloudprovider – ze roteren automatisch. Vermijd wildcard certificaten waar mogelijk; gebruik in plaats daarvan SAN-certificaten met alleen de benodigde domeinnamen. Configureer TLS-policies die alleen sterke cipher suites toestaan.


2.8 IB voor cloud recon

2.8.1 Relevante Command Library items

Het IB-dashboard bevat command files die specifiek zijn ontworpen voor cloud reconnaissance. Hier is een overzicht van de relevante commando’s:

# Via de IB Command Library (/dashboard/commands)
# Zoek op 'recon_' voor alle reconnaissance commands

# DNS Recon
# Command: recon_dns
# Bevat: dig, host, dnsrecon, dnsenum, zone transfer attempts

# OSINT
# Command: recon_osint
# Bevat: theHarvester, Shodan CLI, recon-ng modules

# SCCM Recon (vaak hybride cloud/on-prem)
# Command: recon_sccm
# Bevat: SCCM enumeration voor hybride omgevingen

IB Tip: Maak een workflow aan die DNS recon, CT log enumeration, en cloud fingerprinting combineert. Start met recon_dns voor basis DNS-informatie, gebruik de output om cloud providers te identificeren, en zoek vervolgens gericht naar storage buckets en API endpoints. De Tasks-pagina kan meerdere recon-tools sequentieel uitvoeren.

2.8.2 Resultaten organiseren

Cloud recon genereert veel data. Organiseer het systematisch:

# Maak een directory structuur aan
mkdir -p raw/cloud/{dns,ct,buckets,creds,apis,fingerprints}

# Sla resultaten op per categorie
subfinder -d target.com -all -o raw/cloud/dns/subdomains.txt
# CT logs naar raw/cloud/ct/
# Bucket scans naar raw/cloud/buckets/
# Credential scans naar raw/cloud/creds/
# API recon naar raw/cloud/apis/
# Fingerprinting naar raw/cloud/fingerprints/

IB Tip: Gebruik de Notes-functie in IB om je cloud recon-bevindingen per categorie te documenteren. Maak een note aan voor elke cloudprovider die je identificeert, met de gevonden services, endpoints, en potentiele kwetsbaarheden. Deze notes vormen de basis voor je aanvalsstrategie in de volgende hoofdstukken.


2.9 Verdedigingsmaatregelen: een samenvatting

Het cynische deel van dit hoofdstuk zou hier kunnen eindigen met de observatie dat alles wat we hierboven hebben beschreven, voorkomen had kunnen worden met basishygiene. Maar laten we constructief zijn.

Risico Maatregel Prioriteit
DNS-informatielek Minimaliseer publieke DNS-records, gebruik split-horizon DNS Hoog
CT log exposure Accepteer het als onvermijdelijk; focus op het beveiligen van ontdekte endpoints Medium
Storage bucket misconfiguratie Block Public Access op accountniveau, onvoorspelbare namen Kritiek
Credential leaks in code Pre-commit hooks, secrets scanning, secrets management Kritiek
Subdomain takeover DNS-hygiene: verwijder records bij deprovisioning Hoog
Cloud metadata fingerprinting CDN/reverse proxy, verwijder informatieve headers Medium
API enumeration Rate limiting, IP-filtering op gevoelige endpoints Hoog
Azure tenant enumeration Smart Lockout, Conditional Access Medium
Firebase open databases Security rules auditen, testen met ongeauthenticeerde requests Kritiek
.env file exposure Webserver-configuratie: blokkeer dotfiles Kritiek

De rode draad: de meeste cloudlekken zijn geen softwarekwetsbaarheden. Het zijn configuratiefouten. En configuratiefouten zijn menselijke fouten. En menselijke fouten zijn onvermijdelijk. De enige verdediging is automatisering: beleid dat wordt afgedwongen door code, niet door procedures die in een SharePoint-document staan dat niemand leest.


2.10 De ongemakkelijke waarheid over cloud reconnaissance

Laten we eerlijk zijn. Alles wat we in dit hoofdstuk hebben besproken – DNS-records opvragen, CT logs doorzoeken, storage buckets raden, credentials zoeken op GitHub – het is niet geavanceerd. Het vereist geen diepe technische kennis. Het vereist geen custom tools of zero-days. Het vereist geduld, systematiek, en het vermogen om in Google te zoeken.

En dat is precies wat het zo verontrustend maakt.

De gemiddelde cloud-omgeving is niet kwetsbaar vanwege geavanceerde aanvallen. Het is kwetsbaar omdat iemand een S3 bucket bedrijfsnaam-backup heeft genoemd en vergeten is om de publieke toegang uit te schakelen. Omdat een ontwikkelaar een AWS access key in een Docker Compose-bestand heeft gezet en dat bestand naar GitHub heeft gepusht. Omdat de IT-afdeling een subdomein heeft aangemaakt voor een testomgeving, die testomgeving heeft opgeheven, en het DNS-record heeft laten staan.

Het is geen malice. Het is vergeetachtigheid op industriele schaal. En de cloud maakt het erger, niet beter. In een traditioneel netwerk zijn je fouten tenminste verborgen achter een firewall. In de cloud staan ze aan de weg, met een neonbord erboven.

De enige troost? Als pentester is dit goed nieuws. Er is altijd iets te vinden.


2.11 Referentietabel

Techniek Tool/Commando Doel MITRE ATT&CK
DNS Recon dig, host, dnsrecon Cloud provider identificatie via DNS records T1590.002
CT Log Enumeration crt.sh, certspotter, censys Subdomain discovery via certificate transparency T1596.003
Subdomain Enumeration subfinder, amass Volledige subdomain inventarisatie T1590.002
Cloud Asset Discovery cloud_enum S3/Azure Blob/GCP bucket discovery T1580
S3 Bucket Scanning s3scanner, aws s3 ls Publiekelijk toegankelijke buckets vinden T1530
Azure Blob Scanning blobhunter, curl Publiekelijk toegankelijke blob containers vinden T1530
Shodan/Censys shodan search, censys search Passieve asset discovery T1596.005
GitHub Dorking GitHub Search, gh search code Credentials in publieke repositories T1552.004
Credential Scanning trufflehog, gitleaks Geautomatiseerde credential detectie in code T1552.001
HTTP Header Analysis curl -sI Cloud provider fingerprinting via headers T1592.004
IP/ASN Lookup whois, ipinfo.io Cloud provider identificatie via IP-bereik T1590.005
Azure Tenant Enum login.microsoftonline.com API Azure AD tenant en gebruiker enumeratie T1589.002
GCP Project Discovery Firebase, App Engine URLs GCP project identificatie T1580
SSL/TLS Analysis testssl.sh, sslyze, openssl Certificate chain analyse, load balancer detectie T1596.003
Subdomain Takeover subjack, nuclei Dangling DNS records detecteren T1584.001
.env Exposure curl, ffuf Publiekelijk toegankelijke configuratiebestanden T1552.001
Pastebin/Breach Search Google dorks, Dehashed Gelekte credentials in publieke dumps T1589.001

Volgende hoofdstuk: Hoofdstuk 3 – AWS Aanvallen