s3scanner

Scanner rapide de buckets S3 et vérificateur de permissions. Teste les buckets pour un accès public en lecture/écriture, liste leur contenu et dumpe les fichiers de buckets AWS S3 mal configurés. Fast S3 bucket scanner and permission checker. Tests buckets for public read/write access, lists contents, and dumps files from misconfigured AWS S3 buckets.

↗ https://github.com/sa7mon/S3Scanner

Overview

S3Scanner probes AWS S3 buckets for misconfigured access controls. It checks if buckets exist, whether they allow anonymous read/write, and optionally dumps their contents. Useful for bug bounty, red team assessments, and validating S3 security posture.

Basic Usage

Scan a single bucket

s3scanner scan --bucket company-backup

Scan list of buckets from file

s3scanner scan --bucket-file buckets.txt

Also dump accessible files

s3scanner scan --bucket company-backup --dump

Specify output directory for dumps

s3scanner scan --bucket company-backup --dump --dump-dir ./downloads

Generating Bucket Names

# Generate permutations
company="targetcorp"
for suffix in "" "-dev" "-prod" "-staging" "-backup" "-data" "-logs" "-assets" "-static" "-uploads"; do
    echo "${company}${suffix}"
    echo "${suffix:1}-${company}" 2>/dev/null || true
done > buckets.txt

Scan the generated list

s3scanner scan --bucket-file buckets.txt

Checking Permissions

# S3Scanner checks these permissions:
# - READ         (list bucket contents)
# - WRITE        (upload files)
# - READ_ACP     (read ACL)
# - WRITE_ACP    (modify ACL)
# - FULL_CONTROL (all of the above)

# Results categories:
# [exists] [AuthUsers:READ] → readable by any authenticated AWS user
# [exists] [AllUsers:READ]  → publicly readable (anonymous)
# [exists] [AllUsers:WRITE] → publicly writable (very dangerous!)
# [exists] [private]        → no public access (correctly configured)

Manual Verification

Check if bucket exists and list contents

aws s3 ls s3://company-backup --no-sign-request

Download all files from public bucket

aws s3 sync s3://company-backup . --no-sign-request

Check bucket ACL (requires credentials)

aws s3api get-bucket-acl --bucket company-backup

Check bucket policy

aws s3api get-bucket-policy --bucket company-backup

Test anonymous write

aws s3 cp test.txt s3://company-backup/ --no-sign-request

Region Handling

Scan with specific AWS region

s3scanner scan --bucket company-backup --endpoint-url https://s3.us-west-2.amazonaws.com

For non-AWS S3-compatible services

s3scanner scan --bucket mybucket --endpoint-url https://minio.internal:9000

Output

JSON output

s3scanner scan --bucket-file buckets.txt --json

Save to file

s3scanner scan --bucket-file buckets.txt 2>&1 | tee results.txt
# Typical output:
# [found] company-backup | AuthUsers:READ AllUsers:READ
# [not_found] company-prod
# [found] company-assets | AllUsers:READ AllUsers:WRITE <-- very bad

Tips

  • Public WRITE access is the most critical finding — attackers can plant malware or phishing content
  • Check .git directories, database dumps, and config files first after gaining read access
  • --dump can pull a lot of data — be careful about storage space and bandwidth
  • Combine with trufflehog or gitleaks to scan dumped files for secrets
Help / Man page
s3scanner scan [options]

--bucket BUCKET        Single bucket name to scan
--bucket-file FILE     File with list of bucket names
--dump                 Dump files from accessible buckets
--dump-dir DIR         Directory for dumped files (default: ./buckets)
--endpoint-url URL     Custom S3 endpoint (for non-AWS)
--json                 JSON output
-t THREADS             Threads (default: 4)

Vue d’ensemble

S3Scanner sonde les buckets AWS S3 à la recherche de contrôles d’accès mal configurés. Il vérifie si les buckets existent, s’ils autorisent la lecture/écriture anonyme, et peut optionnellement dumper leur contenu. Utile pour le bug bounty, les évaluations red team, et la validation de la posture de sécurité S3.

Utilisation basique

# Scanner un seul bucket
s3scanner scan --bucket company-backup

# Scanner une liste de buckets depuis un fichier
s3scanner scan --bucket-file buckets.txt

# Dumper aussi les fichiers accessibles
s3scanner scan --bucket company-backup --dump

# Spécifier un répertoire de sortie pour les dumps
s3scanner scan --bucket company-backup --dump --dump-dir ./downloads

Génération de noms de buckets

# Générer des permutations
company="targetcorp"
for suffix in "" "-dev" "-prod" "-staging" "-backup" "-data" "-logs" "-assets" "-static" "-uploads"; do
    echo "${company}${suffix}"
    echo "${suffix:1}-${company}" 2>/dev/null || true
done > buckets.txt

Scanner la liste générée

s3scanner scan --bucket-file buckets.txt

Vérification des permissions

# S3Scanner vérifie ces permissions :
# - READ         (lister le contenu du bucket)
# - WRITE        (téléverser des fichiers)
# - READ_ACP     (lire l'ACL)
# - WRITE_ACP    (modifier l'ACL)
# - FULL_CONTROL (tout ce qui précède)

# Catégories de résultats :
# [exists] [AuthUsers:READ] → lisible par n'importe quel utilisateur AWS authentifié
# [exists] [AllUsers:READ]  → lisible publiquement (anonyme)
# [exists] [AllUsers:WRITE] → inscriptible publiquement (très dangereux !)
# [exists] [private]        → aucun accès public (correctement configuré)

Vérification manuelle

# Vérifier si le bucket existe et lister son contenu
aws s3 ls s3://company-backup --no-sign-request

# Télécharger tous les fichiers d'un bucket public
aws s3 sync s3://company-backup . --no-sign-request

# Vérifier l'ACL du bucket (nécessite des identifiants)
aws s3api get-bucket-acl --bucket company-backup

# Vérifier la policy du bucket
aws s3api get-bucket-policy --bucket company-backup

# Tester l'écriture anonyme
aws s3 cp test.txt s3://company-backup/ --no-sign-request

Gestion des régions

# Scanner avec une région AWS spécifique
s3scanner scan --bucket company-backup --endpoint-url https://s3.us-west-2.amazonaws.com

# Pour les services compatibles S3 non-AWS
s3scanner scan --bucket mybucket --endpoint-url https://minio.internal:9000

Sortie

# Sortie JSON
s3scanner scan --bucket-file buckets.txt --json

# Sauvegarder dans un fichier
s3scanner scan --bucket-file buckets.txt 2>&1 | tee results.txt
# Sortie typique :
# [found] company-backup | AuthUsers:READ AllUsers:READ
# [not_found] company-prod
# [found] company-assets | AllUsers:READ AllUsers:WRITE <-- très mauvais

Conseils

  • L’accès WRITE public est le constat le plus critique : les attaquants peuvent déposer des malwares ou du contenu de phishing
  • Vérifier d’abord les répertoires .git, les dumps de bases de données et les fichiers de config après avoir obtenu un accès en lecture
  • --dump peut télécharger beaucoup de données : attention à l’espace de stockage et à la bande passante
  • Combiner avec trufflehog ou gitleaks pour scanner les fichiers dumpés à la recherche de secrets
Aide / Page de manuel
s3scanner scan [options]

--bucket BUCKET        Single bucket name to scan
--bucket-file FILE     File with list of bucket names
--dump                 Dump files from accessible buckets
--dump-dir DIR         Directory for dumped files (default: ./buckets)
--endpoint-url URL     Custom S3 endpoint (for non-AWS)
--json                 JSON output
-t THREADS             Threads (default: 4)