云渗透实战手册:云API攻防之云服务端点侦查
在云计算环境中的渗透,与传统渗透相比,新增加了许多新的攻击面,同时也因为云计算的特点我们需要转变渗透的思维,用云计算的方式去思考云渗透。
基础知识
在云渗透开始之前,我们需要首先阐述标题中提到的云服务端点概念。首先我们需要知道,云api通常被视为云计算的一个基础特征,用户通过访问api去管理对应的云服务。

在实际的使用中,往往会将调用云api的过程封装成sdk,供开发者使用。而在sdk的基础上,还会封装成更方便用户使用的client。
使用client发起的请求和直接调用云api实际上是一致的,以阿里云为例


这里aliyun CLI会先去访问location-readonly确定Endpoint再发起请求,最终发起的请求和在云api平台上发起的请求是一致。
这里的Endpoint,阿里云称为服务地址。实际上在不同的云他有不同的称呼,比如在腾讯云则称为请求域名。在移动云被称为终端节点。在aws和azure都被称为service endpoints。
由于endpoint本身就会有很多种意思,而上述的称谓都有出现歧义的情况,所以这里,我推荐百度搜索“云服务 endpoint url”,百度ai很贴心的解释了这个:

为了方便阐述,这个endpoint在本文被称为云服务端点。
然后,我们需要知道渗透的云归属的类别。云计算通过可以简单地分成公有云、私有云、混合云、多云。
公有云即我们所熟知的阿里云、腾讯云、华为云等对公众开放的云服务,公有云不限制消费者为特定群体,并且消费者在不同的云服务层次上所承担的责任按照责任共担模型来进行划分。

私有云是专属于某个企业或者组织的云,消费者只能是该企业成员。也有企业通过租用第三方云供应商的基础设施来搭建私有云,这种特殊的私有云被称为托管私有云。托管私有云只是让渡了部分建设权给第三方云供应商,云的归属主体仍然是企业。
混合云是由至少两种云组成,通过混合云管理层屏蔽了不同云之间的差异,将云视为一个整体。
多云是集中管理多个不同的云,与混合云不同的是,多云的各个云是相对独立的。
当我们在渗透非公有云时,完全的自建云需要我们得知云api具体用法和云服务端点地址,如果云api的实现方式是依据某个公有云来制作或直接托管公有云的话,则需要得知 云服务端点 和 依据的公有云即可。
那么无论怎么样,侦查云服务端点都是必不可少的一环。下面将用一个实战经历来讲述这个过程。
实战过程
在公司的一次攻防演练的过程中,我通过web的一个任意文件读取漏洞获取到目标服务器的数据库帐号密码,恰好这是一个开放ssh的linux公有云服务器,经过尝试发现,数据库帐号密码同服务器密码,于是很顺利地利用ssh登录到服务器中。
经过文件的翻找,我在这台服务器中找到了有一个配置文件,其中包括了一组accesskey密钥和secretkey密钥以及一个自建的云服务端点地址。通过这一个配置文件发起了对非公有云环境的横向,下面是攻击路线的概览:

关于云服务端点前面已经介绍,对于具体的实施可以参考k8s的apiserver处理来自 kubectl的请求。
我们注意3号攻击路线,这里我们分了两个分支,主要看右边的攻击路线,如下图所示,我们通过翻找文件,拿到了一个包含一组AKSK密钥和一个私有S3 云服务端点的python脚本

在这个python脚本中,目标使用了一个的aws s3的sdk,大致操作是通过向云服务端点请求对s3云服务进行操作,获取bucket内的一个object里的文件,并且读取里面的内容。
亚马逊AWS(Amazon Web Services (AWS) )是国外的一个云服务供应商,类似于国内的阿里云,s3是aws 提供的一项对象存储产品服务,类似国内的oss云存储桶。一个存储桶内有多个bucket,每个bucket内存放object,object通常就是具体的文件,文件的内容则是object的key。对象存储的结构如同所示:

经过侦查,我在4号攻击路线中发现这个云服务端点指向的地址IP是国内的一个非公有云IDC机房。
那么按照云计算划分方式,我们可以认为,这可能是一个托管s3云服务的混合云或者采用s3 云api规范的私有云。
为了方便阐述,我们暂且认定这是个私有云。
像这样的云,如果直接拿着accesskey密钥和secretkey密钥去aws-cli里面进行操作而忽视云服务端点的话,是无效的,因为aws-cli默认请求的云服务端点是aws自身的云服务端点。具体参考aws的官方文档:

当我得知这是一个对象存储并且使用自定义云服务端点时,我首先想到的是使用华为云的obs browser准备读取存储桶中的内容,即攻击路线5。
华为云的obs browser这款对象存储管理工具可以通过可视化的方式去管理对象存储类的资产,并且兼容s3协议支持自定义云服务端点 。
遗憾的是,当我在obs browser上通过指定云服务端点和填入accesskey密钥和secretkey密钥去访问目标,结果发现只能列出存储桶中bucket的名称,其他的栏目都是空的,当我点击bucket试图查看里面的文件时,发现无法进行。

后来经过测试发现,obs browser对于非华为云存储桶的支持程度是不一样的,有些需要在云服务端点中手动拼接region才能进入,有些则可以直接进,因此利用华为云obs browser管理其他云供应商的存储桶,是一种方法,但不一定好用。
既然无法使用可视化工具进行管理,我又回到最开始的脚本文件中,我重新审视并决定用aws-cli工具进行操作,因为脚本文件中使用了aws s3的sdk,那么无论目标是否为s3公有云,使用aws-cli进行发送请求必然是符合 云api请求规范的。
通过 --云服务端点-url 参数附加上指定的云服务端点 地址,如果目标有SSL证书强制校验的话,则需要在请求时附加上证书文件,这里不存在强制校验,仅仅只是要求使用https协议,所以可以直接--no-verify去跳过证书警告

在这里,我找到了一个py文件,里面有其他云数据库的帐号密码,可以继续横向即攻击路线6。
除此之外,我还思考了一个问题,面对私有云,能否可以像公有云一样,直接操作其他的资源,比如说我用s3 的云服务端点去实现类似 aws iam list-user (列举当前云的iam用户)的操作呢?
经过尝试我发现是不可以的,也就是攻击路线7遇到的情况,大致类似于下面的操作:
这里我通过阿里云改变云服务端点来模拟私有云的请求。当我们请求操作阿里云的rds(云数据库),不附加云服务端点,会使用默认云服务端点,请求正常。

请求操作rds,但云服务端点换为ram(访问控制服务)的云服务端点,则会报错:

请求操作ram,指定云服务端点为ram的云服务端点则正常使用:

通过这个简单的例子,可以得知,不同的操作实际上是去向不同的云服务端点发起请求,并且不能混用。
还有另一个非通用结论是,解析云服务端点为IP后,再放入--endpoint中请求也是无法正常操作的,大家可以尝试一下。
因此,由于不存在一个云服务端点可以处理所有云服务的情况,我们需要去做枚举云服务端点的操作才能横向到其他的云服务。
通过更仔细地观察脚本文件,我发现存储桶对应的云服务端点叫ossxxx.xxx.com,那么我们可以去猜测可能存在的访问控制云服务端点、云服务器云服务端点等其他云产品的云服务端点。
但按照aws的命名规则,对象存储叫s3,而阿里云的命名规则才是存储桶是oss,也就是说这里的云服务端点的命名并不遵循AWS的叫法,而是按照创建者自己理解的命名去制作的云服务端点。
综合考虑下来,我认为这个命名大概率会取某个公有云的相同命名。
为了去嗅探这个云服务端点,我开始搜集了aws、google cloud、azure、阿里云、腾讯云、华为云六家对应云服务的缩写,最终做成了一个字典:
https://github.com/shadowabi/S-BlastingDictionary/blob/main/CloudService.txt
如下图所示:

在制作完字典后,我发现直接用cli配合字典利用批处理来批量发送请求的动静有点大而且不够方便。因此我觉得还可以进一步操作,在最小动静的前提下实现自动侦查。
经过思考,我发现利用dns查询的方式是最隐蔽的探测域名的方法,并且利用dns的srv记录,若存在则可以以非爆破的形式完成端口发现的任务。
这个方法来源于同为狼组的Esonhugh师傅 的k8spider项目:
https://github.com/Esonhugh/k8spider
确定了第一步是DNS侦查之后,还需要去确定侦查到的结果尽可能过滤无用数据,因此我在此基础上,做了一款专门的工具,工作流程如下图 :



这是最终的成果: https://github.com/wgpsec/EndpointSearch
题外话:EndpointSearch这个工具不仅仅可用于探测非公有云的云服务端点,受到Black Hat 2023议题:Evading Logging in the Cloud: Bypassing AWS CloudTrail的启发,他也可以用于侦查公有云的非生产云服务端点。
通过这个流程,我们仅仅使用了web探活程度的动静就搜集到可能的云服务端点。由于互联网上众多的网络资产测绘引擎在不断扫描资产,因此这个动静将会掩盖在互联网众多扫描行为中。
有了这个工具,我通过攻击路线8横向到其他的云服务中。
如何防御
这取决于创建者是如何理解和使用云计算的,通常情况下,公有云的云服务端点是公开的,因为他的消费者是来自互联网的所有人,因此不会去限制对云服务端点的访问。换言之,创建者需要根据自己的业务需求去考虑是否做边界准入的限制。
既然云服务端点的边界准入限制不是必然存在的,就需要有更多的防线,在纵深防御策略的指导下,需要假设防线失效后的后续防护手段。
不限制准入不代表不需要警惕陌生的请求者,因此针对异地访问的告警机制是很有必要的。
然而,告警并不会真正拦截恶意的攻击者,他只是尽快通知管理员进行研判的一个手段,在实际实践中,管理员不看告警或者没有及时看告警的,又或者攻击者绕过告警发起攻击,也是可能的。
我们再次假设前两道防线都已经失效了,此时攻击者取得的成果大小取决于攻击者使用的AKSK权限有多高,这就涉及一个IAM身份管理的安全构建问题,是否遵循最小特权原则和职责分工原则。举个反面例子,长期使用主账号的AKSK,泄漏之后攻击者直接是管理员,相当于域环境下域管帐号被控制。
除此之外,事后能否利用操作审计进行溯源追踪,发现问题根源(AK泄漏事件的源头),这也是云安全构建需要关注的问题。
同样的,区别于公有云,云api可能会存在安全漏洞,例如越权问题。
公有云有权责共担模型,可以使消费者只需要关注非常小的一部分安全,而选择私有云或混合云,就需要承当更多的安全责任。
参考链接
https://recon.cloud
https://www.cloudflare.com/zh-cn/learning/security/api/what-is-a-cloud-api/
https://www.cloudflare.com/zh-cn/learning/security/api/what-is-api- endpoint/
https://docs.aws.amazon.com/general/latest/gr/rande.html#global- endpoints
https://learn.microsoft.com/en-us/cli/azure/use-azure-cli-rest-command?tabs=bash
https://ecloud.10086.cn/op-help-center/doc/article/48179
https://cloud.tencent.com/document/product/1278/46697
https://next.api.aliyun.com/product/Rds
https://cloud.google.com/vpc/docs/private-service-connect?hl=zh-cn
https://aws.amazon.com/cn/blogs/china/announcing-aws-cloud-control-api/
https://help.aliyun.com/zh/oss/user-guide/access-to-oss-resources-from-ecs-instances-by-using-an-internal-endpoint-of-oss?spm=a2c4g.11174283.0.i2
https://github.com/Esonhugh/k8spider
https://github.com/shadowabi/S-BlastingDictionary/blob/main/CloudService.txt
https://github.com/wgpsec/EndpointSearch
本文作者:
shadowabi,雪诺安全攻防工程师,狼组安全团队成员,CSA大中华区云渗透测试工作组成员
相关文章:
云渗透实战手册:云API攻防之云服务端点侦查
在云计算环境中的渗透,与传统渗透相比,新增加了许多新的攻击面,同时也因为云计算的特点我们需要转变渗透的思维,用云计算的方式去思考云渗透。 基础知识 在云渗透开始之前,我们需要首先阐述标题中提到的云服务端点概…...
PHP 爬虫之使用 Curl库抓取淘宝商品列表数据网页的方法
使用 PHP 的 cURL 库来抓取淘宝商品列表数据网页需要谨慎,因为淘宝等电商平台通常会有反爬虫机制,以防止数据被滥用。然而,如果你只是出于学习目的,并且了解并遵守了淘宝的robots.txt文件和相关的使用条款,你可以尝试使…...
Python基础小知识问答系列-可迭代型变量赋值
1. 问题: 怎样简洁的把列表中的元素赋值给单个变量? 当需要列表中指定几个值时,剩余的变量都收集在一起,该怎么进行变量赋值? 当只需要列表中指定某几个值,其他值都忽略时,该怎么…...
主流 Canvas 库对比:Fabric.js、Konva.js 和 Pixi.js
在前端开发中,HTML5 Canvas 是一个强大的工具,可以用来创建图形、动画和各种视觉效果。为了简化和增强 Canvas 的使用,社区中出现了许多库。本文将对比三种主流的 Canvas 库:Fabric.js、Konva.js 和 Pixi.js,分析它们的…...
backbone是什么?
在深度学习中,特别是计算机视觉领域,"backbone"(骨干网络)是指用于提取特征的基础网络。它通常是卷积神经网络(CNN),其任务是从输入图像中提取高层次特征,这些特征然后被用…...
四十篇:内存巨擘对决:Redis与Memcached的深度剖析与多维对比
内存巨擘对决:Redis与Memcached的深度剖析与多维对比 1. 引言 在现代的系统架构中,内存数据库已经成为了信息处理的核心技术之一。这类数据库系统的高效性主要来源于其对数据的即时访问能力,这是因为数据直接存储在RAM中,而非传统…...
HTML5的多线程技术:Web Worker API
Web Workers API 是HTML5的一项技术,它允许在浏览器后台独立于主线程运行脚本,即允许进行多线程处理。这对于执行密集型计算任务特别有用,因为它可以防止这些任务阻塞用户界面,从而保持网页的响应性和交互性。Web Workers在自己的…...
Java | Leetcode Java题解之第206题反转链表
题目: 题解: class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead reverseList(head.next);head.next.next head;head.next null;return newHead;} }...
660错题
不能局部求导,局部洛必达...
GAMES104:04游戏引擎中的渲染系统1:游戏渲染基础-学习笔记
文章目录 概览:游戏引擎中的渲染系统四个课时概览 一,渲染管线流程二,了解GPUSIMD 和 SIMTGPU 架构CPU到GPU的数据传输GPU性能限制 三,可见性Renderable可渲染对象提高渲染效率Visibility Culling 可见性裁剪 四,纹理压…...
Visual Studio 中的键盘快捷方式
1. Visual Studio 中的键盘快捷方式 1.1. 可打印快捷方式备忘单 1.2. Visual Studio 的常用键盘快捷方式 本部分中的所有快捷方式都将全局应用(除非另有指定)。 “全局”上下文表示该快捷方式适用于 Visual Studio 中的任何工具窗口。 生成࿱…...
K8S中的某个容器突然出现内存和CPU占用过高的情况解决办法
当K8S中的某个容器突然出现内存和CPU占用过高的情况时,可以采取以下步骤进行处理: 观察和分析: 使用kubectl top pods命令查看集群中各个Pod的CPU和内存占用情况,找出占用资源高的Pod。使用kubectl describe pod <pod-name>…...
Pointnet++改进即插即用系列:全网首发GLSA聚合和表示全局和局部空间特征|即插即用,提升特征提取模块性能
简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入GLSA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理论介…...
如何选择适合自己的虚拟化技术?
虚拟化技术已成为现代数据中心和云计算环境的核心组成部分。本文将帮助您了解如何选择适合自己需求的虚拟化技术,以实现更高的效率、资源利用率和灵活性。 理解虚拟化技术 首先,让我们了解虚拟化技术的基本概念。虚拟化允许将一个物理服务器划分为多个虚…...
Spring动态代理详解
一,动态代理 我发现Spring框架中的动态代理是一种非常强大的机制,它可以在运行时为接口或类创建动态代理,然后通过这些代理在方法调用前后添加额外的行为。在后续Spring的AOP(面向切面编程)支持中扮演了关键角色。 二…...
Java微服务架构中的消息总线设计
Java微服务架构中的消息总线设计 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java微服务架构中的消息总线设计。 一、什么是消息总线&…...
51单片机项目-点亮第一个LED灯(涉及:进制转换表、创建项目、生成HEX文件、下载程序到单片机、二极管区分正负极)
目录 新建项目选择型号添加新文件到该项目设置字体和utf-8编码二极管如何区分正负极原理:CPU通过寄存器来控制硬件电路 用P2寄存器的值控制第一个灯亮进制转换编译查看P2寄存器的地址生成HEX文件把代码下载到单片机中下载程序到单片机 新建项目 选择型号 stc是中国…...
安全管理中心测评项
安全管理中心 系统管理 应对系统管理员进行身份鉴别,只允许其通过特定的命令或操作界面进行系统管理操作,并对这些操作进行审计; 应通过系统管理员对系统的资源和运行进行配置、控制和管理,包括用户身份、系统资源配置、系统加…...
word 转pdf 中图片不被压缩的方法
word 转pdf 中图片不被压缩的方法 法1: 调节word 选项中的图片格式为不压缩、高保真 法2: 1: word 中的图片尽可能使用高的分辨率,图片存为pnd或者 tif 格式(最高清) 2: 转化为pdf使用打印机器,参数如下…...
Springboot+Vue3开发学习笔记《1》
SpringbootVue3开发学习笔记《1》 博主正在学习SpringbootVue3开发,希望记录自己学习过程同时与广大网友共同学习讨论。 一、前置条件 博主所用版本: IDEA需要破解,破解工具链接容易挂,关注私聊我单发。 Spring Boot是Spring提…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
