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

发布时间:2026/11/5 20:06:47

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/11/4 23:44:37

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

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

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

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

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