AWS S3枚举基础

解题

拿到网站http://dev.huge-logistics.com我们先可以对其进行基础的信息搜集,https://s3.amazonaws.com/dev.huge-logistics.com/static/favicon.png我们可以发现云资源

aws s3 ls s3://dev.huge-logistics.com --no-sign-request 利用这个我们可以查看S3 存储桶的顶层逻辑目录

image

在看到众多目录的时候,我们可以采取递归的方法挨个尝试

image

尝试过后发现有zip文件可以下载

下载后发现是 PowerShell 脚本文件

image

其硬编码泄露了AK/SK以及区域标识符

通过aws configure授权访问

image

重新访问发现

image

已近有权限去访问期目录了,但是当前账户的权限不够,还需要提权。当前没办法只能查看其它目录文件

image

我们可以通过xml文件发现

image

有了新的AK/SK尝试,发现是admin账户

image

到这一步我们已经可以拿到flag了

思考

我们可以进一步查看为什么我们不能再浏览器上查看却能在AWS CLI 上请求成功
image

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicRead",
      "Effect": "Allow",
      "Principal": "*",  // 所有用户(匿名+授权)
      "Action": "s3:GetObject",  // 读取/下载文件
      "Resource": [
        "arn:aws:s3:::dev.huge-logistics.com/shared/*",
        "arn:aws:s3:::dev.huge-logistics.com/index.html",
        "arn:aws:s3:::dev.huge-logistics.com/static/*"
      ]
    },
    {
      "Sid": "ListBucketRootAndShared",
      "Effect": "Allow",
      "Principal": "*",  // 所有用户
      "Action": "s3:ListBucket",  // 列目录
      "Resource": "arn:aws:s3:::dev.huge-logistics.com",
      "Condition": {
        "StringEquals": {
          "s3:delimiter": "/",
          "s3:prefix": ["", "shared/", "static/"]  // 仅允许列根目录、shared/、static/
        }
      }
    },
    {
      "Sid": "AllowAllExceptAdmin",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::794929857501:user/it-admin",  // 管理员用户(XML 里的 prod-admin)
          "arn:aws:iam::794929857501:user/pam-test"   // 低权限测试用户
        ]
      },
      "Action": ["s3:Get*", "s3:List*"],  // 允许读取、列出所有操作
      "Resource": [
        "arn:aws:s3:::dev.huge-logistics.com",
        "arn:aws:s3:::dev.huge-logistics.com/*"
      ]
    },
    {
      "Sid": "ExplicitDenyAdminAccess",
      "Effect": "Deny",  // 显式拒绝(优先级最高)
      "Principal": {
        "AWS": "arn:aws:iam::794929857501:user/pam-test"
      },
      "Action": "s3:*",  // 所有 S3 操作(下载、读取、删除等)
      "Resource": "arn:aws:s3:::dev.huge-logistics.com/admin/*"  // 仅 admin/ 目录
    }
  ]
}

我们可以发现在Bucket策略里面想要匿名执行列目录,必须满足

  1. 请求里带 prefix 参数(值可以是空字符串 ""shared/static/);
  2. 请求里带 delimiter 参数,且值必须是 /

在AWS CLI 里面会默认执行这两个参数的执行,但在浏览器里面直接访问是不会有这两个参数的,故会被拒绝。

s3.amazonaws.com/dev.huge-logistics.com/(未加参数)

dev.huge-logistics.com.s3.amazonaws.com/?prefix=&delimiter=/(加了参数)

总结

  1. 核心原因:桶策略要求 ListBucket 必须带 prefix(空 /shared//static/)和 delimiter=/ 参数;
  2. 行为差异:CLI 自动加参数→匹配条件→成功;浏览器不加参数→不匹配→失败;
  3. 突破方法:在浏览器 /cURL 中手动添加这两个参数,就能绕过 “请求格式导致的拒绝”;
  4. 关键考点:S3 桶策略的 Condition 条件校验,以及 prefix/delimiter 对列目录的控制作用。
posted @ 2025-12-26 21:27  ThorneYe  阅读(0)  评论(0)    收藏  举报