[討論] 暴力破解 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