Kubernetes Goat 场景 12 实战:通过容器环境变量获取 Kubernetes Secret 注入的敏感凭据

发布时间:2026/9/17 19:30:29

Kubernetes Goat 场景 12 实战:通过容器环境变量获取 Kubernetes Secret 注入的敏感凭据 Kubernetes Goat 场景 12 实战:通过容器环境变量获取 Kubernetes Secret 注入的敏感凭据【免费下载链接】kubernetes-goatKubernetes Goat is a Vulnerable by Design cluster environment to learn and practice Kubernetes security using an interactive hands-on playground 项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-goat本文围绕 Kubernetes Goat一个设计上就脆弱的 Kubernetes 靶场中的场景 12「Gaining environment information获取环境信息」展开。你将学会从一个容器内的 Web 终端出发用cat /proc/self/cgroup、cat /etc/hosts、mount、printenv等标准 Linux 手段完成一次完整的信息枚举最终定位到通过secretKeyRef注入容器环境变量的 Kubernetes Secret 凭据vault key并从源码与清单层面理解把密钥放环境变量这一常见反模式的风险本质。场景背景与目标在真实的生产环境中绝大多数计算实例在运行应用时都会把敏感信息secrets、API keys、配置值等存放在环境变量里。Kubernetes 场景 12 正是模拟了这种典型做法团队把 Kubernetes Secret本例中是一把 vault 的 API key以环境变量的形式注入 Pod。文档给出的背景判断是——如果攻击者找到应用漏洞如 RCE 远程代码执行或命令注入那么这些密钥基本宣告失守。场景的核心设定如下对应 场景 12 指南文档 与 集群内置引导页故事线Kubernetes 中的每个环境都有大量信息可被分享——secrets、API keys、configs、services 等任务就是找到那把 vault key。目标Goal拿到k8s_goat_flag的 flag 值即完成场景且文档明确提示这可以通过多种方式达成。提示Hint如果不知道环境变量存在哪里回到标准 Linux 工具比如env。完成后的收获1如何探索并分析容器环境变量2如何获取容器内的敏感信息。入口启动靶场后访问http://127.0.0.1:1233。场景环境架构:127.0.0.1:1233 背后是什么读懂场景的前提是弄清楚http://127.0.0.1:1233到底指向哪个工作负载、flag 又藏在哪里。从仓库源码可以确认以下链路1. 端口 1233 由访问脚本转发到 system-monitor Pod。在 access-kubernetes-goat.sh 中脚本通过kubectl get pods -l appsystem-monitor找到 Pod并执行kubectl port-forward $POD_NAME --address 0.0.0.0 1233:8080也就是说本地 1233 端口最终打到 Pod 内的 8080 端口。2. 8080 端口是一个免密 Web Shell。infrastructure/system-monitor/Dockerfile 基于ubuntu:noble安装了htop、curl等工具并下载 gotty一个把终端共享到浏览器的工具容器入口为EXPOSE 8080 CMD [ gotty, -w, bash ]gotty -w bash会在 8080 端口起一个 Web 页面任何人打开页面就能获得一个交互式 bash——这正是场景 12 的入口。它模拟的是攻击者已经拿到容器内执行权例如通过 RCE之后的视角。3. flag 的来源:secretKeyRef 注入的环境变量。在 scenarios/system-monitor/deployment.yaml 中定义了 SecretapiVersion: v1 kind: Secret metadata: name: goatvault namespace: default type: Opaque data: k8sgoatvaultkey: azhzLWdvYXQtY2QyZGEyNzIyNDU5MWRhMmI0OGVmODM4MjZhOGE2YzMDeployment 通过valueFrom.secretKeyRef把它注入容器env: - name: K8S_GOAT_VAULT_KEY valueFrom: secretKeyRef: name: goatvault key: k8sgoatvaultkey见 deployment.yaml 第 47-52 行对清单中的 base64 值解码即可验证 flagecho azhzLWdvYXQtY2QyZGEyNzIyNDU5MWRhMmI0OGVmODM4MjZhOGE2YzM | base64 -d # 输出: k8s-goat-cd2da27224591da2b48ef83826a86c3这串k8s-goat-cd2da27224591da2b48ef83826a86c3就是本场景要你在容器内找到的 vault key 值。4. 顺带一提的额外风险面。从源码结构看同一个 system-monitor Pod 还声明了hostPID: true、hostIPC: true、privileged: true并把宿主机根目录hostPath: /挂载到/host-system见 deployment.yaml 第 25-46 行。这些配置服务于仓库中后续的容器逃逸相关场景在场景 12 里你不需要用到它们但这也提醒读者真实环境中一个既暴露了 Web Shell、又带有特权容器配置的 Pod风险是叠加的。如何把环境跑起来使用仓库根目录的 setup-kubernetes-goat.sh 部署所有场景清单其中 第 85 行 部署了scenarios/system-monitor/deployment.yaml再运行 access-kubernetes-goat.sh 建立本地端口转发然后浏览器访问http://127.0.0.1:1233即可进入 Web 终端访问http://127.0.0.1:1234则是集群内的 Kubernetes Goat 主页goat-home本场景的任务说明页由 infrastructure/goat-home/home/content/scenario-12.md 渲染。实战演练:容器内信息枚举Method 1进入 Web Shell 后场景指南给出的方法是把容器探索一遍。以下命令与 场景 12 指南 中的 Solution Walkthrough 一一对应。1. 确认自己是否在容器里:cat /proc/self/cgroupcat /proc/self/cgroup输出中的 cgroup 层级路径docker/containerd 风格的层级与容器 ID能直接暴露容器运行时信息帮助判断隔离边界。2. 查看容器主机的基础信息cat /etc/hosts/etc/hosts会显示 Pod 的容器 ID、主机名与网络配置是确认我正处在一个被编排过的环境里的常用手段。3. 查看挂载信息mountmount输出可以揭示容器看到了哪些文件系统挂载对于 system-monitor 这类把宿主机根目录挂进来的 Pod这里的信息量尤其大也印证了清单中的hostPath配置。4. 探索文件系统ls -la /home/逐步翻看目录结构了解容器内有哪些账号、文件与工具判断还有哪些入口点。5. 关键一击:printenv列出全部环境变量printenv这是场景 12 的核心命令。printenv会输出当前进程的全部环境变量其中就包含 Deployment 通过secretKeyRef注入的K8S_GOAT_VAULT_KEY——也就是那把 vault keyflag 值k8s-goat-cd2da27224591da2b48ef83826a86c3。除此之外Kubernetes 还会自动注入一批环境变量服务发现变量、KUBERNETES_SERVICE_HOST/KUBERNETES_SERVICE_PORT等 API Server 地址等这些同样是攻击者做横向移动的线索。拿到该值即完成场景。文档提示可以以多种方式找到它从仓库证据可以印证其中两种其一就是上面的容器内枚举其二是不进容器、直接从集群侧读取——kubectl get secret goatvault并对 base64 值解码结果与容器内看到的一致。这恰恰说明当凭据的读取权限容器内进程或集群 API 权限被突破后注入方式本身并不提供额外保护。为什么环境变量是弱防线:风险分析与加固建议场景 12 的价值在于演示了一条非常短的攻击链能执行任意命令 能读到全部环境变量 能拿到密钥。从本仓库的实现看其根因可以归纳为几点环境变量对容器内任何进程可见。主进程、它 fork 出的任何子进程、乃至通过/proc/1/environ这类内核接口都可以读到同一份环境变量。一个无密码的 gotty Web Shell 足以演示这一点——场景中甚至没有 RCE拿到 shell这一步被靶场直接送给了玩家。secretKeyRef 只保护清单里的值不保护运行时的值。使用secretKeyRef时kubectl get pod -o yaml不会显示密钥明文但任何已执行进容器的进程都能直接printenv拿到明文Pod 清单层面的隐藏因此形同虚设。凭据生命周期与注入方式错配。环境变量在容器创建时一次性注入、进程存活期间常驻内存无法按次读取、无法细粒度授权、也无法在进程间共享之外被其他进程看见。对应的加固方向与本场景的风险点逐条对应避免把长期有效的 API key 放进环境变量优先使用以文件形式挂载的 Secret Volume可控制文件权限或改用外部密钥管理系统按需注入。场景 12 指南的 References 即指向了 Kubernetes Secrets 概念与 Vault Agent 以 sidecar 方式注入密钥的模式——后者正是短时效、按需获取的典型代表。收紧能进入容器的一切入口无认证的 Web 终端、调试 sidecar、宽松的exec权限都会把环境变量直接暴露给攻击者RBAC 应按最小权限授予本仓库另有场景演示了服务账号被赋予过宽权限导致 Secret 可被 API 读取的情形可对照 scenarios/hunger-check/deployment.yaml 中的secret-readerRole 理解权限模型。消除叠加风险面本例 Pod 同时带有privileged: true与宿主机根目录挂载环境变量泄漏只是第一层损失对监控类负载应使用只读根文件系统、非特权容器与最小化命名空间挂载。关键文件索引内容仓库相对路径场景 12 指南Overview/Goal/Hints/Solution Walkthroughguide/docs/scenarios/scenario-12/scenario-12.md集群内置场景说明页1234 主页展示的任务文案infrastructure/goat-home/home/content/scenario-12.md场景清单Secret goatvault secretKeyRef 环境变量注入scenarios/system-monitor/deployment.yamlWeb Shell 镜像gotty -w bashEXPOSE 8080infrastructure/system-monitor/Dockerfile部署脚本第 85 行部署 system-monitorsetup-kubernetes-goat.sh端口转发脚本1233:8080 指向 system-monitor Podaccess-kubernetes-goat.sh适用前提说明以上所有步骤与端口映射以当前仓库的脚本与清单为准本地 1233 端口转发依赖access-kubernetes-goat.sh先于浏览访问运行flag 值取自当前清单中的 base64 数据。靶场环境仅应在隔离的实验集群中部署请勿将其中任何脆弱配置带入生产。【免费下载链接】kubernetes-goatKubernetes Goat is a Vulnerable by Design cluster environment to learn and practice Kubernetes security using an interactive hands-on playground 项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-goat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/17 19:25:29

Folo信息整理神器:告别碎片化阅读的必备工具

Folo信息整理神器:告别碎片化阅读的必备工具 你是否每天被各种APP推送轰炸?是否感觉有价值的信息都被淹没在噪音中?Folo作为新一代信息浏览器,正是为解决这些问题而生。它能够将各类内容整合到一个清晰的时间线中,让你…

2026/9/17 20:30:34

城市智慧排水信息化管控平台建设:从感知接入到内涝预警联动

简介:这份PPT资源面向城市水务管理、市政信息化建设及智慧城市解决方案从业人员,围绕城市智慧排水信息化管控平台的建设方案展开。内容涵盖平台建设目标与意义、核心技术选型、主要功能设计与实施路径等模块,可帮助读者理解如何借助物联网、3…

2026/9/17 20:25:34

深入理解fork与execve:进程创建的核心机制与实战避坑

搞Linux或者macOS系统编程的人,大概没人不认识fork()。可要问到fork之后怎么把进程变成另一个程序,很多人就开始含糊了,只会说“再调用exec呗”。其实这正是问题的关键:fork()和execve()从来不是两个孤立的概念,它们是…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/17 0:03:13

WiFi密码安全测试:从原理到实战的字典暴力破解指南

1. 写在前面:我为什么要研究WiFi密码这件事先交代一下背景。我身边有不少朋友,家里的WiFi密码常年是"12345678"或者"88888888",问就是"好记"。直到有一次,隔壁邻居蹭网蹭到我家路由器后台都进不去&…

2026/9/17 0:03:13

redis-py服务控制与监控函数实战:从ping到slowlog的巡检指南

我用 redis-py 写了快五年的业务代码,坦白说,真正让我觉得这个客户端“像一个成熟工具箱”的,不是 get/set 那套基本操作,而是它那批专门做服务控制与状态监控的辅助函数。日常开发里,大家把redis.Redis(host..., deco…

2026/9/17 0:03:13

SpringBoot+Vue3实现中小企业设备管理系统开发实践

1. 项目概述与核心价值中小企业设备管理系统是制造业、服务业等领域的基础信息化工具。传统设备管理往往依赖Excel表格或纸质记录,存在数据孤岛、流程混乱、维护成本高等痛点。这套基于Java SpringBootVue3MyBatis的技术方案,通过前后端分离架构实现了设…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码