作者kloer (測試..)
看板Soft_Job
標題[討論] 暴力破解 ptt 任意帳號似乎成為了可能
時間Thu Oct 22 17:41:37 2020
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 --
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.26.240 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1603359702.A.165.html
推 longlyeagle: PR will be nice 10/22 17:44
這是我隨意看 code 五分鐘看見的東西
說不定是不可行的, 分享出來給大家討論討論
※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 17:53:37
推 alihue: 推推 10/22 17:54
推 zb91: 媽 我在這裡~ 10/22 17:54
推 yoche2000: 神串流名 10/22 17:54
推 xinbr7543: 太神拉 10/22 17:57
推 pilor: 推 10/22 18:06
推 wulouise: 這種問題通常建議等你的pr進了再來分享.... 10/22 18:17
推 gofigure: email不是該用戶註冊的嗎? 除非你有辦法進到他信箱 10/22 18:21
推 alihue: 原po不是分享是討論阿XD 10/22 18:21
→ gofigure: 不然這種reset本來就只是整個流程的觸發機制而已 10/22 18:21
對, 標題誇大了
其實是只要知道對方 email 就行了
不用真的需要該 email 權限也能任意拿到可以 reset 密碼的 code
※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 18:23:34
→ gofigure: 不好意思沒看清楚 原來是繞過email 10/22 18:23
例如你知道你同學的 ptt 帳號是 AAAA
然後它的學校信箱是
[email protected] 那它大概就能破解了
※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 18:24:18
→ siriusu: 其實 email 算相對不難拿的資料後面這段可行的話應該至 10/22 18:27
→ siriusu: 少 10% 的使用者因為 id reuse 很好猜,加上 Google 說 10/22 18:27
→ siriusu: 不定可以拿到 30%+ 10/22 18:27
→ MOONY135: 代表只要能看到目前註冊信箱就可以改密碼了 10/22 18:27
→ siriusu: 啊不對 因為一定要學校信箱所以其實不見得會 reuse 也不 10/22 18:31
→ siriusu: 好猜 10/22 18:31
推 gofigure: 這種通常會搭配有效性 5分鐘失效 10/22 18:33
pid 了不起 1 ~ 100k 之間
夠快的電腦數秒間就能快速產生某一個 100k 個 seed 的 handle string
然後直接程式化比對螢幕當下拿到的 string
※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 18:39:55
推 dream1124: 厲害,推 10/22 19:06
推 Rm: 膜拜 10/22 19:48
推 Lesterz: 推 10/22 19:48
推 koka813: wow 10/22 19:50
推 jass970991: 這很厲害 10/22 19:51
推 Rm: 輸入錯誤三次把i p列為黑名單? 10/22 20:09
推 drajan: 連個proxy可以輕鬆解決樓上的問題 10/22 20:09
→ john0312: Responsible disclosure = = 10/22 20:12
推 chocopie: 可以,這很yoyodiy,直接繞過信箱 10/22 20:38
推 ucrxzero: 所以單純幾個C函式就能破解的意思嗎? 10/22 21:34
→ ucrxzero: ptt是有source code嗎不然你怎知道實作? 10/22 21:35
→ ucrxzero: 這樣被破解也不能怪人喇主從架構的實作都被知道惹 10/22 21:35
推 w86083: 強 10/22 21:38
推 gofigure: 看他的random_text_code實作 有點不OK 10/22 21:42
→ gofigure: 它如果每次都把chars用另一個外界拿不到的seed洗牌過 10/22 21:43
→ gofigure: 這個漏洞可能就沒用了 10/22 21:44
推 oToToT: 上面那個是不是連批踢踢是開源的都不知道 10/22 22:29
推 bill0205: 推XDDDD 10/22 22:35
推 luli0034: 推 10/22 22:55
→ wens: pid 1 ~ 100k 肯定是不夠。站上人數最多是可以到150k的 10/22 23:21
→ nh60211as: ㄟ AccountRecovery::GenCode呼叫random_text_code 10/22 23:48
→ nh60211as: 是不是存過界啦 10/22 23:48
推 viper9709: 抖 10/23 01:06
→ ssccg: 這種事關資安的隨機還用時間pid之類的來seed也太沒sense 10/23 01:13
→ ssccg: crypto secure random用urandom是基本吧 10/23 01:14
推 GuYueHu: 聽起來zero-day正式開始XD 10/23 04:26
推 s37166117: 看第二次才懂在說啥 不過不會操作XD 10/23 05:22
→ TakiDog: 推 感覺可行(? 拿自己帳號寫POC送PR r XD 10/23 08:10
※ 編輯: kloer (114.36.26.240 臺灣), 10/23/2020 08:19:45
推 amyt: 推XDDD 10/23 09:53
推 a904472000: 怕爆來留名 10/23 15:41
推 enskylin: 怎麼沒有用 urandom @@ 10/23 15:48
推 d880126d: 太神啦 10/23 16:28
推 runedcross: 神人 10/23 18:40
推 p90085: y 10/23 19:04
推 stellvia2359: 拜神 10/23 19:32
推 duck10704: 推個 10/23 21:47
推 fr75: 可怕 10/24 10:12
推 Jekk: 推 10/24 13:35
推 HenryLiKing: 神串留名啊!! 好厲害喔!! 10/25 11:28
推 wildli0422: 囧,zero-day start 10/25 13:56
推 locklose: 推 10/26 11:10
噓 rebuildModel: 冏 10/27 00:37
推 bobsonlin: 推 10/27 04:19
推 emperorrock: 推 10/30 15:13