NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

深入浅出云原生环境信息收集技术(一)

  • 2022-03-09
  • 本文字数:3558 字

    阅读完需:约 12 分钟

深入浅出云原生环境信息收集技术(一)

一、前言


信息收集在攻击和防御两端都是非常重要的一环。从宏观的角度来说,大多数信息相关的工作都可以看作信息收集和信息处理交替进行的循环。优质的信息收集成果是后续工作顺利展开的首要条件。《孙子兵法》有云:故善战人之势,如转圆石于千仞之山者,势也。在掌握了充足信息后,攻防工作将“如转圆石于千仞之山”。


然而,信息的琐碎性和云原生本身的复杂组成为云原生环境下的信息收集工作带来了一定挑战。有些朋友也许会说,这有何难?比如,执行 uname -a 命令,就能收集到内核信息了。没错,信息收集确实是一步步进行、一项项完成的。但是,如果只是想当然地进行,收集到的信息难免陷于凌乱琐碎,也很可能不全面。


对此,笔者结合在攻、防两端积累的经验,希望与大家探讨四个问题:

1. 站在攻击者视角,云原生环境下的信息收集方式有哪些?

2. 站在攻击者视角,云原生环境下的信息分类维度有哪些?

3. 站在攻击者视角,收集到的云原生环境信息有什么价值?

4. 站在攻击者视角,有没有可能阻碍或影响防守者收集信息?


就“信息收集”这个话题而言,毫无疑问,防守者是占尽天时地利的,无论是能够收集到的信息种类、规模,还是信息收集开始的时间、收集信息所需的权限,都远远在攻击者之上。防守者更需要关注的是如何使用、分析收集到的信息。因此,我们从攻击者的角度出发进行探讨。这并不意味着防守的同学不需要关注。相反,只有对攻击者的技术了然于胸,才能更好地识别攻击行为、判定攻击意图。


作为本系列的第一篇文章,本文将展开讨论第一个问题。

二、站在攻击者视角,云原生环境下的收集信息方式有哪些?


注:文中案例相关操作均在实验环境中进行,相关技术仅供研究交流,请勿应用于未授权的渗透测试。站在攻击者视角,云原生环境下的信息收集方式有哪些?


思路重在“有章可循”。先有一个点,再进行发散。信息收集方式通常与攻击场景紧密相关。在云原生环境下,攻击场景通常有三种:


  1. 攻击从远程发起。远程发起的攻击十分常见,例如,通过存在未授权访问漏洞的 KubernetesAPI Server 或 DockerDaemon 执行命令。

  2. 攻击从容器内发起。容器内发起的攻击通常属于一次渗透测试的后渗透阶段——它的前提是获得了容器内某种权限的 Shell,或者是 Containeras a Service(后文简称 CaaS)的场景——攻击者本身就是容器服务的“客户”。

  3. 依托于镜像的软件供应链攻击。包括“镜像漏洞利用”和“镜像投毒”等,《云原生安全:攻防实践与体系构建》第三章对此进行了详细介绍。

相应地,信息收集方式主要也有这三种,与攻击场景相伴而生。让我们来一起看一下。

1.通过远程交互收集信息

综合来看,云原生环境中开放的远程服务主要有两类:云原生控制面服务和容器化业务服务。远程交互,顾名思义,网络可达就行,别无限制。收集到的信息数量和价值主要取决于目标的访问控制机制。


(1)从云原生控制面服务收集信息


如前所述,如果遇到存在未授权访问漏洞的 Kubernetes API Server,不费吹灰之力即可控制整个云原生集群;如果目标设置了合理的访问控制机制,则获取到的有价值信息将大大减少,但也并非毫无所得。例如,许多 Kubernetes API Server 允许匿名用户访问部分 API endpoints。在下面的示例中,攻击者通过访问/version,获得了目标 Kubernetes 的版本号:

rambo@t-matrix:~$ curl -k https://1.1.1.1:6443/version{ "major": "1", "minor": "16", "gitVersion": "v1.16.2", "gitCommit": "c97fe5036ef3df2967d086711e6c0c405941e14b", "gitTreeState": "clean", "buildDate": "2019-10-15T19:09:08Z", "goVersion": "go1.12.10", "compiler": "gc", "platform": "linux/amd64"}
复制代码

通过版本匹配,攻击者能够判断目标 Kubernetes 可能存在哪些漏洞,从而进一步利用,这便是版本信息的价值。


即使目标设置了非常严格的访问控制,攻击者通常也能够获得一些信息。例如,即使访问/version 失败,根据失败信息我们能够得知目标是一个 Kubernetes 集群,从而利用 Kubernetes 的背景知识,去探测其他 Kubernetes 控制面服务端口(如 kubelet、etcd 等)。


(2)从容器化业务服务收集信息


大多数情况下,就信息收集而言,容器化与非容器化业务服务没有显著不同之处,收集到的信息均与业务服务(如 Web 服务、数据库服务等)本身强相关。关于这些信息的收集方法,安全社区已经有很多总结,本文不再展开讲述。


然而,许多业务在云原生化的过程中,其自身架构或部署形态也会发生变化,引入微服务治理(如服务网格)、API 治理(如 API 网关)的特征。这些特征有时是有价值的信息,提供了承载业务的云原生环境的一些线索,同样值得收集。例如,如果我们发现与服务交互的 HTTP 返回头中包含了 x-envoy-开头的项,可以推测该服务处于一个由 Istio/Envoy 进行服务网格管理的云原生环境中。其中,x-envoy-peer-metadata-id 更是包含了服务所在的 Pod、Pod 的内部 IP 和 Kubernetes 命名空间等重要信息[1]:

rambo@t-matrix:~$ curl -k https://1.1.1.1 -vv 2>&1 | grepx-envoy-peer-metadata-id< x-envoy-peer-metadata-id:sidecar~2.2.2.2~PodName.Namespace~Namespace.svc.cluster.local
复制代码


事实上,网络空间测绘的关键步骤之一就是通过远程交互收集信息。我们通过测绘发现,Istio、Envoy 和 Kong 等云原生治理程序都会给被治理的业务服务添加一个或多个特征,这些特征对于探索业务网络拓扑具有积极意义。

2.容器内收集信息


多见于针对云原生环境渗透测试的后渗透阶段,例如,攻击者事先通过 Web 服务文件上传漏洞上传了一个 Webshell。除此之外,云服务商提供的 CaaS 也允许攻击者作为用户直接创建并访问容器。


(1)容器内通过本地操作收集信息


虽然起点不同,但这两个场景中攻击者的目的是类似的:突破容器到宿主机或其他容器。不过,两个场景下攻击者拥有的初始权限可能不同。随着人们安全意识的增强,许多容器化业务已经采用 Rootless Container 部署,业务进程本身以低权限用户(如 www-data)运行,这通常也是攻击者获得的 Webshell 的权限;然而,作为 CaaS 的用户,攻击者通常可以拥有容器内 root 权限。与前文介绍的访问控制机制类似,容器内权限大小对于容器内信息收集也有影响。但是,本文并不单独讨论权限问题给信息收集工作带来的影响,而是倡导一种“因地制宜”的随机应变能力。


“在容器内收集信息”或许是不少朋友看到本文标题后想到的第一个场景。没错,从容器内部能够收集到当前环境的大量信息。《容器逃逸技术概览》[2]中曾介绍过的通过判定/.dockerenv 文件是否存在来推断是否处于 Docker 创建的容器环境等手法,就是典型的容器内信息收集。


(2)容器内通过网络交互收集信息


与前文介绍的远程交互方式相比,容器内的网络交互对于攻击者来说具有独特优势。因此,我们将这部分内容放在这里,强调“容器内”,而不是在前面一起介绍。这种优势主要有两个方面:


  1. 访问内部网络。容器拥有云原生集群的内部 IP,默认配置下还会有 CAP_NET_RAW 权限,攻击者可以通过网络扫描等方式摸清集群内部网络拓扑,发现有价值的服务,某些场景下甚至能够访问到节点主机的元数据服务。这种网络可达的优势是值得重视的,外部攻击者通常需要借助 SSRF 等手段才能达到相同的目的。

  2. 获得一定权限。云原生集群的容器内可能会有某种形式的访问凭证,如 Pod 携带的 ServiceAccount token 等。利用此 token 可以向 Kubernetes API Server 发起访问,纵使权限很小,至少不再是“匿名访问”,能够访问/version 获得版本信息。

3.基于镜像收集信息


近年来,软件供应链安全事件频发,人们的重视程度也日渐提高。容器从镜像创建而来,就像进程从程序创建而来一样。因此,依托于镜像,攻击者能够收集到许多有价值的信息,方式主要有两种:


  1. 利用镜像和镜像仓库收集信息。有时,攻击者在容器中的权限是有限的,无法读写关键文件及其元数据。如果能够获取到目标环境使用的镜像甚至找到其公开的镜像仓库,就能够分析其镜像组件的脆弱性,找到突破口。


  1. 利用特殊镜像收集运行时环境信息。由于 runC 等容器运行时的设计问题,攻击者能够通过在目标环境部署特殊镜像来获取环境中的容器运行时二进制程序文件,进而获得版本信息,发现潜在脆弱性。《容器运行时信息收集技术介绍》[3]一文对该技术进行了详细介绍。

三、总结


本文是“深入浅出云原生环境信息收集技术”系列的开篇,帮助大家梳理了云原生环境下常见的信息收集方式。有了这些知识作为基础,我们就能够逐渐展开讨论如何在云原生环境下体系化地收集琐碎复杂的信息。以攻促防,知攻知防。一起来守护云原生安全。


后续文章更加精彩,敬请期待。


参考文献

1. https://github.com/neargle/slidefiles/blob/main/2020%20CIS%20-%20Attack%20in%20a%20Service%20Mesh%20-%20Public.pptx.pdf

2. https://mp.weixin.qq.com/s/_GwGS0cVRmuWEetwMesauQ

3. https://mp.weixin.qq.com/s/kY4GAoTW99NbJa4dgnPuzg


作者简介:

阮博男,绿盟科技星云实验室安全研究员。

2022-03-09 19:342938

评论

发布
暂无评论
发现更多内容

实时音频抗弱网技术揭秘

百度开发者中心

最佳实践 经验分享 智能视频

怒肝 Linux 学习路线,这回不难

程序员鱼皮

Linux 编程 后端 开发 java

区块链通证经济和传统经济的区别,如何实现

CECBC

双非本科猛斩6个offer,秘籍公开!

Java 程序员 架构 面试 后端

4年CRUD小职员,五面阿里艰苦经历(定薪45K),回馈一波心得体会

收到请回复

Java 程序员 面试 后端 面经

[架构实战营]模块九作业

xyu

#架构实战营

RUOYI 框架教程 16|关于若依RuoYi.jar卡顿,僵死,假死,系统无反映解决方案

Java_若依框架教程

技术 Ruoyi 开发 框架 若依

ShardingSphere X Google 编程之夏:同学,开源你怎么看?

SphereEx

开源社区 ShardingSphere 谷歌 编程之夏

解读业界5种主流的深度网络模型

华为云开发者联盟

模型 网络模型 模型优化 模型量化 深度网络

总结出这份学习笔记,帮助朋友成功跳槽!六年阿里工作,苦熬到 P7经验分享!

Java 程序员 架构 后端 工程师

Python代码阅读(第35篇):完全(深度)展开嵌套列表

Felix

Python 编程 Code Programing 阅读代码

RUOYI 框架教程 15|若依框架中 Mysql 操作 | 日期处理

Java_若依框架教程

Java 技术 Ruoyi 框架 若依

Docgeni 1.1.0 正式发布!

PingCode研发中心

标签 Docgeni 文档目录 进度展示 日志展示

The Data Way Vol.5|这里有一场资本与开源的 battle

SphereEx

开源 播客 ShardingSphere SphereEx

明道云当选“中国电子商会数据资源服务创新专业委员会”理事单位

明道云

OpenCV学习(三):三重境界

轻口味

OpenCV图像处理 10月月更

2021金九银十Java面试经历:腾讯5面(已拿offer)

Java 编程 程序员 架构 面试

AUTOSAR基础篇之OS(上)

SOA开发者

车云一体的应用价值

SOA开发者

10月活动推荐:2021上汽集团“新四化”技术高峰论坛

SOA开发者

MongoDB中文社区 Freetalk,一起来玩快闪!

MongoDB中文社区

mongodb

gitee上提交PR和issue流程和注意事项

Geek_6cdeb6

机器学习 深度学习 git

观测云产品更新|新增主机网络性能监测、图表矩形树图、多监测关联查询等功能

观测云

功能更新

区块链通证经济的意义

CECBC

没想到!阿里技术大佬独家收藏的pring全家桶小册,竟被我意外发现!

Java 架构 面试 程序人生 编程语言

一个约定让全球数万AI爱好者相聚,它是如何做到的?

硬科技星球

声网 2020 实时大会后的弱网对抗实践

声网

音视频 网络环境 视频编解码 弱网下的极限实时视频通信

基于HarmonyOS分布式技术,他们让绘画体验更为出色

Geek_283163

鸿蒙

Rtmp Message 与 Chunk格式

webrtc developer

RTMP

为了让你搞定数据库选型,这些工程师重写了 26 万行代码

SphereEx

数据库 架构 架构设计 ShardingSphere SphereEx

嵌入式软件时序(1)— C语言是怎么编译出来的

SOA开发者

深入浅出云原生环境信息收集技术(一)_服务革新_阮博男_InfoQ精选文章