云上攻防:一、公有云平台攻防
1. 概念
公有云平台是指云计算服务提供商通过互联网向用户提供云计算资源和服务的平台。在公有云平台上,用户可以按需租用计算资源、存储资源、网络资源等,而无需购买和维护自己的硬件设备和基础设施。
公有云平台通常提供以下服务:
- 计算服务:提供虚拟机、容器等计算资源,用户可以根据需求选择不同的配置和规模。
- 存储服务:提供云存储、对象存储等存储资源,用户可以根据需求选择不同的存储类型和容量。
- 网络服务:提供虚拟网络、负载均衡、VPN 等网络资源,用户可以根据需求构建自己的网络架构。
- 数据库服务:提供关系型数据库、非关系型数据库等数据库资源,用户可以根据需求选择不同的数据库类型和规模。
- 应用服务:提供云原生应用、容器化应用等应用服务,用户可以快速部署和管理自己的应用。
- 安全服务:提供防火墙、加密、身份认证等安全服务,保障用户数据和应用的安全性。
公有云平台的优点包括: - 灵活性:用户可以根据需求随时调整资源配置和规模。
- 可靠性:公有云平台通常采用分布式架构和多备份机制,保障服务的高可用性和数据的安全性。
- 成本效益:用户无需购买和维护自己的硬件设备和基础设施,可以节省大量的成本。
- 扩展性:公有云平台可以快速扩展资源,满足用户业务增长的需求。
目前用的比较多的主要有:
- 国内云平台,常见的云有阿里云、腾讯云、京东云、青云、华为云等。在渗透攻击中,我们会经常碰到这些云,甚至有些犯罪分子会将网站、股票系统等放置在云上。与传统针对单个站点的渗透技术相比,对于云资产的渗透技术并不存在明显的差别,仍需要进行常见的SQL注入、XSS、文件包含等攻击。但在攻击云资产时,我们每次扫描和操作都会被记录在云日志中。除了常规的渗透方式,云还存在相应的漏洞可供利用。
- Amazon。亚马逊AWS(Amazon Web Services (AWS) )是亚马逊提供的专业云计算服务,于2006年推出,以Web服务的形式向企业提供IT基础设施服务,通常称为云计算。其主要优势之一是能够以根据业务发展来扩展的较低可变成本来替代前期资本基础设施费用。
亚马逊网络服务所提供服务包括:亚马逊弹性计算网云(Amazon EC2)、亚马逊简单储存服务(Amazon S3)、亚马逊简单数据库(Amazon SimpleDB)、亚马逊简单队列服务(Amazon Simple Queue Service)以及Amazon CloudFront等。在全球范围内,最受欢迎的云主机是AWS,AWS泄漏的用户AccessKey利用比较苛刻,因为不是根用户的AK而是通过IAM创建出来的用户,对访问S3、EC2等都有很细的权限控制。就算拿到了AccessKey都不一定能获取到信息或者直接控制EC2。
对于AWS而言,针对单个站点的渗透是相当困难的,尤其是当没有明显的Web漏洞和开放的端口(仅有80、443),除非用户配置不当允许所有端口被访问。 - Windows Azure是微软基于云计算的操作系统,Windows Azure的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web和PC上的应用程序。云计算的开发者能使用微软全球数据中心的储存、计算能力和网络基础服务。Azure服务平台包括了以下主要组件:Windows Azure;Microsoft SQL数据库服务,Microsoft .Net服务;用于分享、储存和同步文件的Live服务;针对商业的Microsoft SharePoint和Microsoft Dynamics CRM服务。
一般的云平台大多会有以下一些云产品,可能叫法不一样,但功能和业务基本都差不多:
-
云服务器ECS(Elastic Compute Service)实例:云上的虚拟计算服务器,内含vCPU、内存、操作系统、网络、磁盘等基础组件。
-
云负载均衡(Server Load Balancer,简称SLB)是云原生时代应用高可用的基本要素。通过对多台云服务器进行均衡的流量分发调度,消除单点故障提升应用系统的可靠性与吞吐力。
-
对象存储(Object Storage Service),是阿里云对外提供的海量、安全和高可靠的云存储服务。RESTFul API 的平台无关性,容量和处理能力的弹性扩展,按实际容量付费真正使您专注于核心业务。Web应用资源、提供数据下载等
-
安全组是一种虚拟防火墙,具备状态检测和数据包过滤功能,用于在云端划分安全域。同一安全组内的ECS实例之间默认内网网络互通。
-
云数据库(Relational Database Service,简称 RDS)是一种稳定可靠、可弹性伸缩的在线数据库服务。RDS 采用即开即用方式,兼容 MySQL、 SQL Server 两种关系型数据库,并提供数据库在线扩容、备份回滚、性能监测 及分析功能。RDS 与云服务器搭配使用 I/O 性能倍增,内网互通避免网络瓶颈。
-
专有网络VPC(Virtual Private Cloud)是用户基于阿里云创建的自定义私有网络, 不同的专有网络之间二层逻辑隔离,用户可以在自己创建的专有网络内创建和管理云产品实例,比如ECS、SLB、RDS等。https://help.aliyun.com/document_detail/34217.html
-
访问控制RAM(Resource Access Management)是阿里云提供的管理用户身份与资源访问权限的服务。RAM允许在一个阿里云账号下创建并管理多个身份,并允许给单个身份或一组身份分配不同的权限,从而实现不同用户拥有不同资源访问权限的目的。
-
AccessKey 阿里云用户可以在管理控制台里自行创建 Access Key,Access Key是由AccessKey ID 和 AccessKey Secret 组成。其中 ID 是公开的,用于标识用户身份,Secret 是秘密的,用于用户鉴别。当用户向 OSS 发送请求时,需要首先将发送的请求按照 OSS 指定的格式生成签名字符串;然后使用 AccessKey Secret 对签名字符串进行加密(基于HMAC 算法)产生验证码。验证码带时间戳,以防止重放攻击。OSS 收到请求以后,通过 AccessKey ID 找到对应的 AccessKey Secret,以同样的方法提取签名字符串和验证码,如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,OSS 将拒绝处理这次请求,并返回 HTTP 403 错误。 https://help.aliyun.com/document_detail/53045.html
2. 弹性计算服务攻防
2.1 攻击思路
- 阅读产品文档、阅读架构文档、了解相关操作手册,了解产品功能模块
- 常规渗透一样子域名查找、端口扫描、目录扫描、指纹识别等,在查找的过程中留意AccessKey等密钥,会在APK文件、Github关键词、Web页面、JS文件、常规配置文件
- 云主机的应用漏洞(SSRF、RCE、本地文件读取等常规漏洞)
- 云产品的默认配置
- OSS文件存储服务,默认设置为开放,导致文件任意下载
- 端口默认对外0.0.0.0/0公网开放
2.2 AccessKey泄漏利用
渗透场景:
APK文件中存放Access Key;
Web页面/JS文件/phpinfo等;
Github查找目标关键字发现AccessKey与AccessKey Secret;
拥有WebShell低权限的情况下搜集阿里云Access Key利用;
使用行云管家直接导入,获取OSS数据:
可直接获取阿里云主机进行重置密码等操作:
2.3 SSRF查看实例元数据
实例元数据是云服务器(如亚马逊 AWS 云、阿里云、腾讯云等)提供的一种特殊的 Web 服务,它允许云服务器上的实例在内部网络内查询它们的元数据,例如它们的内网 IP 地址、安全组、密钥对等信息。可以结合SSRF漏洞一起使用。
https://cloud.tencent.com/document/product/213/4934、http://metadata.tencentyun.com/latest/meta-data/
获取 metadata 版本信息。
查询实例元数据。
http://metadata.tencentyun.com/latest/meta-data/placement/region
获取实例物理所在地信息。
http://metadata.tencentyun.com/latest/meta-data/local-ipv4
获取实例内网 IP。实例存在多张网卡时,返回 eth0 设备的网络地址。
http://metadata.tencentyun.com/latest/meta-data/public-ipv4
获取实例公网 IP。
http://metadata.tencentyun.com/network/interfaces/macs/${mac}/vpc-id
实例网络接口 VPC 网络 ID。
在获取到角色名称后,可以通过以下链接取角色的临时凭证,${role-name} 为CAM 角色的名称:
http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/${role-name}
3. 对象存储攻防
3.1 概念
对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据。腾讯云 COS 使所有用户都能使用具备高扩展性、低成本、可靠和安全的数据存储服务。
COS 通过控制台、API、SDK 和工具等多样化方式简单、快速地接入,实现了海量数据存储和管理。通过 COS 可以进行任意格式文件的上传、下载和管理。腾讯云提供了直观的 Web 管理界面,同时遍布全国范围的 CDN 节点可以对文件下载进行加速。
每个云厂商对象存储叫法不一样,阿里云的OSS存储桶,华为云的OBS存储桶,腾讯云的COS存储桶,亚马逊云S3存储桶。这里主要以腾讯的COS存储桶来讲解,我们不需要掌握所有厂商存储桶只需要掌握一种基本都相通。
3.2 攻击场景
3.2.1 OSS初始访问
- 云平台主 API 密钥泄露
- 对象存储 SDK 泄露
- 存储桶工具配置文件泄露
- 前端直传功能获取凭据
- 云平台账号非法登录
- 云平台主API密钥泄露
- 云平台的主 API 密钥相当于用户的登录密码,代表着账户拥有者的身份和对应的权限。API 密钥是由 SecretId 和 SecretKey 组成的,通过 API 密钥,用户可以访问云平台 API 并管理账户下的资源。然而,在某些攻击情景中,因为开发者开发和配置不安全,或者某些针对设备的入侵事件,主 API 密钥可能被泄露,攻击者可以假冒账户拥有者的身份,通过窃取的 API 密钥入侵云平台,非法操作存储服务并篡改、盗窃数据。
- 对象存储 SDK 泄露。云平台提供了对象存储服务,不仅包含多种 API 接口,还提供丰富的 SDK 供开发者使用。开发者在 SDK 初始化阶段需要配置存储桶名称、路径、地域等信息,以及永久密钥或临时密钥。这些信息被编写在代码中,供应用程序操作存储桶。然而,如果密钥代码片段泄露,例如开发者上传源代码到公开仓库或应用开发商未删除示例中的 SDK 凭据信息,将会导致凭据泄露,从而使对象存储服务遭受入侵。攻击者可以冒用凭据所有者身份攻击对象存储服务。
Github:
- 存储桶工具配置文件泄露。对象存储服务在使用过程中,官方和开源社区为了方便用户操作存储桶,提供了大量的对象存储客户端工具。使用这些工具前,需要在工具的配置文件或配置项中填入存储服务相关信息和用户凭据,以便工具与存储服务进行交互。但是,在一些攻击场景下,例如开发者个人电脑被钓鱼攻击或开发者对象存储客户端工具配置文件被泄露,这些凭据和存储桶信息写在存储服务工具配置文件中的将会泄露出去,攻击者可以通过分析这些配置文件获取凭据,这些凭据往往是用户的云平台主 API 密钥,攻击者可以通过这些信息控制对象存储服务,甚至在一些严重的场景中,攻击者可以控制用户的所有云上资产。
- 前端直传功能获取凭据。在一些结合了对象存储服务、Web 开发和移动开发的场景中,开发人员选择使用前端直传功能来操作对象存储服务。这一功能指的是利用 iOS/Android/JavaScript 等 SDK 通过前端直接向对象存储服务进行访问。前端直传功能可以很好地节约后端服务器的带宽和负载,但是,为了实现这一功能,开发人员需要在前端代码中编写凭据,这样容易被攻击者轻易获取。然而,这并不代表这一功能不安全。如果遵守安全开发规范,比如使用临时密钥而不是永久密钥作为前端凭据,并按照最小权限原则生成临时密钥,就可以保证对象存储服务的安全。然而,如果实际应用中的开发人员没有遵循安全开发原则,比如使用了错误的永久密钥,或配置了错误的临时凭据权限,那么攻击者可以通过前端获得的凭据访问对象存储服务。攻击者可以通过分析前端代码或抓取流量来获得这些错误配置生成的凭据,并以此进行攻击。
阅读参考:https://cloud.tencent.com/developer/article/1931560
拿到AK/SK无法利用场景
通过小程序或者JS获取的AK/SK却无法利用是怎么回事?
什么是STS模式?
Web、iOS、Android 使用 COS 时,通过固定密钥计算签名方式不能有效地控制权限,同时把永久密钥放到客户端代码中有极大的泄露风险。STS提供的是一种临时访问授权。通过STS可以返回临时的AK\SK和STSToken,这些信息可以直接发给临时用户用来访问OSS,有效地解决权限控制问题。
临时密钥整体架构图:
STS模式中,accessKeyId、accessKeySecret和stsToken都是会变化,临时密钥有效时长,单位是秒,默认 1800 秒,如果当我们从小程序或APP中获取的AK/SK中无法获取存储桶的信息时,则是遇到了STS模式,获取到的AK/SK已过期。
// 临时密钥有效时长,单位是秒,默认 1800 秒,目前主账号最长 2 小时(即 7200 秒),子账号最长 36 小时(即 129600)秒
config.put("durationSeconds", 1800);
4. 基础设施即代码
基础设施即代码(Infrastructure as Code,IaC)是一种将基础设施定义、配置和管理通过代码来实现的方法。在传统的基础设施管理中,管理员需要手动配置和管理服务器、网络、存储等基础设施,这种方式存在人为错误、重复劳动、难以维护等问题。
而基础设施即代码则是将基础设施的配置和管理通过代码来实现,将基础设施的状态和配置信息以代码的形式进行描述和管理。这种方式可以带来以下优点:
- 一致性:通过代码来管理基础设施,可以确保基础设施的配置和状态在不同环境和时间点上保持一致。
- 可重复性:通过代码来管理基础设施,可以实现基础设施的快速部署和复制,减少重复劳动。
- 版本控制:通过代码来管理基础设施,可以将基础设施的配置和状态信息纳入版本控制系统中,方便回滚和审计。
- 自动化:通过代码来管理基础设施,可以实现基础设施的自动化管理和维护,提高效率和可靠性。
常见的基础设施即代码工具包括 Ansible、Chef、Puppet、Terraform 等,这些工具可以帮助管理员将基础设施的配置和管理通过代码来实现,提高基础设施管理的效率和可靠性。我们这里主要介绍Terraform。
一些使用场景例如:
- 在AWS中使用Terraform来部署EC2实例。
- 在Kubernetes中使用Terraform来部署应用程序
- 在腾讯云中使用Terraform来部署CVM、COS
4.1 Terraform入门
4.1.1 安装Terraform
#Centos7
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo
https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
4.1.2 配置语法
- Terraform的配置文件以 .tf 为后缀
- json代码文件以 .tf.json 为后缀
- Terraform只支持两种格式:HCL、JSON
在使用Terraform调用云服务时,需要开启云服务的RAM帐户,这里以腾讯云为例子:
4.1.3 配置Provider
Terraform通过provider管理基础设施,使用provider与云供应商API 进行交互
Tencentcloud:
- https://registry.terraform.io/providers/tencentcloudstack/tencentcloud/1.78.15
- https://github.com/tencentcloudstack/terraform-provider-tencentcloud
terraform {
required_providers {
tencentcloud = {
source = "tencentcloudstack/tencentcloud"
version = "1.78.15"
}
}
}
required_providers:定义providers
source:定义providers的源地址
version:指定providers版本号
编辑完后通过以下方式进行测试:
mkdir test
cd test
vim version.tf
terraform init
4.1.4 配置AK
定义Variables
Terraform 会自动加载许多变量定义文件:
文件名为 terraform.tfvars 或 terraform.tfvars.json 的文件。
文件名称以 .auto.tfvars 或 .auto.tfvars.json 结尾的文件。
若同时使用多种赋值方式时,同一个变量可能会被赋值多次。Terraform会使用新值覆盖旧值。Terraform 加载变量值的顺序是:
- 环境变量
- terraform.tfvars 文件(若存在)
- terraform.tfvars.json 文件(若存在)
- 所有的 .auto.tfvars 或 .auto.tfvars.json 文件,以字母顺序排序处理。
- 通过 -var 或 -var-file 命令行参数传递的输入变量,按照在命令行参数中定义的顺序加载。
(1) 创建variables.tf文件,存储变量
(2) 可以从环境变量或者文本中读取
variable "tencentcloud_secret_id" {
type = string
description = "Set TencentCloud access key id."
sensitive = true
nullable = false
}
variable "tencentcloud_secret_key" {
type = string
description = "Set TencentCloud secret access key."
sensitive = true
nullable = false
}
tencentcloud_secret_id = "xxx" #填写AK
tencentcloud_secret_key = "xxx" #填写密钥
provider "tencentcloud" {
secret_id = var.tencentcloud_secret_id
secret_key = var.tencentcloud_secret_key
region = "ap-beijing"
}
不通过以上方式,可以在本机定义变量,通过环境变量读取AK
export TF_VAR_tencentcloud_access_key="LxxxT”
export TF_VAR_tencentcloud_secret_key="zWSKxxxIUu”
export TF_VAR_region="cn-beijing-b"
4.1.5 定义资源
资源来自Provider, 是Terraform中最重要的元素。每个资源块描述一个或多个基础对象,例如网络、计算实例或更高级别的组件,例如 DNS 记录。
资源名称必须以字母或下划线开头,并且只能包含字母、数字、下划线和破折号。
腾讯云Terraform文档参考:
https://registry.terraform.io/providers/tencentcloudstack/tencentcloud/latest/docs
地域和可用区:https://cloud.tencent.com/document/product/213/6091
provider "tencentcloud" {
secret_id = var.tencentcloud_secret_id
secret_key = var.tencentcloud_secret_key
region = "ap-hongkong"
}
resource "tencentcloud_instance" "test" {
instance_name = "test_terraform" #实例名称
availability_zone = "ap-hongkong-2" #地区
image_id = "img-l8og963d" #镜像ID
instance_type = "SA2.MEDIUM2" #机器类型
allocate_public_ip = true
internet_max_bandwidth_out = 50
security_groups = ["sg-3yy8drp7"] #安全组
user_data_raw = <<EOF
#!/bin/bash
touch /tmp/test.txt
EOF
}
terraform init #初始化
terraform plan #计划与预览
terraform apply #申请资源
terraform show #显示资源
terraform destroy #销毁资源
整个执行流程如下:
4.2 构建公有云漏洞环境
TerraformGoat 是一个支持多云的云场景漏洞靶场搭建工具,目前支持阿里云、腾讯云、华为云、Amazon Web Services、Google Cloud Platform、Microsoft Azure 六个云厂商的云场景漏洞搭建。
通过Docker构建腾讯云环境:
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
构建SSRF漏洞的CVM环境:
cd /TerraformGoat/tencentcloud/cvm/cvm_ssrf/
编辑 terraform.tfvars 文件,在文件中填入你
的 tencentcloud_secret_id
和 tencentcloud_secret_key
vim terraform.tfvars
部署靶场
terraform init
terraform apply
5. 云函数攻防
5.1 Serverless概述
无服务器(Serverless)不是表示没有服务器,而是表示当您在使用Serverless时,您无需关心底层的资源,也无需登录服务器和优化服务器,只需关注最核心的代码片段,即可跳过复杂的、繁琐的基本工作。
Serverless 拥有近乎无限的扩容能力,空闲时,不运行任何资源。代码运行无状态,可以轻易实现快速迭代、极速部署。
5.2 云函数
函数即服务提供了一种直接在云上运行无状态的、短暂的、由事件触发的代码的能力。
函数即服务和传统应用架构不同,函数服务提供的是事件触发式的运行方式,云函数不是始终运行的状态,而是在事件发生时由事件触发运行,并且在一次运行的过程中处理这一次事件。因此在云函数的代码中,仅需考虑针对一个事件的处理流程,而针对大量事件的高并发处理,由平台实现云函数的多实例并发来支持。
云函数(Serverless Cloud Function,SCF)是为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件。
云函数无法长驻,调用的时候创建,执行完之后立即就销毁,所以无法直接保存状态。
云函数功能特性:
- 代码管理
- 支持多开发环境
- 自动伸缩
- 事件触发
- 监控和日志
以函数为扩展单位,虚拟化运行时环境(Runtime),是现有计算资源的最小单位,具有完全自动、一键部署、高度可扩展等.
使用云函数时,您只需使用平台支持的语言(Python、Node.js、PHP、Golang、Java 及 Custom Runtime)编写代码。而云平台将完全管理底层计算资源,包括服务器 CPU、内存、网络和其他配置/资源维护、代码部署、弹性伸缩、负载均衡、安全升级、资源运行情况监控等。
Serverless 帮助用户脱离繁冗的开发配置工作,只需关注业务代码逻辑的编写,不用任何的基础设施建设、管理与运维开销。该服务模式降低了研发门槛,提升业务构建效率,获得了大量企业和开发者的支持。
- 多种部署方式,适应各种环境
- 多样化触发,支持更多业务场景
- 自动化弹性执行,贴合调用曲线
- 按需付费,毫秒级计费模式
云函数(Serverless Cloud Function,SCF)提供代码部署、镜像部署两种部署方式,支持事件函数和 Web 函数两种函数类型。
SCF 事件函数有三个基本概念:执行方法、函数入参和函数返回。
-
执行方法。对应项目的主函数,是程序执行的起点。在调用云函数时,首先会寻找执行方法作为入口,执行用户的代码。用户需以文件名.执行方法名的形式进行设置。用户设置的执行方法为 index.handler,则 SCF 平台会首先寻找代码程序包中的 index 文件,并找到该文件中的 handler 方法开始执行。
-
函数入参。是指函数在被触发调用时所传递给函数的内容。通常情况下,函数入参包括 event 和 context 两部分,但根据开发语言和环境的不同,入参个数可能有所不同。
- event入参。event 参数类型为 dict,event 中包含了触发函数执行的基本信息,可以是平台定义的格式,也可以自定义格式。函数被触发开始执行后,可以在代码内部对 event 进行处理。
有两种方法可以触发云函数 SCF 执行:- 通过调用 云 API 触发函数执行。
- 通过绑定 触发器 触发函数执行。
- context入参
context 为 SCF 平台提供的入参,将 context 入参传递给执行方法,代码可通过解析 context 入参对象,获取到运行环境及当前请求的相关信息。
- event入参。event 参数类型为 dict,event 中包含了触发函数执行的基本信息,可以是平台定义的格式,也可以自定义格式。函数被触发开始执行后,可以在代码内部对 event 进行处理。
-
函数返回
SCF 平台会获取到云函数执行完成后的返回值,并根据下述不同的触发方式进行处理。- 同步触发
- 通过 API 网关、云 API 同步 invoke 触发函数的方式为同步触发。
- 使用同步方式触发的函数在执行期间,SCF 平台不会返回触发结果。
- 在函数执行完成后,SCF 平台会将函数返回值封装为 JSON 格式并返回给调用方。
- 异步触发
- 使用异步方式触发的云函数,SCF 平台接收触发事件后,会返回触发请求 ID 。
- 在函数执行完成后,函数的返回值会封装为 JSON 格式并存储在日志中。
- 用户可在函数执行完成后,通过返回的请求 ID 查询日志获取该异步触发函数的返回值。
- 同步触发
5.3 触发器和触发源
- 任何可以产生事件,触发云函数执行的均可以被称为触发器或触发源。触发器在本身产生事件后,通过将事件传递给云函数来触发函数运行。
- 触发器在触发函数时,可以根据自身特点,使用同步或异步方式触发函数。同步方式触发函数时,触发器将等待函数执行完成并获取到函数执行结果;异步方式触发函数时,触发器将仅触发函数而忽略函数执行结果。
- 腾讯云云函数在和腾讯云的某些产品或服务对接时,也有自身实现的一些特殊方式,例如推(PUSH)模式和拉(PULL)模式。
- 推模式:触发器主动将事件推送至云函数平台并触发函数运行。
- 拉模式:云函数平台通过拉取模块,从触发器中拉取到事件并触发云函数运行。
5.4 触发事件
触发器在触发函数时会将事件传递给云函数。事件在传递时以一个特定的数据结构体现,数据结构格式在传递时均为 JSON 格式,并以函数 event 入参的方式传递给云函数。
触发事件的 JSON 数据内容,在不同的语言环境下将会转换为各自语言的数据结构或对象,无需在代码中自行进行从 JSON 结构到数据结构的转换。
例如,在 Python 环境中,JSON 数据内容会转变为一个复杂 dict 对象,即函数的入参 event 就是一个 Python 的复杂 dict 对象。而在 Golang 或 Java 中,入参是一个需要和 event 数据结构可以匹配的对象。
5.5 Serverless 扫描技术
5.5.1 云函数端口扫描
利用云函数进行目标端口的扫描与在本地扫描类似,但需要注意对参数的处理,简单的批量扫描示例代码如下:
云函数定义:
# -*- coding: utf8 -*-
from socket import *
def main_handler(event, context):
IP=event["queryString"]["ip"]
port=event["queryString"]["port"]
try:
conn=socket(AF_INET,SOCK_STREAM)
res=conn.connect_ex((str(IP),int(port)))
conn.send('Hello,World!'.encode("utf8"))
results=conn.recv(25)
if res==0:
conn.close()
return port
except Exception as err:
print(err)
finally:
print("")
conn.close()
return None
本地调用:
#!/usr/bin/env python
# encoding: utf-8
import grequests
def main():
serverless = ["https://service-xxx-xxx.sh.apigw.tencentcs.com/release/http_proxy"]
resp, num = [], 0
port_one = [22, 53, 80, 81, 82, 83, 111, 9096, 9291, 9080, 6379, 5900, 9090, 443]
port_two = [8088, 8080, 4566, 6666, 10001, 2443, 3306, 3389, 7001, 9099, 135, 23]
try:
ip = input("\033[31;32mPlease Input IP Address:\033[0m")
print("")
for server in serverless:
num += 1
port_list = port_one if num == 1 else port_two
for port in port_list:
serverless_one = f"{server}?ip={ip}&port={port}"
resp.append(grequests.get(
serverless_one,
timeout=5
)
)
res_list = grequests.map(resp)
for res in res_list:
if res.text != "null" and res.text.find("errorCode") == -1:
print('[+]{}/tcp OPEN'.format(res.text))
except Exception as err:
print(err)
pass
if __name__ == '__main__':
main()
类似地,可以编写云函数访问WebShell代码:
# -*- coding: utf8 -*-
import requests
import json
def geturl(urlstr):
jurlstr = json.dumps(urlstr)
dict_url = json.loads(jurlstr)
return dict_url['u']
def main_handler(event, context):
url = geturl(event['queryString'])
postdata = event['body']
headers=event['headers']
resp=requests.post(url,data=postdata,headers=headers,verify=False)
response={
"isBase64Encoded": False,
"statusCode": 200,
"headers": {'Content-Type': 'text/html;charset='+resp.apparent_encoding},
"body": resp.text
}
return response
可以通过API触发器访问:
https://service-xxxx-xxxxx.gz.apigw.tencentcs.com/release/saulGoodman?u=http://111.111.111.111/shell.php
6. 公有云防御
默认情况下如果没有创建RAM用户则是使用阿里云创建的用户生成的Access Key则是拥有所有管理权限的。
配置RAM用户,使用RAM用户连接OSS,就算AK泄漏造成的影响也是有限。
- RAM (Resource Access Management) 是阿里云为客户提供的用户身份管理与访问控制服务。
- 使用RAM,您可以创建、管理用户账号(比如员工、系统或应用程序),并可以控制这些用户账号对您名下资源具有的操作权限。
- 当您的企业存在多用户协同操作资源时,使用RAM可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,从而降低您的企业信息安全风险。
- 一个云账号下可以创建多个RAM用户,对应企业内的员工、系统或应用程序。
- RAM用户归属于云账号,只能在所属云账号的空间下可见,而不是独立的云账号。
- RAM用户必须在获得云账号的授权后才能登录控制台或使用API操作云账号下的资源。
目前在Github上能找到阿里云的AK/SK已经很困难了,阿里云和Github合作引入了Token scan机制,用户不慎泄漏AccessKey会被检测出来并且通知用户进行更改。
其它安全建议:
- 不要将AccessKey嵌入代码中。嵌入代码中的AK凭证容易被人忽视,经验丰富的开发者会将其写入数据库或者独立的文件中,使得其管理起来更方便。
- 定期更新AccessKey。定期更新代码中存在的AccessKey,可保证一些旧的代码泄漏后不会影响当前线上业务。
- 定期吊销不需要的AccessKey。在阿里云AccessKey控制台可查看最后一次AccessKey的访问时间,建议禁用所有不用的AccessKey。
- 遵循最小权限原则使用RAM账户。根据不同业务需要授予不同子账户的读写权限,为不同业务分配不同子账户的AccessKey。
- 开启操作日志审计,并将其投递至OSS和SLS保存和审计。将操作日志存储至OSS,异常情况时可以起到固证的作用;操作日志投递至SLS,帮助您在日志数量大的时候也能实现高效检索。
评论区