flaws.cloud靶场练习
靶场地址flAWS

level 1
This level is buckets of fun. See if you can find the first sub-domain.
这里提示说了是关于存储桶(bucket)的,应该就是存储桶的信息泄露
利用dig工具进行查询,查看IP地址
1 | $ dig flaws.cloud |
ip反查询
1 | $ dig -x 52.92.235.139 |
成功得到flaws.cloud的S3存储桶的地址s3-website-us-west-2.amazonaws.com
通过上述查询,我们知道flaws.cloud是一个在S3中的静态网站,地区位于us-west-2。如果使用一个自定义的域名(比如flaws.cloud)在S3中定义了一个静态站点,那它的bucket name则必须与这个自定义域名一致。对于S3存储桶上HTTP端点的URL遵循固定格式:s3-<region>.amazonaws.com/<bucketname>。基于这个准则,我们可以得出flaws.cloud的S3端点应该是s3-us-west-2.amazonaws.com/flaws.cloud 。
直接访问这个存储桶
得到xml,这是 Amazon S3 服务返回的固定格式的“目录列表”。
当你直接访问一个 S3 存储桶的 HTTP 端点(http://s3-us-west-2.amazonaws.com/桶名),并且该桶配置了 ListBucket 权限时,S3 服务不会返回某个文件,而是会以 XML 格式 返回该桶内的对象列表。
1 | <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> |
这个 XML 就是该 S3 桶的“目录索引”,里面的每个 <Key> 代表桶里的一个文件:
| Key 值 | 说明 |
|---|---|
hint1.html / hint2.html / hint3.html |
挑战的提示页面 |
index.html |
网站首页 |
logo.png |
网站 Logo |
robots.txt |
搜索引擎爬虫规则 |
secret-dd02c7c.html |
第一关的“钥匙”文件 |
在存储桶后面直接加上这个文件就可以访问这个文件了,得到通关文件地址
https://s3-us-west-2.amazonaws.com/flaws.cloud/secret-dd02c7c.html
level 2
The next level is fairly similar, with a slight twist. You’re going to need your own AWS account for this. You just need the free tier.
第二关和第一关大致相同,但是将访问存储桶的权限从公开权限变成了列表权限
桶策略
Public(完全公开)- 比如你玩的第一关。任何能上网的人,不需要任何凭证就能列出和下载文件,匿名访问。
curl不加任何参数就能直接访问。
Authenticated Users(任何认证用户,第二关的情况)- 访问者只需要拥有一个有效的 AWS 账号(并配置好密钥),就能访问。
- 逻辑:桶的主人可能错误地认为“认证用户”等于“我们公司的同事”,但实际上它等于“地球上任何一个注册了 AWS 的人”。
Private(私有)- 最安全的状态。需要通过 IAM 策略或 Bucket Policy,明确地、白名单式地授权给特定的 IAM 用户、角色或具体的 AWS 账号 ID 才能访问。
Level 2 的 S3 桶 (level2-c8b2...) 设置了一个 Bucket Policy,其 Principal 字段可能被设置为 "AWS": "*"。在 AWS IAM 语境下,这代表“任何认证用户”。
当你执行 aws s3 ls s3://level2-c8b2... 时,AWS 收到请求并看到了你的“身份证”(Access Key)。S3 服务会检查该桶的权限策略,发现上面写着“持有任何有效 AWS 身份证的人都可以进来看看”。于是,S3 判断:“是的,你有一个合法的 AWS 身份证,你有权访问。” → 给你返回了文件列表。
关于创建aws用户在我的第二篇博客Btop251的博客 - 云安全01中有讲,这里不再赘述
1 | $ aws s3 ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud |
得到下一关的文件名,拼接构造url
http://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud/secret-e4443fc.html
level 3
The next level is fairly similar, with a slight twist. Time to find your first AWS key! I bet you’ll find something that will let you list what other buckets are.
这一关看起来像是git泄露
http://s3-us-west-2.amazonaws.com/level3-9afd3927f195e10225021a578e6f78df.flaws.cloud
先访问存储桶看看目录有什么文件
1 | <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> |
知道了桶的名字,这个桶又是公开的,先在本地复制一份信息
1 | aws s3 cp s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud ./level3 --recursive --region us-west-2 |
--recursive→ 递归下载所有文件(因为要下载整个桶)--region us-west-2→ 指定桶所在的区域(在桶地址中有说明)
1 | ubuntu@ip-172-31-37-19:~$ cd level3 |
可以看到,开发人员在提交f52ec03b227ea609b04e43f475fb0126edb5a61时有他不想要的东西,并在提交b64c8dcfa8a39af06521cf4cb7cdce5f0ca9e526时删除了它。
查看f52ec03b227ea609b04e43f475fb0126edb5a61这一提交:
1 | ubuntu@ip-172-31-37-19:~/level3$ git checkout f52ec03b227ea6094b04e43f475fb0126edb5a61 |
1 | ubuntu@ip-172-31-37-19:~/level3$ ls |
可以看到泄露了access_key,通过这些内容我们就可以在aws-cli上登录这个用户,该用户下具体有那些权限和资产了
1 | ubuntu@ip-172-31-37-19:~/level3$ aws configure --profile level3 |
这里解释一下--profile
- AWS CLI 允许你配置多个不同的“身份”,每个身份有自己的 Access Key、Secret Key 和区域设置。这些身份通过
--profile参数来切换。 - 如果不指定profile的话就是用登录的默认用户
default - 这里我们将这个新的
access_key对应level3这个profile,想要在aws-cli操作这个用户可以在命令末尾添加--profile level3
level 4
For the next level, you need to get access to the web page running on an EC2 at 4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud
It’ll be useful to know that a snapshot was made of that EC2 shortly after nginx was setup on it.
Need a hint? Go to Hint 1
访问下一个的网页通知需要账号密码,看来这一关就是要我们获取账号密码的
根据提示,当nginx在EC2上部署后,会创建一个快照(EBS snapshot)。由这一思路出发,利用level 3中取得的账户查询level3上运行的EC2实例的信息
关于EBS
EBS 最常见的是指 AWS (亚马逊云服务) 的块存储服务,全称 Amazon Elastic Block Store。
简单理解:它就像云端的虚拟硬盘,为云服务器(EC2 实例)提供持久化的数据块级存储。
EBS不会自动出现或自动挂载到服务器上。你需要手动操作(通过AWS控制台、CLI命令或IaC工具如Terraform)来完成以下动作,一旦创建好,后续的某些配置可以自动化
先通过上一关获取的用户查看EC2的实例信息
1 | $ aws ec2 describe-instances --profile level3 |
盲僧发现华点
1 | "BlockDeviceMappings": [ |
可以看到这个EC2挂载了EBSvol-04f1c039bc13ea950
但是这个时候我们无法确定这台泄露的云服务器就是我们需要攻击的靶机服务器,注意到这个信息中还泄露了给这台EC2分配的公网IP
可以查一下靶机域名对应的公网IP,这样就能验证是不是同一台了
1 | ubuntu@ip-172-31-37-19:~$ dig 4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud +short |
可以看到都是54.202.228.246
接下来查询这台主机对应的所有快照
1 | $ aws ec2 describe-snapshots --filters "Name=volume-id, Values=vol-04f1c039bc13ea950" --profile level3 |
可以看到SnapshotId继续查
1 | $ aws ec2 describe-snapshot-attribute --snapshot-id snap-0b49342abd1bdcb89 --attribute createVolumePermission --profile level3 |
关键信息
1 | { |
这个 Snapshot 被设置为 Public(公开)
也就是说
1 | 运维创建了EBS Snapshot |
接下来根据这个快照创建一个卷(Volume),然后挂载到自己ec2上
这里我遇到了一个问题,在我创建默认用户时只给了他ec2和3s的相关权限,所以这里他没有权限创建卷,需要去控制台给这个用户提一下权
创建一个卷
1 | $ aws ec2 create-volume \ |
记住VolumeId,创建一个这个快照所在地区的EC2,挂载volume
1 | ubuntu@ip-172-31-36-216:~$ aws ec2 attach-volume \ |
1 | $ lsblk |
接下来就是找有用的数据了

感慨一个termius真好用啊
在etc/nginx中看到看到可疑.htpasswd,之后又在/home/ubuntu中发现可疑脚本,成功拿到用户账号密码
1 | $ ll |
- 账号
flaws - 密码
nCP8xigdjpjyiXgJ7nJu7rw5Ro68iE8M
所以这一关其实还是AWS的权限配置错误导致可以查看EC2下的EBS,甚至可以拷贝
你过关!
level 5
This EC2 has a simple HTTP only proxy on it. Here are some examples of it’s usage:
- http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/flaws.cloud/
- http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/summitroute.com/blog/feed.xml
- http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/neverssl.com/
See if you can use this proxy to figure out how to list the contents of the level6 bucket at level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud that has a hidden directory in it.
Need a hint? Go to Hint 1
在上一关获得的卷中发现一些有趣的信息
1 | $ ll |
查看过去使用过的命令
1 | $ cat .bash_history |
169.254.169.254这个 IP 在 AWS 和其他云厂商里是 实例元数据服务 (Instance Metadata Service, IMDS) 的特殊地址。
- IP 地址:
169.254.169.254是一个 Link-Local 地址(只在实例内部可达),外网无法访问。 - 作用:提供当前 EC2 实例的元数据和临时凭证信息。
- 访问方式:使用
curl或wget,可以获取:
| 路径 | 内容 |
|---|---|
/latest/meta-data/ |
EC2 实例信息(AMI ID、Instance ID、hostname、AZ 等) |
/latest/user-data |
用户启动时注入的 userdata 脚本 |
/latest/meta-data/iam/security-credentials/ |
绑定在实例的 IAM Role 临时凭证 |
题目说了这里有一个代理,可以替你访问对应的url,而我们要访问的恰好就是仅内网可达的地址,刚好可以用这个SSRF
1 | $ cat meta-data |
可以看到对应目录有这些东西,接下来就试喽,用这个代理找到敏感信息
1 | ubuntu@ip-172-31-36-216:/mnt/flaws/home/ubuntu$ curl http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/ |
说明当前EC2绑定了:
1 | IAM Role: flaws |
获取临时访问凭证
1 | $ curl http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws |
接下来创建新用户获取利用他的访问配置直接盗他号
1 | $ aws configure --profile level5 |
验证身份
1 | $ aws sts get-caller-identity \ |
没错
查看存储桶里有什么
1 | $ aws --profile level5 s3 ls \ |
原理说明
- SSRF:利用 Proxy 让服务器代你访问内部网络或 Metadata 服务。
- IMDS (
169.254.169.254):提供 EC2 绑定的 IAM Role 临时凭证。 - 临时凭证:可在 AWS CLI 中使用,权限受 Role 限制。
- S3 权限:Role 允许访问指定 Bucket,但没有 ListAllMyBuckets 权限。
- Level6 Bucket:通过已知 Bucket 名 + CLI 成功访问其内容。
获得了第六关的地址
level 6
For this final challenge, you’re getting a user access key that has the SecurityAudit policy attached to it. See what else it can do and what else you might find in this AWS account.
Access key ID: AKIA****************
Secret: ****************************************Need a hint? Go to Hint 1
1 | $ aws configure --profile level6 |
先看看SecurityAudit这个策略是啥
- 安全审计:用于检查账户是否符合安全最佳实践(如 CIS Benchmarks)或合规要求(如 PCI-DSS、ISO 27001)。
- 事件响应:当发生安全事件时,授权给应急响应团队,让他们能快速查看日志和配置以进行调查,同时确保他们无法修改或删除任何东西,避免二次破坏。
- 第三方协作:安全地授予第三方工具或审计公司访问权限,让他们扫描你的 AWS 环境以发现漏洞,但无权触碰你的业务数据。
| 审计类别 | 能查看的关键内容 |
|---|---|
| 身份与访问管理 (IAM) | 用户、角色、策略、用户组、密码策略、多因素认证(MFA)状态。 |
| 日志与监控 | CloudTrail 日志(谁在何时做了什么)、CloudWatch 配置。 |
| 安全检测 | GuardDuty 发现的威胁、Security Hub 的安全检查结果、Inspector 的漏洞扫描结果。 |
| 资源合规与配置 | AWS Config 记录的资源配置历史、Trusted Advisor 的检查建议。 |
| 网络与数据 | 安全组规则、网络 ACL、S3 存储桶策略、加密密钥 (KMS) 的元数据。 |
查看当前用户
1 | $ aws iam get-user --profile level6 |
查看附加策略
1 | $ aws iam list-attached-user-policies \ |
查看策略内容
1 | aws iam get-policy \ |
发现
1 | "Action": ["apigateway:GET"], |
枚举 Lambda 函数
1 | $ aws lambda list-functions --region us-west-2 --profile level6 |
查看 Lambda Resource Policy
1 | $ aws lambda get-policy \ |
从中获取了 API Gateway ID:s33ppypa75
查询 Stage
1 | $ aws apigateway get-stages \ |
根据 AWS API Gateway URL 规则:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>得到这道题是
https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6访问就通关了
知识点
- SecurityAudit 不只是读 IAM,也能发现潜在敏感资源。
- Lambda Resource Policy 可以泄露 API Gateway ID。
- API Gateway URL 构造规则:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource> - 现实云渗透学习点:
- 只读权限也能用策略组合发现敏感资源
- Lambda + API Gateway 是常见敏感资源泄露点
- IAM 策略和 Resource Policy 是最常被忽略的安全面