红蓝对抗Docker渗透复盘-技能与产出汇总

红蓝对抗 · Docker 渗透测试全流程复盘 ------ 技能与产出汇总

本文归纳自 5 份材料:SKILL.md(技能定义)、init_lab.py(靶场生成器)、docker-compose.yml(靶场编排)、README.md(靶场使用说明)、渗透测试复盘报告.md(演练产出)。

授权声明 :全部内容面向自有 / 明确授权的隔离环境,用于安全教学与红蓝对抗演练。靶场服务只绑定 127.0.0.1,禁止将其中任何配置、地址、载荷用于未授权系统。

0. 一页速览

项 内容
主题 红蓝对抗实战:Docker 环境下的渗透测试全流程复盘
技能名 redblue-docker-pentest-review(用户级,~/.workbuddy/skills/)
交付形态 ① 可运行的隔离靶场代码 ② 可评审的 Markdown 复盘报告
场景数 6 个(命令注入 / 未授权 Docker API / docker.sock 挂载 / 特权逃逸 / 凭据泄露 / 供应链)
示例演练 13 步攻击链,6 项缺陷(严重 3、高危 3),9 项整改,检测覆盖率 15%(2/13)
安全校验 FAIL=0、WARN=8、INFO=11(8 项 WARN 即靶场故意保留的教学缺陷)

一句话定位 :把"凭记忆写渗透报告"变成"脚本生成靶场 + 数据驱动渲染报告"------靶场配置来自内置场景库(缺陷位置有注释标注),报告数字全部由 findings.json 计算得出,不允许手写估算。


1. 技能本体(SKILL.md)

1.1 它解决什么问题

手写渗透复盘最常见的三类退化:只有漏洞列表没有攻击链、只有红队视角缺检测评估、整改写了却没有验证方式和卡点。技能用固定的数据结构 + 固定的模板把这三块钉死。

1.2 合规边界(硬性)

约束 落地机制
仅限授权隔离环境 端口默认绑 127.0.0.1,独立 bridge 网络,不共享宿主网络命名空间
不生成外部目标载荷 validate_lab.py 扫描非 RFC1918 / 非回环 IP,命中即 FAIL 阻断
产物自带授权声明 Dockerfile / compose / README / 报告模板顶部均有声明段,删除即判红线
禁止破坏性动作 靶场只做读取、枚举、容器内执行等验证级动作
逃逸场景用完即毁 priv-escape / sock-escape / docker-api 明确禁止长期运行或暴露办公网
授权信息不缺省 未提供授权时 meta.authorization 保持 __TODO__,报告显示「⚠ 待补充」

1.3 五步流水线

步骤 动作 命令 / 产出
1 选场景 确认复现哪些场景;未指定默认 web-rce,sock-escape,cred-leak init_lab.py --list
2 生成 生成靶场工程 init_lab.py --name=lab-redblue-01 --scenario=all --out=./lab-redblue-01
3 校验 三级检查后再启动 validate_lab.py --dir=... → docker compose up -d --build
4 记录 按六要素填 findings.json build_report.py --findings=... --out=复盘报告.md
5 交付 点名链路、最高权限、严重缺陷数、检测覆盖率、CI 卡点 ---

校验分级:FAIL 红线(外部目标 / 端口暴露 0.0.0.0 / 缺授权声明)必须修;WARN 靶场教学缺陷(privileged / docker.sock / host 命名空间 / latest / 明文凭据)需知情确认;INFO 加固建议(资源限制 / 只读根 / cap_drop / 日志轮转)。--strict 可把 WARN 计入失败用于 CI。

1.4 参考知识库(按需加载)

文件 用途
attack-chain-playbook.md 11 阶段攻击链剧本,每阶段的手法、判定命令、痕迹、加固
docker-attack-surface.md 12 类 Docker 攻击面(含 runc / DirtyPipe 等 CVE)与 CIS 加固基线
blue-team-detection.md Falco / Sigma 规则、取证命令、整改清单模板
mitre-attack-mapping.md ATT&CK 容器矩阵映射 + 检测覆盖度评分口径
report-structure.md 复盘章节规范、六要素记录法、退化写法自查表

1.5 关键约束

  • 改场景改 scripts/lab_scenarios.py,不要手敲 compose。
  • 报告数字一律来自 findings.json 计算,不得估算。
  • 真实凭据与内网地址一律占位符,靶场凭据用 lab-demo- 前缀假值。

2. 靶场生成器(init_lab.py,527 行)

2.1 接口

bash 复制代码
python init_lab.py --name=<靶场名> --scenario=<逗号分隔|all> --out=<输出目录>
python init_lab.py --list

2.2 三张内置数据表

数据表 作用
SCENARIOS(在 lab_scenarios.py) 6 个场景的标题、服务名、端口、额外 compose 缺陷片段、文件生成器
FIX_TEMPLATES 每个场景预置 1--2 条整改项(缺陷 / 等级 / 动作 / 验证方式 / 卡点位置),共 9 条
TIMELINE_TEMPLATES 每个场景预置 2--3 条时间线骨架(阶段 / 目标 / ATT&CK ID / 动作),共 13 条

2.3 九个构建函数

函数 产出
build_compose() docker-compose.yml:按选中场景拼装服务,缺陷处带 # 缺陷(教学用) 注释
build_readme() README.md:场景表、命令、校验与报告生成方式、清理说明
build_makefile() Makefile:up / down / verify / report / clean
build_falco_rules() 5 条运行时规则:socket 挂载、特权容器、写宿主路径、包管理执行、反弹 shell
build_sigma_rules() 3 条规则:2375 访问(T1610)、云元数据访问(T1552.005)、Web 进程派生 shell(T1059)
build_forensics_script() collect.sh:按"先易失后持久"采集网络 / 进程 / inspect / diff / logs / commit
build_findings() findings.json 骨架:meta、env、timeline、findings、detection、fixes、appendix
write_file() 统一 UTF-8 + LF 落盘

2.4 生成目录结构

复制代码
lab-redblue-01/
├── README.md                      靶场说明
├── docker-compose.yml             6 服务编排
├── Makefile                       命令快捷方式
├── findings.json                  复盘数据骨架
├── scenarios/<场景>/
│   ├── Dockerfile                 带缺陷的构建文件
│   ├── src/                       靶机源码(Python 标准库实现)
│   └── notes.md                   缺陷 → 复现 → 检测信号 → 加固
└── blue-team/
    ├── falco-rules.yaml
    ├── sigma/container-rules.yml
    └── collect.sh

设计要点 :findings.json 骨架默认按战术阶段排序,填入 t 字段(T+HH:MM 格式)后由渲染脚本自动按发生时间重排时间线与攻击链图,不需要人工调整顺序。


3. 靶场编排(docker-compose.yml)

3.1 六个服务与核心缺陷

服务 场景 端口 场景专属缺陷 通用缺陷
web-01 web-rce 8080 靶机 /ping?host= 用户输入直接拼进 shell root 运行、未 cap_drop、无资源限制、未只读根
dind-api docker-api 2375 privileged: true + DOCKER_TLS_CERTDIR=""(无 TLS) 同上
admin-panel sock-escape 18080 挂载 /var/run/docker.sock 同上
esc-demo priv-escape - privileged + pid: host + - /:/host 同上
cred-demo cred-leak - .env 进镜像层、ARG/ENV 明文 token 同上
supply-demo supply-chain - FROM alpine:latest 漂移、无扫描签名 同上

网络统一为 lab-redblue-01-net(bridge),restart: "no"。

3.2 为什么通用缺陷要保留

六个服务都刻意不做 cap_drop、不做资源限制、不只读根------这是为了让 validate_lab.py 能稳定产出 INFO 级加固建议,让复盘报告的"整改清单"有真实的对照项,而不是只谈场景专属漏洞。

3.3 使用流程(README)

bash 复制代码
# 1 校验(必跑)
python validate_lab.py --dir=.
# 2 启动
docker compose up -d --build
docker compose logs -f web-01          # 蓝队取证入口
# 3 演练时按 scenarios/<场景>/notes.md 复现
# 4 渲染报告
python build_report.py --findings=findings.json --out=复盘报告.md
# 5 销毁(逃逸类场景用完即毁)
docker compose down -v --remove-orphans && docker image prune -f

4. 复盘报告(渗透测试复盘报告.md)

4.1 章节结构

0 文档信息 → 1 执行摘要 → 2 环境与规则 → 3 攻击链(图 / 时间线 / ATT&CK 聚合)→ 4 缺陷清单 → 5 检测能力评估 → 6 蓝队视角 → 7 整改清单 → 8 附录(命令 / 交付物 / 术语)。

4.2 本次示例演练的关键数据

指标 数值
攻击步骤 13 步(侦察 2 / 初始访问 1 / 执行 1 / 持久化 1 / 提权 2 / 防御绕过 1 / 凭据访问 1 / 发现 4)
触发告警 2 次
检测覆盖率 15%(2/13)
MTTD / MTTR 23 min / 41 min
缺陷 6 项(严重 3:2375 未授权、docker.sock 挂载、特权逃逸;高危 3:命令注入、凭据泄露、供应链)
整改 9 项,每项含验证方式与卡点位置

4.3 攻击链串讲(按时间)

复制代码
T+00:08  8080 端口发现自研诊断接口                      未告警
T+00:11  2375 无鉴权返回 Docker 版本                    未告警
T+00:23  /ping?host=127.0.0.1;id 回显 uid=0            未告警   ← 入口失守
T+00:31  借 Docker API 起容器挂载宿主根读 /etc/hostname  告警(IDS 命中但被判误报关闭)
T+00:52  同 tag 两次构建 digest 不同(latest 漂移)      未告警
T+01:14  借 docker.sock 列出宿主全部容器并读 /etc/shadow 未告警   ← 等价于宿主权限
T+01:26  特权容器 chroot /host 成功逃逸                  未告警   ← 链顶端
T+01:40  含高危漏洞镜像被 CI 无卡点放行                   未告警
T+01:58  docker history 提取明文 token                  告警(CI secret 扫描,事后复检)
T+02:05~02:22  容器探测、socket 发现、pid=host 确认、云元数据探测  全部未告警

链的本质 :一个命令注入 → 容器 root → 借 socket / 特权配置 → 宿主 root,全程 3 小时 20 分,蓝队只在两个点上产生过信号,且其中一个被误判关闭。

4.4 检测缺口归因(四类,口径要分开)

类型 步数 根因 补法
无遥测 7/13 容器日志未集中、无 docker events、无运行时检测 补日志采集与 Falco/eBPF
有数据无规则 4/13 信号在主机日志里但没建规则与告警路由 补 Sigma/Falco 规则
有告警无关联 1/13 IDS 命中 2375 告警,未关联后续容器创建事件 补告警关联与上下文
无基线 1/13 特权容器、socket 挂载缺配置基线比对 部署期基线卡点

4.5 整改闭环要求

9 项整改全部落到三处卡点之一:CI 流水线(SAST、secret 扫描、镜像扫描签名)、镜像模板仓库(非 root、cap_drop、只读根)、集群/主机基线(CIS 2.x、资源限制、日志轮转)。每项都给了可执行的验证命令,例如「docker exec app id 非 0」「docker history --no-trunc grep 不到 token」。


5. 端到端使用手册

bash 复制代码
PY="C:/Users/Admin/.workbuddy/binaries/python/versions/3.13.12/python.exe"
S="C:/Users/Admin/.workbuddy/skills/redblue-docker-pentest-review"

# ① 查看场景
"$PY" "$S/scripts/init_lab.py" --list

# ② 生成靶场
"$PY" "$S/scripts/init_lab.py" --name=lab-redblue-01 --scenario=all --out=./lab-redblue-01

# ③ 校验(FAIL=0 才能启动)
"$PY" "$S/scripts/validate_lab.py" --dir=./lab-redblue-01

# ④ 启动演练
cd lab-redblue-01 && docker compose up -d --build

# ⑤ 补齐 findings.json 后渲染报告
"$PY" "$S/scripts/build_report.py" --findings=./findings.json --out=./渗透测试复盘报告.md

# ⑥ 销毁
docker compose down -v --remove-orphans

findings.json 六要素 :t/ts(时间)、phase(阶段)、target(目标)、technique(ATT&CK ID)、action(动作)、evidence(证据)、detected(检测状态)、gap(缺口)。缺"证据"或"检测状态"的记录不算有效记录。


6. 文件清单索引

路径 角色
~/.workbuddy/skills/redblue-docker-pentest-review/SKILL.md 技能定义:流水线、合规边界、约束
.../scripts/init_lab.py 靶场生成器
.../scripts/lab_scenarios.py 6 个场景的配置与源码模板
.../scripts/validate_lab.py 三级安全校验
.../scripts/build_report.py findings.json → Markdown 报告渲染
.../assets/templates/report-template.md 报告模板({``{meta.x}} / {``{table:x}} / {``{mermaid:chain}} / {``{metric:x}})
.../references/*.md 5 份知识库
lab-redblue-01/docker-compose.yml 靶场编排(6 服务)
lab-redblue-01/README.md 靶场使用说明
lab-redblue-01/findings.json 演练数据(示例为演示填充值)
lab-redblue-01/渗透测试复盘报告.md 产出报告
lab-redblue-01/blue-team/ Falco / Sigma / 取证脚本

本汇总由上述 5 份材料归纳而成。示例报告中的演练数据为演示填充值,真实演练时必须替换为实录证据。

_

相关推荐
I'mChloe4 小时前
Windows部署BiliNote:Docker安装、AI视频转写、Markdown笔记与cpolar远程访问
人工智能·windows·docker
打工仔折腾 AI5 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
天衍四九-6 小时前
Docker Compose企业实战系列(八·终章):多环境隔离实战,开发/测试/生产一键切换
运维·docker·容器
shjita7 小时前
centos中安装docker
linux·docker·centos
ysu_03147 小时前
Docker-Desktop-WSL2实战指南-Windows从安装配置到项目容器化
windows·python·docker·容器·composer·dockerfile·wsl2
天衍四九-8 小时前
Docker Compose企业实战系列(三):Vue/React前端项目容器化完整部署
前端·vue.js·docker
陈陈CHENCHEN8 小时前
【Kubernetes】纯 IPv6 K8s 集群访问外部 IPv4 服务
云原生·容器·kubernetes
明王明王8 小时前
从零搭建一个 AI Infra 实验室⑫:Docker 为什么默认看不到 GPU
人工智能·docker·容器
天衍四九-8 小时前
Docker Compose企业实战系列(四):Redis生产级部署|密码加固、持久化、内存优化完整方案
redis·docker·容器