[TOC]
云计算
云是指通过互联网提供的远程计算服务和资源。它是一种将计算资源(如存储、处理能力、网络和应用程序)虚拟化并集中管理的技术模式,用户可以按需通过网络访问这些资源,而无需关心底层硬件设施的部署和管理。
主要类型
-
公有云(Public Cloud)
由第三方云服务商提供,资源通过互联网共享。
例如:阿里云、 AWS(亚马逊云)、微软 Azure、 Google Cloud。
特点:低成本、高弹性、无需维护基础设施。
-
私有云(Private Cloud)
专为单一组织构建,资源完全由该组织独享。
特点:高安全性、定制化强,但成本较高。
-
混合云(Hybrid Cloud)
结合公有云和私有云的优点,允许数据和应用在两者之间灵活切换。
特点:满足敏感数据安全需求,同时利用公有云的弹性。
-
多云(Multi-Cloud)
指企业同时使用多个公有云服务商的资源和服务。
特点:避免供应商锁定,提高服务可靠性。
服务模型
云计算按提供的服务类型,分为以下三种主要模型:
-
基础设施即服务(IaaS, Infrastructure as a Service)
提供虚拟化的计算资源,如虚拟机、存储、网络等。
用户需要自行管理操作系统、应用程序等。
示例: AWS EC2、阿里云 ECS。
-
平台即服务(PaaS, Platform as a Service)
提供开发和部署环境,用户无需关心底层基础设施。
示例: Google App Engine、阿里云的应用托管服务。
-
软件即服务(SaaS, Software as a Service)
提供现成的应用程序,用户通过网络直接使用。
示例: Office 365、 Google Workspace、 Salesforce、百度云盘、 12306
应用场景
-
存储与备份:如个人照片存储(iCloud、 Google Drive)或企业数据备份(AWS S3)。
-
应用托管:开发者利用云平台部署应用程序,而无需管理底层资源。
-
大数据与人工智能:如使用云平台的计算能力分析海量数据或训练机器学习模型。
-
企业协作:如基于云的协作工具(Microsoft Teams、 Slack)。
-
内容分发:如通过云服务快速分发网站内容(CDN)。
云原生与云服务
云原生与云服务的关系密切但有显著区别,它们分别代表一种应用架构理念和一种技术提供模式,同时又相辅相成。
常见漏洞
-
身份与访问管理漏洞
-
过度授予权限的账户可能被恶意利用,访问敏感资源。
-
未加密存储的访问密钥或凭据被泄露,可能导致未授权访问。
-
缺乏多因子身份验证,使账户更容易受到密码泄露或暴力破解攻击。
-
-
数据存储安全漏洞
- 云存储服务(如 AWS S3、 Azure Blob)配置不当,导致敏感数据暴露给公众。
- 未对存储或传输中的数据进行加密,增加数据被截获或篡改的风险。
- 使用默认加密密钥或不定期更换密钥,导致密钥泄露后的数据安全风险增加。
-
网络安全漏洞
- 开放的端口、错误配置的防火墙或安全组导致服务暴露,容易受到攻击。
- 分布式拒绝服务攻击消耗云资源,导致服务中断或额外的费用。
- 云服务暴露的 API 存在身份验证不足或输入验证缺陷,导致敏感信息泄露或远程命令执行。
-
容器与微服务安全漏洞
- 使用的容器镜像中包含未修补的漏洞,可能被攻击者利用。
- 攻击者突破容器隔离,访问宿主机或其他容器的资源。
- 微服务之间的通信缺乏加密或认证,可能被中间人攻击截获或篡改。
-
配置和管理漏洞
- 安全组、防火墙规则配置错误,导致资源未加保护。
- 云服务或操作系统未及时更新补丁,存在已知漏洞。
- 缺乏日志记录或监控,导致难以及时发现和应对安全事件。
-
供应链漏洞
- 使用的开源组件或供应商服务中包含漏洞,成为攻击者的目标。
- 软件依赖未锁定版本或更新机制不严格,可能引入恶意依赖。
-
应用程序安全漏洞
- 应用程序中存在注入漏洞(如 SQL 注入、命令注入),可能被攻击者利用。
- 输入验证不足导致 XSS、 CSRF 等漏洞在云应用中被利用。
- 配置文件中硬编码敏感信息(如 API 密钥、数据库凭据)。
防范云计算漏洞的建议
-
最小权限原则:为用户、服务和资源分配最低必要权限,避免权限滥用。
-
加密数据:在存储和传输时对数据进行加密,保护敏感信息。
-
持续监控:启用云提供商的监控工具(如 AWS CloudTrail、 Azure Monitor),监控资源使用和访问。
-
定期审计:定期进行安全配置审查和漏洞扫描。
-
自动化工具:利用自动化工具(如 IaC 和安全编排工具)减少人为错误。
-
补丁管理:及时更新操作系统、容器镜像和云服务的安全补丁。
通过系统化的安全管理,可以显著减少云环境中的漏洞风险。
vps 和 ecs
云厂商一般会将一台物理服务器分割成多个虚拟机。 每个虚拟机都拥有独立的操作系统、资源(比如 CPU、内存、存储空间)和公网 IP 地址。然后对外出售,这样的虚拟机就是所谓的 VPS(Virtual Private Server,虚拟专用服务器)。
但传统 VPS 有个缺点,不支持用户自主升降级,它的资源是预先分配的,不易动态调整。如果给 VPS 加入自主升降级的功能,那它就成了 ECS(Elastic Compute Service,弹性计算服务)
docker 容器
ecs 之间,如果底层操作系统不同,部署应用的时候就会有各种环境问题。只打包软件和系统依赖库加配置,然后将这部分系统文件挂到 ecs 的操作系统下,利用一个叫 Namespace 的能力让它看起来就像是一个独立操作系统一样。再利用一个叫 Cgroup 的能力限制它能使用的计算资源。这就省掉了一层笨重的操作系统,同时还让软件轻松跑在各类操作系统上。这就是我们常说的 Docker 容器技术。
总的来说就是,物理服务器上跑 ecs,ecs 跑 Docker 容器。多个 Docker 容器共享一个 ecs 实例操作系统内核。
Kubernetes
Kubernetes,它是 G 家开源的神器,因为单词太长,所以我们习惯省略中间 8 个字母,简称 k8s
Kubernetes与Docker之间的关系可以说是相辅相成的。 Docker为Kubernetes提供了强大的容器运行时环境,而Kubernetes则为Docker容器提供了自动化管理和编排的能力。
它介于应用服务和服务器之间,能够通过策略,协调和管理多个应用服务,只需要一个 yaml 文件配置,定义应用的部署顺序等信息,就能自动部署应用到各个服务器上,还能让它们挂了自动重启,自动扩缩容。
架构原理
Kubernetes 会将我们的服务器划为两部分,一部分叫控制平面(control plane,以前叫master),另一部分叫工作节点,也就是 Node。控制平面负责控制和管理各个 Node,而 Node则负责实际运行各个应用服务。
控制平面:
-
API Server 组件:调用 k8s 的提供的 api 接口,操作服务资源。
-
Scheduler(调度器):看下哪台服务器 cpu 和内存资源充足,然后部署应用。
-
Controller Manager(控制器管理器):创建,关闭服务。
Node:
-
既可以是裸机服务器,也可以是虚拟机。负责实际运行各个应用服务。多个应用服务共享一台 Node 上的内存和 CPU 等计算资源。
-
每个应用服务都可以认为是一个 Container(容器) , 并且大多数时候,我们还会为应用服务搭配一个日志收集器 Container 或监控收集器 Container,多个 Container 共同组成一个一个 Pod,它运行在Node 上。
Cluster
控制平面和Node 共同构成了一个 Cluster,也就是集群。在公司里,我们一般会构建多个集群, 比如测试环境用一个集群,生产环境用另外一个集群。同时,为了将集群内部的服务暴露给外部用户使用,我们一般还会部署一个入口控制器,比如 Ingress 控制器(比如Nginx) ,它可以提供一个入口让外部用户访问集群内部服务。
kubectl
k8s 为我们准备了一个命令行工具 kubectl,我们只需要执行命令,它内部就会调用 k8s 的 API。
使用minikube搭建k8s集群
k8s安装
安装依赖:
apt-get update
apt install -y docker.io kubectl kubernetes-helm
安装Minikube;
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/
查看可支持的版本:
minikube config defaults kubernetes-version
启动集群(root权限启动需要加上 --force),第一次启动会下载镜像耗费时间比较长
minikube start --image-mirror-country=cn --force
(可能需要科学上网)
-
查看pods:
kubectl get pods --all-namespaces -
启动metrics
minikube addons enable metrics-server -
启动仪表盘
minikube dashboard --url -
配置对外端口
kubectl proxy --port=8088 --address='0.0.0.0' --accept-hosts='^.*' -
访问URL
http://192.168.153.136:8088/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ -
删除k8s集群
minikube delete
常见命令
-
获取 Kubernetes 服务器版本
kubectl version -
获取 Kubernetes 集群信息
kubectl cluster-info -
获取节点信息
kubectl get nodes -
获取当前命名空间中的 Pod 详细信息
kubectl get pods
要获取类似的其他资源信息,如服务、命名空间、部署、入口、机密等。此外,我们可以使用下面提到的速记表示法,而不是指定资源的全名
kubectl get svc
kubectl get ing
kubectl get ns
kubectl get deploy
kubectl get secrets
-
获取有关资源的更多详细信息
kubectl get pods -o wide -
具有描述性的资源信息
kubectl describe pod <PODNAME> -
在 Pod 容器中获取 shell
kubectl exec -it <PODNAME> -- sh -
使用命令行创建简单部署
kubectl run nginxdeployment --image=nginx -
使用内置命令将 Pod 端口从 Kubernetes 转发到本地
kubectl port-forward <PODNAME> 1234:80 -
获取 Pod/容器的日志
kubectl logs <PODNAME> kubectl logs -f <PODNAME> -
从集群中删除 Pod
kubectl delete pod <PODNAME> -
通过指定命名空间名称从其他命名空间获取资源 abc
kubectl get pods -n abc -
获取所有可用的 API 资源
kubectl api-resources -
模拟用户并获取验证和确认权限 kubectl
kubectl auth can-i create pods -
以 YAML 格式获取任何资源输出
kubectl get pod <POD NAME> -o yaml -
在同一命令中获取多个命令输出
kubectl get nodes,pods,svc
k8s-goat靶场
MITRE ATT&CK
MITRE ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge)是一个广泛使用的知识库,用于描述和分类网络攻击行为和技术。它由MITRE公司开发,是一个全面的框架,帮助组织理解和应对网络攻击。
kubernetes-goat
Kubernetes Goat 是一个交互式 Kubernetes 安全学习游乐场。它在设计场景中故意易受攻击,以展示Kubernetes 集群、容器和云原生环境中的常见错误配置、现实漏洞和安全问题。
Kubernetes Goat 有 20
多个场景,涵盖攻击、防御、最佳实践、工具等,包括:
- 代码库中敏感密钥
- Docker-in-Docker的漏洞利用
- Kubernetes (K8S) 中的 SSRF
- 容器逃逸到主系统
- Docker CIS 基准分析
- Kubernetes CIS 基准分析
- 攻击私有仓库
- NodePort 暴露的服务
- Helm v2 tiller 攻击集群(已废弃)
- 分析加密矿工容器
- Kubernetes 命名空间绕过
- 获取环境信息
- 拒绝服务(DoS)内存/CPU资源
- 黑客容器预览
- 隐藏在层中
- RBAC
- 最低特权配置错误
- KubeAudit - 审核Kubernetes集群
- Falco - 运行时安全监测和检测
- Popeye - Kubernetes
- 集群清理工具
- 使用 NSP 保护网络边界
安装
下载kubernetes-goat仓库
git clone https://github.com/madhuakula/kubernetes-goat.git --depth 1
进入kubernetes-goat目录
cd kubernetes-goat
修改 scenarios/internal-proxy/deployment.yaml 中CPU和内存值为300M。
spec:
selector:
matchLabels:
app: internal-proxy
template:
metadata:
labels:
app: internal-proxy
spec:
containers:
- name: internal-api
image: madhuakula/k8s-goat-internal-api
resources:
limits:
cpu: 300m
memory: 300Mi
requests:
cpu: 300m
memory: 300Mi
ports:
修改下面文件中映射的默认套接字
scenarios/health-check/deployment.yaml
/var/run/docker.sock
运行kubernetes-goat的K8S服务
bash setup-kubernetes-goat.sh
服务安装完毕大概要10分钟左右时间。启动完成,运行脚本,启动应用服务的端口转发。
bash access-kubernetes-goat.sh
可以用查看pod命令来看看是否启动成功:
访问1234端口,就可以看到全部的场景信息。
漏洞示例:dind逃逸
dind 场景的核心是容器挂载了宿主机的 Docker socket(/var/run/docker.sock)
访问 http://youip:1233,模拟进入一个配置为 privileged: true 的容器,这个容器拥有几乎所有的 Linux 能力,打破了容器的隔离机制。
打印当前系统的进程的 capabilities 状态。 capabilities 是指给予进程的特权,用于控制它可以执行哪些操作。
查看挂载信息:
可以看到一个 host-system 的挂载,像是直接挂载的宿主机分区。查看里面的内容:
将当前系统的根目录更改为 "/host-system"。这意味着系统将认为 "/host-system" 是根目录,并且所有的相对路径都是从 "/host-system" 开始的。执行 "chroot /host-system bash" 后,您将进入到一个以"/host-system" 为根目录的新环境,并且可以在其中运行 bash。
chroot /host-system bash
执行 docker ps
这里由于是minikube安装的k8s集群,因此逃逸后的主系统就类似是物理机!
如果是多节点集群, Kubernetes 节点配置可以在默认路径中找到,节点级别的 kubelet 使用它来与Kubernetes API 服务器通信。如果您可以使用此配置,您将获得与 Kubernetes 节点相同的权限。
-
查看kubeconfig文件, minikube的配置文件路径是 /var/lib/minikube/kubeconfig
cat /var/lib/kubelet/kubeconfig -
使用 kubelet 配置列出 Kubernetes 集群范围的资源
kubectl --kubeconfig /var/lib/kubelet/kubeconfig get all -n kube-system -
您可以通过运行以下命令来获取 Kubernetes 集群中的可用节点:
kubectl --kubeconfig /var/lib/kubelet/kubeconfig get nodes
总结:在特权容器内,攻击者可以轻松地挂载宿主机的根文件系统,或者通过 nsenter 等工具进入宿主机的命名空间,从而获得宿主机的 root 权限。
更多漏洞场景参考:
对象存储(OSS)
对象存储
对象存储中可以有多个桶(Bucket),然后把对象(Object)放在桶里,对象又包含了三个部分: Key、Data 和 Metadata。
Bucket
存储空间(Bucket)是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。
- 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。
- 每个用户可以拥有多个存储空间。
- 存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。
- 存储空间内部的对象数目没有限制。
Object
对象(Object)是 OSS 存储数据的基本单元,也被称为 OSS 的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的 Key 来标识。
- Key 是指存储桶中的唯一标识符,例如一个 URL 为: geekby.oss-cnbeijing.aliyuncs.com/MarkDown/20…
- 对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。
- Data 就是存储的数据本体。
对象存储的利用方式
Object 遍历
在创建 Bucket 时,可以选择是否公开,默认是 private 的权限,如果在错误的配置下,给了 Listobject 权限,就会导致可遍历存储桶。
-
案例:
默认创建是阻止公共访问的,开启后会处于有风险状态。
如果设置 ListObject 操作,会有信息泄露漏洞:
key信息会泄露出来,拼接在url后面就可以访问。
Bucket 桶爆破(二级域名爆破)
当不知道 Bucket 名称的时候,可以通过爆破获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断。
- AccessDenied:存在存储桶,但无权限访问
在 fofa 直接搜 body="oss-cn-beijing.aliyuncs.com" ,就可以探测有没有该桶:
- NoSuchBucket:表示不存在这个存储桶
特定的 Bucket 策略配置
特定的策略配置的指的是,如果管理员设置了某些 IP, UA 才可以请求该存储桶的话,此时如果错误的配置了 GetBucketPolicy ,可导致攻击者获取策略配置。
这个策略是 允许任何人(*)对这个 OSS 桶执行所有操作(oss:*),属于公开读写 + 完全控制
任意文件上传与覆盖
如果在配置存储桶时,管理员错误的将存储桶权限,配置为可写,这将会导致攻击者可上传任意文件到存储桶中,或覆盖已经存在的文件
如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。
Bucket 接管
假设管理员通过域名解析并绑定了一个存储桶,但是管理员将存储桶删除后,没有将域名解析的 CNAME删除,这时会访问域名就会出现 NoSuchBucket。因此可以登录自己的阿里云账号,创建同样的Bucket 即可。
Bucket 覆写
如果拥有 Bucket Policy 的编辑权限,可以通过上传或修改一个新的配置,进而实现攻击(拒绝服务或者修改访问策略)
devsecops
随着越来越多的组织采用 DevOps 方法,自动执行和集成软件开发团队和 IT 团队之间的流程,传统的安全工具往往已不再够用。如今,开发人员需要将安全措施嵌入到开发工作流的每个阶段。 当涉及到 DevOps 工作流的安全性时,这种实践就称为 DevSecOps。
DevSecOps
DevSecOps 是一种将安全性集成到持续集成、 持续交付和持续部署管道中的实践。通过将 DevOps 价值观整合到软件安全中,安全性验证成为开发过程中的一个活动的集成部分。
DevSecOps 与 DevOps 很相似,它是一种将项目管理工作流与自动化 IT 工具相结合的组织和技术方法。 DevSecOps 可将主动的安全审计和安全测试集成到敏捷开发和 DevOps 工作流中,以便将安全性内置于产品中,而不是应用于成品中。
DevSecOps 如何工作
通常, DevOps 管道涉及多个步骤。 DevSecOps 通过确保每个阶段的严格安全标准从传统方法中脱颖而出软件开发生命周期 (SDLC)过程的主要阶段包括规划、编码、构建、测试、发布和部署。
- 计划:在计划阶段,执行主要的安全分析。工程师制定适当的测试策略,用于确定测试的方式、地点和时间。
- 代码:在编码步骤中使用各种类型的 Git 控件和工具来保护敏感信息,例如应用程序编程接口 (API) 密钥和密码。
- 构建:编写和执行用于构建源代码的代码至关重要。在这里,静态应用程序安全测试 (SAST) 技术被广泛用于使代码无错误。
- 测试:在测试阶段,动态应用程序安全测试(DAST)工具主要用于测试产品/应用程序,保护用户身份验证,并识别 SQL 注入和 API 端点中可能存在的问题。
- 发布:发布阶段是指在渗透测试和漏洞扫描过程中执行的安全分析。
- 部署:部署阶段是在生产中实施适当的安全协议,为最终部署做好准备
DevSecOps常用工具解析
SAST(静态应用安全测试)
静态应用程序安全测试(SAST)通常在编码阶段分析软件源代码或二进制文件的语法、结构、过程、接口中存在的安全漏洞,是公司在软件开发生命周期的早期阶段进行的一种白盒安全测试。 SAST通常会在不同的时间间隔或需要添加或更改代码库时重新运行。
作为DevSecOps产品,为自动化量身定制的SAST工具会逐行筛查代码以识别已知漏洞和薄弱环节。自动化SAST工具的主要缺点之一是误报,而且该工具的智能化程度不足以分析处于早期阶段且无法编译的代码。通过人工智能技术可以大大减少SAST工具的误报事件。
SCA(软件组成分析)
软件成分分析(SCA)技术用于检测软件中的开源组件是否带有已知的安全漏洞或功能漏洞,或需要恰当授权许可的商业软件或第三方产品。
DAST(动态应用安全测试)
SAST从内部查看源代码,而动态应用程序安全测试(DAST)则从外部分析软件的安全性。作为一种黑盒安全测试工具, DAST可识别整个企业基础架构中的网络、系统和操作系统漏洞。
DAST的主要缺点是测试难以覆盖整个攻击面,从而导致一些漏洞被遗漏。
IAST(交互式应用安全测试)
IAST(Interactive Application Security Testing)工具结合了静态应用安全测试(SAST)和动态应用安全测试(DAST)的优势,通过在应用程序运行时进行安全分析,实时检测并报告安全漏洞。 IAST工具通常通过代理或传感器与应用程序集成,监控应用程序的运行状态,分析代码执行路径,提供更加深入和精确的安全分析。
nuclei工具的使用和poc编写
Nuclei使用零误报的poc向目标发送请求,同时可以对主机进行批量快速扫描。 Nuclei提供TCP、 DNS、HTTP、 FILE等各类协议的扫描,通过强大且灵活的poc,可以使用Nuclei模拟各种安全检查。
IAST工具的工作原理
- 代码注入: IAST工具通常通过在应用程序中注入代理或传感器,在应用程序运行时监控和分析其行为。
- 实时监控:在应用程序运行过程中, IAST
- 工具实时监控其数据流和控制流,检测安全漏洞。
- 混合分析:结合SAST的静态代码分析和DAST的动态行为分析,提供更全面的漏洞检测。
- 详细报告: IAST工具生成详细的漏洞报告,包括漏洞所在的具体代码行、漏洞类型及修复建议。
安装
建议直接根据自己系统情况,下载二进制文件使用
模板仓库地址
快速使用
-
升级
nuclei -up # 升级引擎 nuclei -ut # 升级模板 -
下载官方模板
使用如下命令会在当前目录下生成templates目录, templates目录中包含全部的官方模板
nuclei -ud templates
-
指定模板和目标
nuclei -t test.yaml -u http://exam.com -
批量扫描
nuclei -t test.yaml -l target.txt -
指定代理
nuclei -t test.yaml -u http://exam.com -p socks5://127.0.0.1:7890 -
查看扫描进度
nuclei -t test.yaml -l target.txt -stats -
Debug,查看发送数据包和返回包
nuclei -t test.yaml -u http://exam.com -debug -
加载指定目录的模板进行扫描
nuclei -u https://www.magedu.com/ -t http\vulnerabilities\wordpress\ -
使用 tags 参数删选指定目录下的模板
nuclei -u https://www.magedu.com/ -t http\vulnerabilities\wordpress\ -tags analytify
nuclei -h 这将显示Nuclei的帮助,以下是所有支持的命令。
扫描示例:
AI 辅助 Nuclei PoC(模板) 编写
先把存在漏洞的发包信息复制下来,让AI识别并编写poc。
测试结果: