Allureluoli 二月FEBRUARY

NESTCTF 2026 Handoff:45 分之后,展示身份与绑定身份之间还差一条链

Handoff / handoffnew 的 Stage 1、2、3 已在 judge 记分,共 45 分;Stage 4、5 没有通过记录,完整 flag 未取得。最大的收获是把“展示成谁”和“实际能访问谁的资源”拆开,最大的坑则是把旧版 mock 的行为带到新版线上。

协议与计分

平台的 nc 入口实际承载 TLS 和 JSON-lines。明文连接 EOF 不能直接判为实例宕机;需要先区分明文/TLS、代理接受连接和后端真正返回 JSON。

阶段 结果
Stage 1:状态机与 MAC 构造 10 分
Stage 2:RETRY 身份语义问题 15 分
Stage 3:MIGRATE export 非授权调用 20 分
Stage 4:完整 exploit 未通过
Stage 5:修复实现 未通过

消息预算为 400,SUBMIT 每次消耗 5。Stage 4 会在三轮新实例中运行提交脚本,至少两轮输出 flag 才通过,不能用一次本地输出替代判题。

正常登录链与 MAC 编码

正常流程是 REGISTER → CHAL → AUTH → OPEN → ACCESS。MAC 使用 HMAC-SHA256,各字段先加四字节大端长度再拼接,不能简单拼字符串。

1
2
3
4
5
6
CHL: id, ns
ATH: id, ns
IAS: id, ns, exp
RTY: id, sid
RNW: sid, counter
CLS: sid

这里的标签也是 MAC 输入的一部分。CHAL 返回的 sproof 可以辅助校验自己的编码是否正确。

RETRY 的身份错位

RETRY 用当前会话所属身份及密钥校验 MAC,却把请求携带的 id 用于更新会话展示身份。于是以自己的密钥签名,也能把展示身份改成 ops,随后通过只检查 ops 的 MIGRATE export 门槛。

1
2
3
4
5
注册普通身份 u
→ 建立 u 的会话
→ 用 u 的密钥签 RETRY,传入 id=ops
→ 展示身份变为 ops
→ MIGRATE export 被接受

这条链足以说明 Stage 2、3 的问题,但还没有让 ACCESS 返回 flagadmin 的受保护资源。

新版线上有两个身份

身份 从哪里设置 哪个环节使用
绑定身份 OPEN,或迁移 commit 回填 ACCESS
展示身份 RETRY MIGRATE export 门控

后期实测每会话只能成功 RETRY 一次;ACCESS 仍认绑定身份。早期“用户之间连续多跳,再进入 flagadmin”的观察不能当成新版的稳定利用链。

commit 可以把迁移记录的 identity 回填为绑定身份,但 export 的门控要求展示身份是 ops,产出的记录 identity 也只能是 ops。要访问 flagadmin,缺的正是一条能产出 flagadmin 迁移记录的路径。

已排除的路径

  • 给 export 或 commit 添加 identity、id、as、target 等覆盖字段,没有得到想要的记录身份。
  • 第二次 RETRY 在不同密钥和字段组合下仍 invalid。
  • 导出 blob 中的 32 字节值是 OPEN 断言,不能直接当作下一跳密钥。
  • 同一 sid 在新连接中可重新 OPEN,但迁移记录并不跨连接共享。
  • discard 后 commit、历史记录边界探测等,没有构成最终提权链。
  • commit 后再次 export 仍看到旧 OPEN 断言,没有拿到可用于 flagadmin 的新断言。

这些是当时所测变体的结果,不是对协议所有可能路径的穷尽证明。

Stage 4 的提交问题

第一次提交为 0/3,其中存在 TLS 向明文回退的问题:在同一条连接上先发 ClientHello,会污染实际为明文的实例。修复后,旧版 mock 可输出测试 flag,但线上 judge 随后离线,未取得通过回执。

flag{mock_...} 是本地测试产物。即使修复传输错误,也仍需验证新版身份限制,不能把网络适配完成写成完整 exploit 已通过。

Stage 5 所需 Simulator 接口与手头旧 handout 存在差异,尚未完成兼容修复和判题。

继续做时的顺序

  1. 对照目标实例版本与 handout,确认一次性 RETRY、身份字段及迁移记录生命周期。
  2. 保存每次请求的预算与完整响应,用最少操作复现 Stage 1—3。
  3. 优先找合法产生 flagadmin 记录的路径,避免继续猜没有证据的覆盖字段。
  4. 用新版行为建立本地模型后再提交 Stage 4,保留 judge 的轮次结果。

资料来源

以 HANDOFF_STATUS.md 的 10 月 31 日 20:30、21:00 更新和当日会话为准;旧 handoff/NOTES.md 与早期 WP 中的多跳结论仅作为过程记录。本文不附 mock flag,也不声称 Stage 4、5 已完成。

评论COMMENTS