红蓝对抗 · 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 份材料归纳而成。示例报告中的演练数据为演示填充值,真实演练时必须替换为实录证据。
_