MinIO and S3-Compatible Storage Pentesting

MinIO and S3-compatible storage pentesting techniques for identifying, exploiting object storage services, enumeration, attack vectors and post-exploitation insights.

port 9000port 9001port 80port 443

MinIO and S3-Compatible Storage

Default Ports: 9000 (API), 9001 (Console), 80/443 (S3 Gateways)

MinIO and S3-compatible storage services store objects inside buckets. In pentests, misconfigured buckets can expose backups, uploads, logs, CI artifacts, static files, model files, and secrets.

Connect​

Using AWS CLI​

AWS CLI works with S3-compatible endpoints by setting --endpoint-url.

aws --endpoint-url http://target.com:9000 s3 ls  
aws --endpoint-url http://target.com:9000 s3 ls s3://bucket-name  
aws --profile pentest --endpoint-url http://target.com:9000 s3 ls  

Using MinIO Client​

mc is the native MinIO client for bucket and object operations.

mc alias set target http://target.com:9000 ACCESS_KEY SECRET_KEY  
mc alias set target http://target.com:9000  
mc ls target  
mc ls target/bucket-name  

Using s3cmd​

s3cmd is useful for older S3-compatible workflows.

s3cmd --host=target.com:9000 --host-bucket=target.com:9000 ls  
s3cmd --host=target.com:9000 --host-bucket=target.com:9000 ls s3://bucket-name  

Using HTTP Requests​

Direct HTTP requests show S3-style XML errors and public object access.

curl -i http://target.com:9000/  
curl -i http://target.com:9000/bucket-name/  
curl -I http://target.com:9000/bucket-name/object.txt  

Recon​

Service Detection with Nmap​

Scan MinIO API, console, and reverse proxy ports.

nmap -p 80,443,9000,9001,9443 -sV target.com  
nmap -p 9000,9001 --script http-title,http-headers target.com  
nmap -p 443,9000,9001,9443 --script ssl-cert,ssl-enum-ciphers target.com  

Endpoint Discovery​

S3-compatible APIs often return XML errors such as AccessDenied or NoSuchBucket.

curl -i http://target.com:9000/  
curl -i http://target.com:9001/  
curl -i https://storage.target.com/  
curl -s http://target.com:9000/ | head  

Bucket Name Discovery​

Test likely bucket names based on organization, app, and environment.

for b in backup backups prod staging dev logs uploads assets; do  
  aws --endpoint-url http://target.com:9000 s3 ls s3://$b  
done  

Console Fingerprinting​

The console can expose MinIO version and login behavior.

curl -I http://target.com:9001/  
httpx -u http://target.com:9001 -title -tech-detect -status-code  

Enumeration​

Anonymous Bucket Listing​

Anonymous listing is the first storage misconfiguration to validate.

aws --no-sign-request --endpoint-url http://target.com:9000 s3 ls  
aws --no-sign-request --endpoint-url http://target.com:9000 s3 ls s3://bucket-name  
mc anonymous list http://target.com:9000/bucket-name  

Object Enumeration​

Object names often reveal backups, logs, credentials, and internal paths.

aws --no-sign-request --endpoint-url http://target.com:9000 s3 ls s3://bucket-name --recursive  
mc ls --recursive target/bucket-name  

Permission Enumeration​

Check read, write, delete, and policy access separately.

aws --endpoint-url http://target.com:9000 s3 cp test.txt s3://bucket-name/pentest-test.txt  
aws --endpoint-url http://target.com:9000 s3 rm s3://bucket-name/pentest-test.txt  
mc anonymous get target/bucket-name  
mc anonymous set download target/bucket-name  

Policy Enumeration​

Bucket policies show public or overly broad access.

aws --endpoint-url http://target.com:9000 s3api get-bucket-policy --bucket bucket-name  
aws --endpoint-url http://target.com:9000 s3api get-bucket-acl --bucket bucket-name  
mc anonymous get target/bucket-name  

Versioning Enumeration​

Versioning can expose deleted or older sensitive objects.

aws --endpoint-url http://target.com:9000 s3api get-bucket-versioning --bucket bucket-name  
aws --endpoint-url http://target.com:9000 s3api list-object-versions --bucket bucket-name  

Attack Vectors​

Public Read Access​

Public reads can expose large object collections.

aws --no-sign-request --endpoint-url http://target.com:9000 s3 ls s3://bucket-name --recursive  
curl -I http://target.com:9000/bucket-name/object.txt  

Public Write Access​

Public writes can enable defacement, malware hosting, or data pollution.

echo "pentest" > pentest.txt  
aws --no-sign-request --endpoint-url http://target.com:9000 s3 cp pentest.txt s3://bucket-name/pentest.txt  

Leaked Access Keys​

MinIO and S3 keys are often stored in configs and CI variables.

rg -n 'AWS_ACCESS_KEY_ID|AWS_SECRET_ACCESS_KEY|MINIO_ROOT_USER|MINIO_ROOT_PASSWORD|endpoint-url|s3://' .  
aws configure --profile leaked  
aws --profile leaked --endpoint-url http://target.com:9000 s3 ls  

Sensitive Object Exposure​

Search object names and downloaded samples for obvious secrets.

aws --endpoint-url http://target.com:9000 s3 ls s3://bucket-name --recursive | grep -Ei 'backup|dump|secret|password|token|key|config|env|sql|zip|tar'  
trufflehog filesystem downloaded-bucket/  

Presigned URL Abuse​

Presigned URLs may be overlong, leaked, or usable for unintended objects.

curl -I 'https://storage.target.com/bucket/object?X-Amz-Signature=...'  
aws --endpoint-url http://target.com:9000 s3 presign s3://bucket-name/object.txt --expires-in 3600  

Post-Exploitation​

Bucket Impact Review​

Summarize accessible buckets, object counts, and permissions.

aws --endpoint-url http://target.com:9000 s3 ls > buckets.txt  
aws --endpoint-url http://target.com:9000 s3 ls s3://bucket-name --recursive > bucket-objects.txt  
mc anonymous get target/bucket-name > bucket-policy.txt  

Secret Review​

Review small samples before broad downloads.

grep -Ei 'password|secret|token|apikey|private key|connection string' bucket-objects.txt  
trufflehog filesystem downloaded-bucket/  
gitleaks detect --source downloaded-bucket/  

Backup Review​

Backups and dumps commonly contain credentials and production data.

grep -Ei 'backup|dump|db|sql|mongo|postgres|mysql|redis|snapshot|archive' bucket-objects.txt  

Useful Tools​

Tool| Purpose
---|---
aws| S3 API testing
mc| MinIO-native testing
s3cmd| S3-compatible testing
curl| HTTP and object checks
nmap| Port scanning
httpx| Console fingerprinting
trufflehog / gitleaks| Secret scanning

Security Misconfigurations​

Misconfiguration| Risk
---|---
Anonymous bucket listing| Object inventory disclosure
Public object read| Sensitive file exposure
Public object write| Data pollution or malware hosting
Leaked access keys| Bucket or tenant compromise
Broad bucket policy| Cross-user data exposure
Exposed MinIO console| Credential and admin attack surface
Long-lived presigned URLs| Uncontrolled object access
Backups stored unprotected| Secret and data leakage