The Big IAM Challenge 云安全 CTF 挑战赛

The Big IAM Challenge 云安全 CTF 挑战赛

今天,我们来做一下有关于云安全 的CTF 挑战赛 The Big IAM Challenge,旨在让白帽子识别和利用 IAM错误配置,并从现实场景中学习,从而更好的认识和了解IAM相关的风险。比赛包括6个场景,每个场景都专注于各种AWS服务中常见的IAM配置错误。

挑战赛地址:bigiamchallenge.com

Buckets of Fun

We all know that public buckets are risky. But can you find the flag?

我们进入题目主页后,第一题是叫 Buckets of Fun,我们点击 View IAM Policy 开始做题

在这里插入图片描述

第一题给出了一个 Bucket 的 Policy 内容, 查看提示获取本关的IAM策略如下:

在这里插入图片描述

{
    
    
    "Version": "2012-10-17",
    "Statement": [
        {
    
    
            "Effect": "Allow", //Effect(效果)设置为Allow(允许)
            "Principal": "*",  //Principal(主体)是所有用户("*""Action": "s3:GetObject",  //获取对象
            "Resource": "arn:aws:s3:::thebigiamchallenge-storage-9979f4b/*"  //指定S3存储桶中的所有对象
        },
        {
    
    
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",    //列出存储桶
            "Resource": "arn:aws:s3:::thebigiamchallenge-storage-9979f4b",
            "Condition": {
    
           //条件是通过前缀限制只能列出以"files/"为前缀的对象
                "StringLike": {
    
    
                    "s3:prefix": "files/*"
                }
            }
        }
    ]
}

该策略允许任何用户列出"thebigiamchallenge-storage-9979f4b"存储桶中符合前缀条件"files/"的对象。该策略存在如下安全风险:

1、允许任何用户对指定的S3存储桶执行GetObject操作以获取对象的内容。

2、允许任何用户对指定的S3存储桶执行ListBucket操作列出存储桶中符合指定前缀条件的对象

从给到的内容里可以看到,这个存储桶具有公开列对象和公开读取的权限,由于题目里已经给出了 Bucket 名称,针对s3存储桶权限校验不严格,列出桶资源对象并使用查看对象内容获取flag

aws s3 ls s3://thebigiamchallenge-storage-9979f4b/files/

在这里插入图片描述

此时,我们得知files目录下还存在着 flag1.txt 文件夹,由于题目里已经给出了 Bucket 名称,此时我们直接拼接下完整的 URL 为:https://thebigiamchallenge-storage-9979f4b.s3.amazonaws.com/files/flag1.txt

直接访问这个地址,就可以看到 FLAG 所对应的 Key

在这里插入图片描述

然后将这个flag复制,点击提交

在这里插入图片描述

Google Analytics

We created our own analytics system specifically for this challenge. We think it’s so good that we even used it on this page. What could go wrong?

Join our queue and get the secret flag.

第二题叫做Google Analytics,我们继续点击 View IAM Policy

在这里插入图片描述

查看提示获取本关的IAM策略如下:

在这里插入图片描述

{
    
    
    "Version": "2012-10-17",
    "Statement": [
        {
    
    
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "sqs:SendMessage",   //发送消息
                "sqs:ReceiveMessage"   //接收消息
            ],
            "Resource": "arn:aws:sqs:us-east-1:092297851374:wiz-tbic-analytics-sqs-queue-ca7a1b2"
        }
    ]
}

该IAM策略允许任何用户对特定的SQS队列执行SendMessage和ReceiveMessage操作,即发送和接收消息。该策略存在如下安全风险:

1、该策略将操作权限授予了所有用户(“*”),意味着任何具有该策略的用户或角色都可以发送和接收消息。

2、该策略没有限制允许访问的用户、角色或其他条件。它允许所有用户执行SendMessage和ReceiveMessage操作。

SQS (Simple Queue Service) 可以用来帮助不同的应用程序之间进行可靠的消息传递,它就像是一个消息中转站,可以把消息从一个地方发送到另一个地方,确保消息的安全送达和处理,让应用程序之间更好地进行通信和协作

题目的 Policy 中给出了 Account ID 和 Queue 的值,那么我们就可以构造这个 Queue URL 了,构造好后的 Queue URL 为:

https://queue.amazonaws.com/092297851374/wiz-tbic-analytics-sqs-queue-ca7a1b2

最后,使用 AWS CLI 的 SQS 服务里的 receive-message 接口,利用 –queue-url 参数指定这个队列的 URL 地址:

aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/092297851374/wiz-tbic-analytics-sqs-queue-ca7a1b2

在这里插入图片描述

接着,我们在浏览器中输入URL的地址,获得flag的内容:

在这里插入图片描述

点击提交

在这里插入图片描述

Admin only?

We learned from our mistakes from the past. Now our bucket only allows access to one specific admin user. Or does it?

在这里插入图片描述

第 4 题的名字叫 “Admin only?”,查看提示并获取本关的IAM策略如下:

在这里插入图片描述

{
    
    
    "Version": "2012-10-17",
    "Statement": [
        {
    
    
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::thebigiamchallenge-admin-storage-abf1321/*"
        },
        {
    
    
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::thebigiamchallenge-admin-storage-abf1321",
            "Condition": {
    
    
                "StringLike": {
    
    
                    "s3:prefix": "files/*"
                },
                "ForAllValues:StringLike": {
    
    
                    "aws:PrincipalArn": "arn:aws:iam::133713371337:user/admin"
                }
            }
        }
    ]
}

可以看到,这道题是和 S3 相关的,思路还是和第一题一样,先找到 FLAG 的 Key,然后拼接访问 FLAG 的地址即可。

那么,现在的目标就是获取到这个 FLAG 的 Key,但是我们从 Policy 里可以看到这个存储桶只对 arn:aws:iam::133713371337:user/admin 主体授予了 ListBucket 权限,所以现在要解决的问题就是,怎么绕过这个限制。

查阅官方文档,我们可以得到这样的一条信息:对于 ForAllValues,如果请求中没有键或者键值解析为空数据集(如空字符串),则也会返回 true,不要使用带有 Allow 效果的 ForAllValues,因为这样可能会过于宽容。

也就是说,如果我们把请求中的 aws:PrincipalArn 至为空,这里就会返回 True,那么就可以绕过了。

此时我们先发送一条包含 aws:PrincipalArn 的请求。

aws s3api list-objects --bucket thebigiamchallenge-admin-storage-abf1321 --prefix 'files/' 

在这里插入图片描述

可以看到提示An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied,显示拒绝访问,然后加上 --no-sign-request 试试。

aws s3api list-objects --bucket thebigiamchallenge-admin-storage-abf1321 --prefix 'files/' --no-sign-request

在这里插入图片描述

该参数可以用来执行无需身份验证的请求。使用该参数可以跳过对请求进行签名和身份验证的步骤,从而可以在某些情况下执行不需要验证的操作。

aws s3 ls s3://thebigiamchallenge-admin-storage-abf1321/files/ --no-sign-request
aws s3 cp s3://thebigiamchallenge-admin-storage-abf1321/files/flag-as-admin.txt /tmp/flag4.txt
cat /tmp/flag4.txt

在这里插入图片描述

获得此题的flag如下:

{
    
    wiz:principal-arn-is-not-what-you-think}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_64973687/article/details/132078233
IAM