[讨论] 暴力破解 ptt 任意帐号似乎成为了可能

楼主: kloer (测试..)   2020-10-22 17:41:37
ptt 最近发了一个功能叫做 /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
作者: longlyeagle (长鹰宝宝实验室)   2020-10-22 17:44:00
PR will be nice
作者: 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进了再来分享....
作者: gofigure (平行世界)   2020-10-22 18:21:00
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%+
作者: MOONY135 (谈无欲)   2020-10-22 18:27:00
代表只要能看到目前注册信箱就可以改密码了
作者: siriusu (かがみは俺の嫁。)   2020-10-22 18:31:00
啊不对 因为一定要学校信箱所以其实不见得会 reuse 也不好猜
作者: gofigure (平行世界)   2020-10-22 18:33:00
这种通常会搭配有效性 5分钟失效
作者: zb91 (短ID好PO图)   2020-10-22 18:34:00
https://i.imgur.com/oEtAdjV.jpg 我觉得蛮好猜的 XDD
作者: dream1124 (全新开始)   2020-10-22 19:06:00
厉害,推
作者: Rm (红中)   2020-10-22 19:48:00
膜拜
作者: Lesterz (力大鱼闭)   2020-10-22 19:48:00
作者: koka813 (shift)   2020-10-22 19:50:00
wow
作者: jass970991 (半糖绿假面超人)   2020-10-22 19:51:00
这很厉害
作者: 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:00
Responsible disclosure = =
作者: chocopie (好吃的巧克力派 :))   2020-10-22 20:38:00
可以,这很yoyodiy,直接绕过信箱
作者: ucrxzero (RX-0)   2020-10-22 21:34:00
所以单纯几个C函式就能破解的意思吗?ptt是有source code吗不然你怎知道实作?这样被破解也不能怪人喇主从架构的实作都被知道惹
作者: w86083 (小可)   2020-10-22 21:38:00
作者: gofigure (平行世界)   2020-10-22 21:42: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:00
pid 1 ~ 100k 肯定是不够。站上人数最多是可以到150k的
作者: nh60211as   2020-10-22 23:48:00
ㄟ AccountRecovery::GenCode呼叫random_text_code是不是存过界啦
作者: viper9709 (阿达)   2020-10-23 01:06:00
作者: 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
作者: s37166117 (ace)   2020-10-23 05:22:00
看第二次才懂在说啥 不过不会操作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
太神啦
作者: runedcross (Shiki)   2020-10-23 18:40:00
神人
作者: p90085 (你是光你是风)   2020-10-23 19:04:00
y
作者: stellvia2359 (Astral)   2020-10-23 19:32:00
拜神
作者: duck10704 (duck)   2020-10-23 21:47:00
推个
作者: fr75 (阿巴 )   2020-10-24 10:12:00
可怕
作者: Jekk (Lestrade)   2020-10-24 13:35:00
作者: HenryLiKing (HenryLiKing)   2020-10-25 11:28: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
作者: bobsonlin (billy)   2020-10-27 04:19:00
作者: emperorrock   2020-10-30 15:13:00

Links booklink

Contact Us: admin [ a t ] ucptt.com