WeChall - 2013 New Years Special

Challenge

URL: https://www.wechall.net/en/challenge/quangntenemy/2013NYS/index.php

题面说 Santa、Rudolph 和其他角色之间有被截获的邮件,并附上收件人的 public key。目标是从两阶段的 crypto challenge 中恢复最终 solution。

第一阶段:已确认通过

从公开源码 index.php 可以看到,第一阶段把用户提交的 answer 与 secret1.php 的返回值比较。源码中的固定答案为:

1
IKnowWhatYouDidThere

使用当前 WeChall session 提交后,服务器将流程推进到:

1
stageTWO222.php

因此这不是猜测结果,而是已经通过服务器跳转确认的阶段一答案。

Public key 观察

从 stage 2 页面取得了 key1.keykey2.key。两份 key 的 gpg --list-packets 输出都显示 RSA public key,pkey[0] 标为 1024 bits,pkey[1] 标为 15 bits。key 的 MPI/模数中故意嵌入了可读字符串:

  • key1 开头重复出现 TheSolutionIsIKnowWhatYouDidThere
  • key2 开头重复出现 WhatAreYouWaitingForNothingHereMoveAlong

这些字符串是题目设计的线索/填充,不应直接替代第二阶段 solution。仅把 key2 中的 WhatAreYouWaitingForNothingHereMoveAlong 作为 answer 提交,服务器没有接受。

第二阶段源码

stageTWO222.php 的核心流程是:

  • secret.php 取得 $secret
  • 计算 $SOLUTION = WC_CryptoChall::generateSolution($secret, true)
  • 处理 answer 时,将该 solution 的 hash 写入 challenge;
  • 访问 ?santa=clause.json 时,向当前用户的 valid mail 发送加密邮件;
  • 邮件正文包含 $SOLUTION,附件名为 0xdeadc0de.asc,内容是 key2.key

访问 ?santa=clause.json 后页面返回 mail-sent 消息,但当前账号没有可直接读取的 valid email,因此还没有拿到加密邮件正文,也没有完成第二阶段解密。

当前状态

第一阶段已通过;第二阶段未解决。最终 solution 仍需从邮件正文或等价的 RSA/PGP 逆向路径恢复。没有把 public key 中的提示字符串误标为最终答案。

后续路线

  1. 取得当前账号 valid mail 的可读投递路径,保存原始加密邮件和 0xdeadc0de.asc
  2. gpg --list-packets 和实际邮件 recipient 确认使用的是哪一把 key。
  3. 按题目提示检查小 RSA modulus、低指数和错误生成的 key;不能只看两个 key 是否共享 gcd。
  4. 解出邮件正文后,再提交第二阶段 solution,并用 /en/challs 验证 solved 状态。