云安全 | AWS challenge挑战靶场

admin 2024年4月24日07:34:50评论9 views字数 8630阅读28分46秒阅读模式

challenge1

题⽬地址

https://bigiamchallenge.com/challenge/1

题目信息
{"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/*" //以"files/"为前缀的对象}}}]}
从上⾯的IAM policy可以得出信息:
  1. 允许任何⽤户对指定的S3存储桶执⾏GetObject操作以获取对象的内容。
  2. 允许任何⽤户对指定的S3存储桶执⾏ListBucket操作列出存储桶中符合指定前缀条件的对象。

Resource字段为资源六段式,具体的含义可以看腾讯云⽂档,其实就是把资源权限划分好,避免同名资源权限冲突。
https://cloud.tencent.com/document/product/598/10606

WriteUp
两种做法
1. aws指令
官⽅⽂档地址s3-https://docs.aws.amazon.com/cli/latest/reference/s3/,可以看到每个指令其实参数很多,所以我只挑了example看。

云安全 | AWS challenge挑战靶场

这⾥要找flag,肯定要先看ls指令的,这⾥先看⼀下ls的example。

云安全 | AWS challenge挑战靶场

ok,来玩玩。执⾏了⼀下ls没有权限,再列出存储桶地址就有权限了,这⾥思考⼀下可以发现其实就是上⾯配置⽂件中表达的获取对象权限。

云安全 | AWS challenge挑战靶场

看到⽂件名了,不过这⾥没找到cat指令,看⽂档猜测跟docker⼀样可以cp回来。偷个懒,把cp个位置换成别的指令就能看对应的⽂档。

云安全 | AWS challenge挑战靶场

可以看到cp可以复制到本地,也可以在存储桶直接进⾏复制。

云安全 | AWS challenge挑战靶场

ok,这⾥下载到有写权限的地⽅即可。

云安全 | AWS challenge挑战靶场

我们不能以做题来做题,来关注⼀下下⾯有两个指令,实战中存储桶中往往有很多⽂件,如何把数据拖到本地呢?这⾥可以看到递归指令,还贴⼼地带上了排除项。

云安全 | AWS challenge挑战靶场

确实可⾏,实战中直接拖到本地打包再下载回来就可以。

云安全 | AWS challenge挑战靶场

2. web

尝试了官⽅⽂档⼏个类似https://s3.us-west-2.amazonaws.com/DOC-EXAMPLE-BUCKET1/puppy.jpg站点,发现⾏不通,我不知道是哪个地区的。

(不过实战中配置⽂件应该是有地区类的信息字样可以关注⼀下)

这⾥索性问了⼀下gpt,可以学到通过 https://s3.amazonaws.com/{桶名}/{uri} 访问也是可以的。

云安全 | AWS challenge挑战靶场

云安全 | AWS challenge挑战靶场

思考
回想了⼀下,实战中打部分有海外业务的公司,⼦域名经常有s3的字样,包括内⽹中也有很多这种存储桶,不过这⾥的题⽬是先给了IAM的配置⽂件,实战中更多的应该是通过第⼀种题解拿到⼀个shell信息搜集⽤。
这个靶场shell权限⽐较⼩,aws也⽐较贵,简单地看了⼀下实战中使⽤env判断下aws也许是个可⾏的⽅案,或者看看有没有aws指令。

云安全 | AWS challenge挑战靶场

实战中还可以留意下ak和sk的存放路径。

云安全 | AWS challenge挑战靶场

云安全 | AWS challenge挑战靶场

还有⼀个问题就是题⽬直接给出了IAM配置⽂件,在实战中到底该如何获取来判断呢?这⾥可以看到⽂档如何配置IAM。简单看了⼀下,似乎是没有特定路径存放的,像控制台和API这种没法⽩盒审计配置项了。
https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_create.html

云安全 | AWS challenge挑战靶场

challenge2

题⽬地址

https://bigiamchallenge.com/challenge/2

题⽬信息
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": "*", //允许匿名访问权限"Action": ["sqs:SendMessage","sqs:ReceiveMessage"],"Resource": "arn:aws:sqs:us-east-1:092297851374:wiz-tbic-analyticssqs-queue-ca7a1b2"}]}
可以看到这⾥⼜有*,代表所有⽤户即匿名访问这个Resource。
WriteUp
可以看到题⽬是新的东⻄没⻅过,ok。问⼀下他,可以⼤概猜到类似chan或者queue的东⻄,⼀个发送队列,⼀个接收队列。我猜测,有些系统会把数据库中的数据或者凭证这些东⻄⽤这个传输。

云安全 | AWS challenge挑战靶场

再来看⼀下⽂档有没有sqs指令,找到⼀个这个。这种不管从ctf还是实战,都是先看发送接收指令。

云安全 | AWS challenge挑战靶场

⽼规矩直接看到example。

云安全 | AWS challenge挑战靶场

确实可以收到东⻄,这⾥可以看到Body中才是数据,⽽且有s3存储桶的url,访问⼀下即可拿到flag

云安全 | AWS challenge挑战靶场

思考
这种利⽤感觉更多的就是去看发送队列中的敏感信息,不过这⾥不确定会不会因为拿⾛⼀个消息⽽造成业务出现问题,题⽬中消息队列中的消息都是⼀样的,所以问题就不⼤。

challenge3

题⽬地址

https://bigiamchallenge.com/challenge/3

题⽬信息
{"Version": "2008-10-17","Id": "Statement1","Statement": [{"Sid": "Statement1","Effect": "Allow","Principal": {"AWS": "*" //允许任何AWS⽤户},"Action": "SNS:Subscribe","Resource": "arn:aws:sns:us-east-1:092297851374:TBICWizPushNotifications","Condition": {"StringLike": {"sns:Endpoint": "*@tbic.wiz.io" //订阅者的Endpoint必须以"*@tbic.wiz.io"结尾}}}]}
这⾥的Principal与之前的不⼀样,看⼀下官⽅⽂档的说明,其实对于匿名⽤户两者是没有区别的。AWS JSON 策略元素:
https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/reference_policies_elements_principal.html

云安全 | AWS challenge挑战靶场

WriteUp
这⾥需要看⼀下SNS:Subscribe是什么东⻄,找到官⽅⽂档:
https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html。
可以看到是⼀个类似订阅消息的东⻄。

云安全 | AWS challenge挑战靶场

这⾥可以看到订阅的指令,但限制了能订阅的邮箱只能以@tbic.wiz.io结尾。

云安全 | AWS challenge挑战靶场

利⽤url的特性将email地址放于锚点后即可绕过。

云安全 | AWS challenge挑战靶场

可以看到订阅确认通知,访问SubscribeURL即可确认订阅。确认订阅后即可获取订阅的内容。

云安全 | AWS challenge挑战靶场

思考
这种和挑战⼆的差不多,都是利⽤获取应⽤要发送的内容获取敏感数据。

challenge4

题⽬地址

https://bigiamchallenge.com/challenge/4

题⽬信息
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::thebigiamchallenge-admin-storageabf1321/*"},{"Effect": "Allow","Principal": "*","Action": "s3:ListBucket","Resource": "arn:aws:s3:::thebigiamchallenge-admin-storageabf1321","Condition": {"StringLike": {"s3:prefix": "files/*"},"ForAllValues:StringLike": {"aws:PrincipalArn": "arn:aws:iam::133713371337:user/admin"}}}]}
可以发现本次配置项与挑战⼀相⽐,只是在ListBucket操作的条件中新增了字段:
"aws:PrincipalArn": "arn:aws:iam::133713371337:user/admin"
约束了委托⼈的身份主体需要是arn:aws:iam::133713371337:user/admin。

云安全 | AWS challenge挑战靶场

如果直接访问是不能看到访问⽂件的key出来的。

云安全 | AWS challenge挑战靶场

WriteUp
在机器上也是没有权限列出⽂件的。

云安全 | AWS challenge挑战靶场

但IAM这⾥还配置着 "Principal": "*" ,这意味着可能可以通过匿名访问绕过跳过IAM的身份认证。这个我也想不到还能这么操作,算是trick吧,估计新⼿运维也容易忽略掉这个点。
https://mp.weixin.qq.com/s/Yemzqd-TEfzjrCIyS0I_2A

云安全 | AWS challenge挑战靶场

增加 --no-sign-request 参数使得不使⽤凭证访问,即匿名访问。

云安全 | AWS challenge挑战靶场

challenge5

题⽬地址

https://bigiamchallenge.com/challenge/5

题⽬信息
{"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/*"]}]}
这题配置⽂件中少了 "Principal" 字段,说明不再是基于资源的策略,⽽是通过基于身份的策略。
WriteUp

ok,完全不懂了,直接看别⼈的题解,发现这⾥提示我们去学⼀下AWS Cognito的错误配置。https://www.wangan.com/p/7fy7f8abba5c0234

云安全 | AWS challenge挑战靶场

看了⼀下公司⾥关于AWS ECR Public漏洞的资料,可以学到这⾥需要的基础知识:

其实就是⽤账号密码登录后,⽤户池分发⼀个⽤户池令牌。然后再通过这个⽤户池令牌到身份池
换成AWS凭证,从⽽实现⽤户可以访问AWS的其它服务。
(⽤户池存储所有⽤户,身份池使这些⽤户能够访问 AWS 服务。)
[资料]
在题⽬前端源码中可以发现IdentityPoolId身份池id

云安全 | AWS challenge挑战靶场

修改前段的源码,为listObjects的操作获取⼀个签名过的url,访问URL即可列出桶中的object。这⾥的key记得去掉,listObjects不⽤⽤上key。

云安全 | AWS challenge挑战靶场

访问该签名后的url即可listObjects。

云安全 | AWS challenge挑战靶场

同理,修改回getObject,带上Key获取签名后的url访问即可获取签名后的getObject的url。
AWS.config.region = 'us-east-1';AWS.config.credentials = new AWS.CognitoIdentityCredentials({IdentityPoolId:"us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b"});// Set the regionAWS.config.update({region: 'us-east-1'});var s3 = new AWS.S3();var params = {Bucket: 'wiz-privatefiles',Key: 'flag1.txt',Expires: 60 * 60}s3.getSignedUrl('getObject', params, function(err, signedUrl) {console.log('signedUrl:');console.log(signedUrl);});
当然,js可能不是很懂,也可以使⽤python来获取,代码⾥⾯注释的⽂档可以多关注⼀下,熟悉⼀下整个认证的流程。
import boto3# Set the regionregion = 'us-east-1'identity_pool_id = 'us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b'bucket = 'wiz-privatefiles'def run():session = boto3.Session(region_name=region)# 通过identity_pool_id发送给GetId接⼝获取IdentityId#https://docs.aws.amazon.com/zh_cn/cognitoidentity/latest/APIReference/API_GetId.htmlcognito_identity_credentials = session.client('cognito-identity',region_name=region).get_id(IdentityPoolId=identity_pool_id)cognito_id = cognito_identity_credentials['IdentityId']# 再使⽤IdentityId发送到GetCredentialsForIdentity接⼝获取临时凭证#https://docs.aws.amazon.com/zh_cn/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.htmlcredentials = session.client('cognito-identity',region_name=region).get_credentials_for_identity(IdentityId=cognito_id)access_key = credentials['Credentials']['AccessKeyId']secret_key = credentials['Credentials']['SecretKey']session_token = credentials['Credentials']['SessionToken']s3 = session.client('s3', region_name=region, aws_access_key_id=access_key,aws_secret_access_key=secret_key,aws_session_token=session_token)# 获取给定操作名称的预签名URLparams = {'Bucket': bucket,# 'Key': 'flag1.txt'}#https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrlpropertysigned_url = s3.generate_presigned_url('list_objects', Params=params,ExpiresIn=60 * 60)# signed_url = s3.generate_presigned_url('get_object', Params=params,ExpiresIn=60 * 60)print('signedUrl:')print(signed_url)if __name__ == '__main__':run()

challenge6

地址

https://bigiamchallenge.com/challenge/6

题⽬信息
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Federated": "cognito-identity.amazonaws.com"},"Action": "sts:AssumeRoleWithWebIdentity", //使⽤web token扮演⻆⾊,sts:AssumeRole是使⽤凭证"Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east-1:b73cb2d2-0d00-4e77-8e80-f99d9c13da3b"}}}]}
第⼀次遇到这种,不知道要⼲嘛,这⾥把时间重点放理解上,直接看题⽬解析。
通过⽂档可以看到这种策略为⻆⾊的信任策略。通过信任策略的配置,⻆⾊A将允许信任策略中Principal 元素指定的对象担任⻆⾊A
https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles_use.html

云安全 | AWS challenge挑战靶场

WriteUp
同时需要关注到以下的⼏个点,这个token有过期时间并且⽆法调⽤STS GetFederationToken或 GetSessionToken API 操作。

云安全 | AWS challenge挑战靶场

看到⽂档中还有个 --role-arn 和 --web-identity-token 参数, --role-arn 参数题⽬提示已经给了,所以我们还需要再看看怎么搞出来这个 --web-identity-token 参数。

云安全 | AWS challenge挑战靶场

云安全 | AWS challenge挑战靶场

这⾥其实获取web token的流程跟挑战5中python3脚本前⾯的流程差不多,先通过

identity_pool_id发送给GetId接⼝获取IdentityId,然后因为是IAM配置中是

sts:AssumeRoleWithWebIdentity ,所以要通过GetOpenIdToken接⼝⽤IdentityId换取webtoken。

https://docs.aws.amazon.com/zh_cn/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html

云安全 | AWS challenge挑战靶场

云安全 | AWS challenge挑战靶场

到了最后⼀步,使⽤换来的web token,调⽤sts服务的 AssumeRoleWithWebIdentity 接⼝,扮演题⽬中给出 arn:aws:iam::092297851374:role/Cognito_s3accessAuth_Role ⻆⾊,并尝试⽣成临时凭据。这⾥要记得去掉 --provider-id 参数,否则申请不成功。

云安全 | AWS challenge挑战靶场

云安全 | AWS challenge挑战靶场

aws configure set aws_access_key_id "ASIARK7LBOHXD6CVJB7S"aws configure set aws_secret_access_key"VcukxfOYpXNrFyVZ/4rvj8cyhH6xlNo7xnYkxk37"aws configure set aws_session_token"FwoGZXIvYXdzEPj//////////wEaDAScGTISaHdxPCrJ0yKcApg/+diN0QJMp9jSVd0LAKsPlIc6HVoslp3ZSgxjv0QuIBHNU3gRONYu0tpBOOz92Tmgbzy8mGU7CnEVLaH+U+3wvTybZF4XI4a0lmFht+Q91MYsiRSI5gZXZNK56SE0Agyj9yLGFEX+NKgPAd+m2VEBJ7Z7N9bqrNo5q6PVeBe7AzoPaatyxYWT7Ly4pCyaukH4TxJQirXt/HqIeRXMrqh5k4/WemEOIBWpumlnAgGPQhsPltcYm+E9sujWS7hQd/zDSwSQT4czFfSk0nHzmSJdAqL7pUuzh7VFxJ1Gd2Pvrg41Knx3sGjmAeL0jOIGIXJU8NqsxZ7AK0Dvhe5V8W/Ya/w8h3IA1vXv30LacysbgtBIKIqqg51z5+OOKJjIoKUGMpYBhqHvFrzCD6+fJJBiH85Dad+TRs8zXlzlWbmppqEKrO6LLwQ2/1DnqY+K2amWz+QMTIi6GqvLr64J+oXOE4Ce6C8JF9Dx6HS/Eq9lTTGOxyV13z+OWH6Xpis9+BhMHVKetnX7w7Mvg6NiNN3ggrw9b/CKYOPZ1pvNYUs7u6ZEs+UVfpjl5Z0P6VQBtIGHC6V2ItpGCj1F"

云安全 | AWS challenge挑战靶场

之后就⼀个⼀个翻,最终找到flag在这⾥⾯。

云安全 | AWS challenge挑战靶场


原文始发于微信公众号(渗透安全团队):云安全 | AWS challenge挑战靶场

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月24日07:34:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   云安全 | AWS challenge挑战靶场http://cn-sec.com/archives/2082453.html

发表评论

匿名网友 填写信息