楼主:
kloer (测试..)
2020-10-22 17:41:37ptt 最近发了一个功能叫做 /recover
所以我就顺手看了一下相关的 source code: https://github.com/ptt/pttbbs/blob/master/mbbsd/recover.cc
详见: https://www.ptt.cc/bbs/SYSOP/M.1603325969.A.7F6.html
大家都知道 random number 是很容易有机可趁的东西
只要你的 seed 跟算法被知道, 那大多都是可预测的
ptt 的整个登入流程大概是, 接收 client, 然后 fork 出来服务
所以每个 client 都会有独立的 pid
而 ptt 在 login 时就决定了 random seed
详见: https://github.com/ptt/pttbbs/blob/7296640ed0d9885c8494b7d63809858996d9e56d/mbbsd/mbbsd.c#L1433
ptt 的 random 算法则是用 glibc 内标准的算法
https://github.com/ptt/pttbbs/blob/master/include/cmdiet.h
recover 功能的流程大概是这样的:
1. /recover 打下去先给你一段 recaptcha
2. 验证后输入 username 以及 email
3. 发 token 到你的 email
4. 验证 token 并 reset password
其中第一个步骤的 recaptcha 就含有了 random 产生的 text
例如它会给我这段: https://www.ptt.cc/captcha?handle=DefWcEgFufbhWYeGtfTCWaWUaxLWcUwd
handle 后面的 32 位元 text 其实就是由:
https://github.com/ptt/pttbbs/blob/7296640ed0d9885c8494b7d63809858996d9e56d/mbbsd/captcha.c#L190
这里来的, 这意味着我只要透过暴力方式, 先跟 ptt server 上校正好时间, 那剩余的变量就是 pid 了
由于这会是第一个 random text, 所以我只要把 mysrand() 内的 srandom(time(NULL) + getpid());
其中的 getpid() 用暴力法, 然后能产生跟我画面上看到的 32 bytes 字串一样的值
那等于我已经破解了这个 login session 之后会产生的 random text
之后上面流程中的第四步, 就算我不知道正确的 code (不是 email 本人)
也能破解掉任意使用者并 reset password
因为它也 random text 来的 30 bytes: https://github.com/ptt/pttbbs/blob/7296640ed0d9885c8494b7d63809858996d9e56d/mbbsd/recover.cc#L153
作者:
alihue (wanda wanda)
2020-10-22 17:54:00推推
作者:
zb91 (短ID好PO图)
2020-10-22 17:54:00妈 我在这里~
作者:
yoche2000 (Sushi Desu! 在下寿司)
2020-10-22 17:54:00神串流名
作者: xinbr7543 (扑簌簌簌) 2020-10-22 17:57:00
太神拉
作者:
pilor (Formosa)
2020-10-22 18:06:00推
作者:
wulouise (在线上!=在电脑前)
2020-10-22 18:17:00这种问题通常建议等你的pr进了再来分享....
email不是该用户注册的吗? 除非你有办法进到他信箱
作者:
alihue (wanda wanda)
2020-10-22 18:21:00原po不是分享是讨论阿XD
作者:
siriusu (かがみは俺の嫁。)
2020-10-22 18:27:00其实 email 算相对不难拿的资料后面这段可行的话应该至少 10% 的使用者因为 id reuse 很好猜,加上 Google 说不定可以拿到 30%+
作者:
siriusu (かがみは俺の嫁。)
2020-10-22 18:31:00啊不对 因为一定要学校信箱所以其实不见得会 reuse 也不好猜
作者:
zb91 (短ID好PO图)
2020-10-22 18:34:00作者:
Rm (红中)
2020-10-22 19:48:00膜拜
作者: Lesterz (力大鱼闭) 2020-10-22 19:48:00
推
作者:
koka813 (shift)
2020-10-22 19:50:00wow
作者:
Rm (红中)
2020-10-22 20:09:00输入错误三次把i p列为黑名单?
作者:
drajan (EasoN)
2020-10-22 20:09:00连个proxy可以轻松解决楼上的问题
作者:
john0312 (Chen John L)
2020-10-22 20:12:00Responsible disclosure = =
作者:
chocopie (好吃的巧克力派 :))
2020-10-22 20:38:00可以,这很yoyodiy,直接绕过信箱
所以单纯几个C函式就能破解的意思吗?ptt是有source code吗不然你怎知道实作?这样被破解也不能怪人喇主从架构的实作都被知道惹
作者:
w86083 (小可)
2020-10-22 21:38:00强
看他的random_text_code实作 有点不OK它如果每次都把chars用另一个外界拿不到的seed洗牌过这个漏洞可能就没用了
作者:
oToToT (å±å©)
2020-10-22 22:29:00上面那个是不是连批踢踢是开源的都不知道
作者:
bill0205 (善良的小孩没人爱)
2020-10-22 22:35:00推XDDDD
作者: luli0034 (luli) 2020-10-22 22:55:00
推
作者:
wens (æ–‡æ€)
2020-10-22 23:21:00pid 1 ~ 100k 肯定是不够。站上人数最多是可以到150k的
ㄟ AccountRecovery::GenCode呼叫random_text_code是不是存过界啦
作者:
ssccg (23)
2020-10-23 01:13:00这种事关资安的随机还用时间pid之类的来seed也太没sensecrypto secure random用urandom是基本吧
作者:
GuYueHu (GuYueHu)
2020-10-23 04:26:00听起来zero-day正式开始XD
作者:
TakiDog (多奇狗)
2020-10-23 08:10:00推 感觉可行(? 拿自己帐号写POC送PR r XD
作者:
amyt (amyt)
2020-10-23 09:53:00推XDDD
作者: a904472000 (我只想当个废物晒太阳) 2020-10-23 15:41:00
怕爆来留名
作者:
enskylin (Ensky)
2020-10-23 15:48:00怎么没有用 urandom @@
作者:
d880126d (DrEamChasEr)
2020-10-23 16:28:00太神啦
作者: p90085 (你是光你是风) 2020-10-23 19:04:00
y
作者:
fr75 (阿巴 )
2020-10-24 10:12:00可怕
作者:
Jekk (Lestrade)
2020-10-24 13:35:00推
作者: wildli0422 (wild) 2020-10-25 13:56:00
囧,zero-day start
作者: locklose (允) 2020-10-26 11:10:00
推
作者: rebuildModel (重新建构) 2020-10-27 00:37:00
冏
作者: emperorrock 2020-10-30 15:13:00
推