boostsecurityio/smokedmeat

GitHub: boostsecurityio/smokedmeat

一个 CI/CD 红队框架,用于演示和验证构建流水线中的供应链攻击路径与安全风险。

Stars: 61 | Forks: 5

# SmokedMeat [![License: AGPL v3](https://img.shields.io/badge/License-AGPLv3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) **CI/CD 红队框架** *来自 [BoostSecurity Labs](https://labs.boostsecurity.io) 的 [poutine](https://github.com/boostsecurityio/poutine) 构建流水线 SAST 扫描器的创造者。* ![SmokedMeat quickstart demo](https://vhs.charm.sh/vhs-5J9lw1pcFCtE51X6EiaeWM.gif) ## 什么是 SmokedMeat? SmokedMeat 是一个用于 CI/CD 管道的后利用框架。将其指向一个 GitHub 组织,让它找到易受攻击的工作流,部署一个植入程序到被破坏的运行器上,然后横向移动到云提供商、提取密钥并映射影响范围——所有操作都通过终端 UI 完成。 **它的功能:** 1. **分析** - 扫描组织的 GitHub Actions 工作流,查找注入漏洞、危险的触发器和不安全的检出模式(由 [poutine](https://github.com/boostsecurityio/poutine) 提供支持) 2. **利用** - 通过 PR、问题、评论或工作流调度部署一个启动程序。当易受攻击的工作流运行时,它会下载并在 CI 运行器上执行植入程序。 3. **后利用** - 从运行器内存中提取密钥,枚举 GitHub 令牌权限,扫描私钥并收集战利品 4. **横向移动** - 使用捕获的凭据进行横向移动:发现私有仓库、铸造 GitHub App 令牌、交换 OIDC 令牌以获取 AWS/GCP/Azure 访问权限、探测 SSH 部署密钥 **理念:** 大胆且喧闹。这不是一个 EDR 规避工具。这是一个演示框架,用于展示 CI/CD 妥协在触发任何警报之前能深入到什么程度。 **适用对象:** - 在企业环境中验证 CI/CD 安全态势的红队 - 向利益相关者演示供应链攻击路径的渗透测试人员 - 测试流水线攻击检测和响应的安全工程师 - 开发新 CI/CD 漏洞利用技术的研究人员 - 探索供应链攻击面的漏洞赏金猎人 ## 快速开始 要首次尝试 SmokedMeat,请安装 Docker 和 `make`。Go 不是必需的。 ``` git clone https://github.com/boostsecurityio/smokedmeat.git cd smokedmeat make quickstart ``` `make quickstart` 是推荐的首次运行方式。它会在本地启动稳定的快速启动堆栈,并针对本地 C2 团队服务器(`Kitchen`)启动操作员 TUI(`Counter`)。 推荐首次运行: - 目标:`whooli` - 令牌:具有 `public_repo` 权限的经典 PAT ⚠ 建议使用经典 PAT。细粒度的 PAT 可能过于严格,可能会阻止测试其他组织(包括 `whooli`)中的公共目标。 `whooli` 是 SmokedMeat 精心设计的 CI/CD 攻击沙箱。它是公共路径的推荐第一个目标。 设置向导将引导你完成以下操作: 1. **GitHub PAT** - 输入你的令牌。对于私有仓库,经典 PAT 通常需要 `repo` 权限。 2. **目标** - 输入 `whooli` 或你自己的组织/仓库 3. **分析** - 扫描工作流中的漏洞并展示可利用的发现结果 如需完整的挑战流程,请参阅 [`whooli` 指南](docs/WHOOLI.md) 或直接访问 [`whooli` GitHub 组织](https://github.com/whooli)。 完成后: ``` make quickstart-down # Stop containers make quickstart-purge # Stop and delete all data ``` 如果你想从源代码开始工作,请参阅 [开发](#development)。 ## 开发 如果你正在本地贡献或迭代源代码,请安装 Go 1.26+ 并使用开发快速启动: ``` make dev-quickstart ``` `make dev-quickstart` 会构建本地 `smokedmeat-cloud-shell` 镜像,启动 `cloudflared`、`nats` 和 C2 团队服务器(`Kitchen`),然后从源代码启动操作员 TUI(`Counter`)。 如果你想先搭建基础设施再启动操作员 TUI: ``` make dev-quickstart-up make dev-quickstart-counter ``` 完成后: ``` make dev-quickstart-down # Stop containers make dev-quickstart-purge # Stop and delete all data ``` 更多部署模式和本地开发细节请参见 [docs/deployment.md](docs/deployment.md)。 ## 核心组件 | 标准术语 | SmokedMeat 名称 | 描述 | |----------|-----------------|------| | **操作员 TUI** | `Counter` | 用于分析、载荷投递和后利用工作流的终端界面 | | **C2 团队服务器** | `Kitchen` | API 和 WebSocket 服务器,用于操作员会话、启动程序、回调和图状态管理 | | **植入程序** | `Brisket` | 交付到被破坏的 CI 运行器的代理,用于心跳、命令执行和横向移动 | | **浏览器图视图** | `Browser View` | 由 C2 团队服务器在 `/graph` 提供的实时攻击图 | ## 部署模式 | 模式 | 适用场景 | 入口点 | |------|----------|--------| | **快速启动** | 首次运行固定版本的最快方式 | `make quickstart` | | **开发快速启动** | 在本地源代码树上进行迭代 | `make dev-quickstart` | | **托管团队服务器** | 使用稳定域名运行真实演练 | [docs/deployment.md](docs/deployment.md) | 托管团队服务器会在专用主机上运行 C2 团队服务器,并在每个操作员工作站上原生运行操作员 TUI。 ## 架构 在较高层次上,操作员 TUI(`Counter`)与 C2 团队服务器(`Kitchen`)通信,后者管理在被破坏的 CI 运行器上运行的植入程序(`Brisket`)并提供实时攻击图。 ``` ┌──────────────┐ │ SSH AGENT │ │ (Auth) │ └──────┬───────┘ │ ▼ ┌──────────────┐ ┌──────────────┐ │ THE COUNTER │ ───────────────▶│ THE KITCHEN │ │ (Operator) │ WebSocket │ (Teamserver) │ │ Bubbletea │◀─────────────── │ │ │ TUI │ Events/Graph │ ┌──────────┐ │ └──────────────┘ │ │ Database │ │ │ └──────────┘ │ ┌──────────────┐ │ │ │ BROWSER │ ───────────────▶│ │ │ Graph View │ WebSocket │ │ │ Visualizer │◀─────────────── │ │ └──────────────┘ Live Updates └──────────────┘ │ ▲ │ │ Creates PR │ │ Stager fetches implant binary │ │ Implant HTTP Beacon/Commands ▼ │ ┌────────────────────────────────────────────┴──────────────────────────────────┐ │ GITHUB.COM │ │ │ │ ┌─────────────────────┐ ┌─────────────────────────────────────────┐ │ │ │ Malicious PR │ triggers │ GitHub Actions Runner │ │ │ │ (Vulnerable │─────────▶│ │ │ │ │ Workflow) │ │ ┌────────────┐ ┌────────────────┐ │ │ │ └─────────────────────┘ │ │ Stager │─────▶│ THE BRISKET │ │ │ │ │ │ │ │ (Implant) │ │ │ │ │ └────────────┘ └────────────────┘ │ │ │ └─────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────────────────────────────┘ ``` ## 功能特性 完整文档请参见 [docs/FEATURES.md](docs/FEATURES.md)。 | 类别 | 能力 | |------|------| | **侦察** | 自动检测 6 个 CI 平台(GitHub Actions、GitLab CI、Azure DevOps、CircleCI、Jenkins、Bitbucket)。分类密钥,探测 OIDC 可用性,收集运行器元数据。 | | **密钥提取** | 通过 `/proc` 扫描 Runner.Worker 进程内存,以恢复未屏蔽的 `secrets.*`、`vars.*` 以及 GitHub 在日志中隐藏的运行器 `GITHUB_TOKEN` 权限映射。 | | **漏洞分析** | 内置 [poutine](https://github.com/boostsecurityio/poutine) SAST,用于注入漏洞、危险触发器和工作流 `if:` 分类。Gitleaks 深度扫描 Git 历史中的私钥和 PAT。 | | **投递** | 5 种自动化方法:PR、问题、评论、LOTP、工作流调度 - 另含仅复制和手动模式。支持草稿 PR、自动关闭回调、服务端调度预检。 | | **注入载荷** | 针对 8 个注入向量(分支名称、PR 标题/正文、提交消息、问题标题/正文、github-script、bash 运行)的上下文感知载荷生成,并带有约束感知技术。 | | **LOTP** | 沿用流水线的生存方式(LOTP):15 个构建工具(npm、pip、cargo、make、docker、gradle、maven 等)及其配置文件的载荷,用于安装/构建/测试期间的代码执行。 | | **缓存中毒** | 写入者/受害者分类、精确缓存键预测、通过 Actions 缓存 API 进行存档阶段。带植入程序武装的向导式流程。 | | **令牌枚举** | 对 GitHub 令牌进行 API 端点探测,枚举 10 个权限范围,识别令牌类型,并列出可访问的仓库和组织。 | | **云横向移动** | OIDC 令牌交换以获取 AWS(`sts:AssumeRoleWithWebIdentity`)、GCP(Workload Identity Federation)、Azure(AAD)和 Kubernetes 的访问权限。后续资源枚举。 | | **云 Shell** | 持久的本地会话,支持 `cloud shell`(预配置的 gcloud/aws/az)、`cloud export` 和提供者快速检查。 | | **SSH 横向移动** | 探测仓库的 SSH 部署密钥访问权限(读写),`ssh shell` 配合临时代理,确认的访问权限会持久化到图中。 | | **GitHub 横向移动** | `pivot github` 用于仓库发现,`pivot app` 用于 GitHub App PEM 到安装令牌的交换。发现的仓库会自动加入分析队列。 | | **攻击图** | 持久化有向图(BBolt),包含组织/仓库/工作流/作业/漏洞/令牌/云节点。浏览器端的实时 Cytoscape.js 可视化位于graph`。 | | **操作员 TUI** | 阶段感知的工作流、7 步设置向导、攻击树导航、利用向导、战利品储藏、全局搜索、Tab 补全、OSC 8 超链接。 | | **团队服务器** | SSH 或令牌认证、NATS JetStream 消息总线、GitHub API 代理(令牌保留在服务端)、通过 Caddy 自动配置 TLS、操作历史记录。 | ## 技术栈 | 层级 | 技术 | |------|------| | 语言 | Go 1.26+ | | TUI 框架 | [Bubbletea v2](https://github.com/charmbracelet/bubbletea) + [Lipgloss v2](https://github.com/charmbracelet/lipgloss) | | TUI 布局 | [Ultraviolet](https://github.com/charmbracelet/ultraviolet) 布局 + ANSI 安全屏幕合成 | | 消息总线 | [NATS JetStream](https://nats.io/) | | 攻击图 | [hmdsefi/gograph](https://github.com/hmdsefi/gograph) | | 图形可视化 | [Cytoscape.js](https://js.cytoscape.org/) | | 数据库 | [BBolt](https://github.com/etcd-io/bbolt) | | CI/CD 扫描器 | [poutine](https://github.com/boostsecurityio/poutine)(内置) | | 密钥扫描器 | [gitleaks](https://github.com/gitleaks/gitleaks)(内置,自定义规则) | | 运行器密钥提取 | gump(内置,`/proc` 内存扫描) | | 云 SDK | AWS SDK v2、Google Cloud、Azure SDK for Go | | 反向代理 | [Caddy](https://caddyserver.com/)(自动配置 TLS) | ## 测试 ``` make test # Unit tests make lint # Linter make e2e-smoke # Fast public exploit smoke path make e2e-goat # Full goat chain to the cloud flag ``` ## 前人工作 SmokedMeat 基于以下研究构建: - [poutine](https://github.com/boostsecurityio/poutine) - 构建流水线 SAST 扫描器 - [LOTP](https://boostsecurityio.github.io/lotp/) - 沿用流水线的生存方式 - [Gato-X](https://github.com/AdnaneKhan/Gato-X) - GitHub Actions 枚举 - [Nord-Stream](https://github.com/synacktiv/nord-stream) - CI/CD 密钥提取 - [Sliver](https://github.com/BishopFox/sliver) - Go C2 架构模式 - [Mythic](https://docs.mythic-c2.net/) - 协作式工作流设计 ## 许可证 GNU Affero General Public License v3.0 - 详细信息请参见 [LICENSE](LICENSE)。 *为希望了解攻击者技术的防御者而构建。
标签:DevSecOps, EVTX分析, GitHub Actions, StruQ, T1083, T1105, T1552, T1555, T1578, TGT, 上游代理, 云资产探测, 协议分析, 反取证, 后利用, 安全演示, 安全评估, 密钥提取, 开源安全工具, 攻防演练, 日志审计, 权限提升, 构建管道, 横向移动, 红队框架, 终端界面, 编程规范, 网络信息收集, 网络安全审计, 自动笔记, 逆向工程平台