作者fxfxxxfxx (爱丽丝)
看板Marginalman
标题[闲聊] 漏洞回报心得:PTT注册验证码绕过
时间Sun May 21 12:40:47 2023
这次偶然间发现了能够无限注册 PTT 帐号的方法,
回报到 HITCON ZeroDay 平台,目前已修复并公开。
(
https://zeroday.hitcon.org/vulnerability/ZD-2023-00133)
契机
----
其实最一开始是跟找漏洞无关的。
单纯是有一天突然在想,不知道有没有办法在不编辑文章的情况下,
提前知道准备发出去的文章代码,这样岂不是很酷吗
翻了一下 PTT 的程式码後可以发现,文章代码和档名之间有一套转换规则。
而档名由三个部份组成:
1. 种类(文章或文摘)
2. 发文时间
3. 某个随机的值
前两项都不难控制,所以剩下最後一项的随机值。
一看之後发现竟然是用 C 标准库的 random()。
那这样就蛮简单的了,只要能让他生出多一点随机数出来就能反推 seed,
因为 seed space 只有 2^32 这麽多,
这个数量级对现在的电脑来说可以直接暴力硬搜。
剩下的问题在要怎麽生出足够多的随机数。
第一个想法是连发好几篇文,不过这样有点突兀。
翻一翻程式码之後发现一个比较好的办法,
就是利用 PTT 的 ANSI 动画支援的随机跳页面功能。
只要让第一页的内容是只有「1」、第二页的内容只有「2」...
在开头加上随机跳页面,就马上可以知道这次 random() % (页数) 的值了。
生出足够多的值之後对每个 seed 都试试看符不符合就可以反推出 seed。
在这之後的随机数就都是可预测的。
在我的电脑上完整的试完 2^32 种可能的 seed 需要大约 40 分钟左右。
不过我没这个耐心,就顺便写一下 CUDA 来用显卡跑。
在我的 GTX 1080 上完整跑完需要大约一分钟,已经非常能接受了。
无限认证帐号
------------
能够提前知道文章代码当然很不错,
接着我就顺便看一下还有哪些地方用了 random(),
发现有个 makeregcode() 也用了 random()。
继续追下去发现是用来生成注册验证码的,但只有信箱注册会用到,
其他像是简讯注册、重设密码等等都是乖乖从 /dev/urandom 拿的。
应该是当初漏改到这个部份。
实际测试还真的让我验证成功,
所以只要用任何没被注册过的台大信箱都可以验证,
前面是乱码也没关系,就算 mail server 坏掉寄不出去也没差,
因为在我们进入验证页面的那一刻就知道验证码是什麽了。
回报
----
我在 3/16 号时回报给 HITCON ZeroDay 平台。规定是两个月後自动公开。
大约一个月後(有点慢)状态改成修复中,
再过一个月後,也就是 5/16 号凌晨时就自动公开了。
我当时觉得站方认为这是不值得修的小漏洞,
毕竟只是能一直注册而已,不是资料外泄或整个站被骇。
所以我就把 PoC 丢一丢,就当这件事结束了。
没想到同一天的晚上我收到平台寄来的信,
说是之前的通报有点问题,
现在他们重新联络到 PTT 站长,所以要把状态退回非公开。
我回到 GitHub 上看,竟然已经有两个 fork 了,也不知道他们怎麽发现的。
不过已经 fork 的我也管不了,反正不是我的问题,
把我自己的 repo 移除相关内容就仁至义尽了。
这次 PTT 的反应就非常快,隔天 (5/17) 我就收到通知说修好了请我复测,
所以当初两个月没人回大概就真的是联络上有点问题,
确定修好之後三天,也就是 5/21 的凌晨时重新变回公开。
完整的时间轴:
03/16: 回报至 HITCON ZeroDay
03/26: 平台审核完成(应该是指确定有漏洞)
04/24: 修补中(理论上应该要联络到 PTT 站方了)
05/16: 第一次公开
05/16: 寄信来说要改回非公开
05/17: 寄信来说修好了
05/21: 再度公开
结论
----
这是我第一次比较正式的回报漏洞,
虽然不是什麽大漏洞,不过我自己是觉得挺有趣的。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.16.175 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Marginalman/M.1684644050.A.0DE.html
1F:→ XROCK: 看不懂 大师 05/21 12:41
2F:→ kitune: 你很棒 05/21 12:41
3F:推 Mikotosama: 大师 05/21 12:41
4F:→ kitune: ...靠邀 该不会现在一堆APP跟PTT SATAR乱码 就是修这个吧 05/21 12:42
5F:→ kitune: 时间点好像对的上耶 05/21 12:42
6F:→ napacabbage: 大师 05/21 12:42
7F:推 JIWP: 大师 05/21 12:43
8F:推 TokiwaKurumi: 哇 05/21 12:43
9F:推 flyau: 大师 05/21 12:43
10F:→ pchooooome: 大师 05/21 12:44
11F:→ TokiwaKurumi: 你跟yoyodiy谁比较厉害 05/21 12:44
12F:推 keepgimo: 大师 05/21 12:45
13F:推 an94mod0: 阿 所以是为了修这个把手机版全部搞死? 05/21 12:49
14F:推 oin1104: 大师 05/21 12:50
16F:推 Excrement35: 大师 05/21 12:51
17F:→ DDFox: 大师 05/21 12:52
18F:推 ubcs: 大师 05/21 12:56
19F:推 KitsuNixya: 大师 05/21 12:58
20F:推 medama: 大师 05/21 12:59
21F:推 devilkool: 大师 05/21 13:00
22F:推 AllinPM: 大师 05/21 13:00
23F:推 jasonbass: 大师 05/21 13:00
24F:推 ken1990710: 大师 05/21 13:01
25F:推 loveSETSUNA: 大师 05/21 13:05
26F:推 ThisIsNotKFC: 猛 05/21 13:13
27F:→ NENEmywife: 大师 05/21 13:41
28F:→ Rushia: 你好优秀 05/21 14:31