作者:
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
推