PTT評價

[討論] 暴力破解 ptt 任意帳號似乎成為了可能

看板Soft_Job標題[討論] 暴力破解 ptt 任意帳號似乎成為了可能作者
kloer
(測試..)
時間推噓42 推:43 噓:1 →:19

ptt 最近發了一個功能叫做 /recover

所以我就順手看了一下相關的 source code: https://github.com/ptt/pttbbs/blob/master/mbbsd/recover.cc

詳見: https://www.ptt.cc/SYSOP/M.1603325969.A.7F6

大家都知道 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 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.26.240 (臺灣)
PTT 網址

longlyeagle10/22 17:44PR will be nice

這是我隨意看 code 五分鐘看見的東西 說不定是不可行的, 分享出來給大家討論討論

※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 17:53:37

alihue10/22 17:54推推

zb9110/22 17:54媽 我在這裡~

yoche200010/22 17:54神串流名

xinbr754310/22 17:57太神拉

pilor10/22 18:06

wulouise10/22 18:17這種問題通常建議等你的pr進了再來分享....

gofigure10/22 18:21email不是該用戶註冊的嗎? 除非你有辦法進到他信箱

alihue10/22 18:21原po不是分享是討論阿XD

gofigure10/22 18:21不然這種reset本來就只是整個流程的觸發機制而已

對, 標題誇大了 其實是只要知道對方 email 就行了 不用真的需要該 email 權限也能任意拿到可以 reset 密碼的 code

※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 18:23:34

gofigure10/22 18:23不好意思沒看清楚 原來是繞過email

例如你知道你同學的 ptt 帳號是 AAAA 然後它的學校信箱是

[email protected]

那它大概就能破解了

※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 18:24:18

siriusu10/22 18:27其實 email 算相對不難拿的資料後面這段可行的話應該至

siriusu10/22 18:27少 10% 的使用者因為 id reuse 很好猜,加上 Google 說

siriusu10/22 18:27不定可以拿到 30%+

MOONY13510/22 18:27代表只要能看到目前註冊信箱就可以改密碼了

siriusu10/22 18:31啊不對 因為一定要學校信箱所以其實不見得會 reuse 也不

siriusu10/22 18:31好猜

gofigure10/22 18:33這種通常會搭配有效性 5分鐘失效

pid 了不起 1 ~ 100k 之間 夠快的電腦數秒間就能快速產生某一個 100k 個 seed 的 handle string 然後直接程式化比對螢幕當下拿到的 string

zb9110/22 18:34https://i.imgur.com/oEtAdjV.jpg 我覺得蠻好猜的 XDD

※ 編輯: kloer (114.36.26.240 臺灣), 10/22/2020 18:39:55

dream112410/22 19:06厲害,推

Rm10/22 19:48膜拜

Lesterz10/22 19:48

koka81310/22 19:50wow

jass97099110/22 19:51這很厲害

Rm10/22 20:09輸入錯誤三次把i p列為黑名單?

drajan10/22 20:09連個proxy可以輕鬆解決樓上的問題

john031210/22 20:12Responsible disclosure = =

chocopie10/22 20:38可以,這很yoyodiy,直接繞過信箱

ucrxzero10/22 21:34所以單純幾個C函式就能破解的意思嗎?

ucrxzero10/22 21:35ptt是有source code嗎不然你怎知道實作?

ucrxzero10/22 21:35這樣被破解也不能怪人喇主從架構的實作都被知道惹

w8608310/22 21:38

gofigure10/22 21:42看他的random_text_code實作 有點不OK

gofigure10/22 21:43它如果每次都把chars用另一個外界拿不到的seed洗牌過

gofigure10/22 21:44這個漏洞可能就沒用了

oToToT10/22 22:29上面那個是不是連批踢踢是開源的都不知道

bill020510/22 22:35推XDDDD

luli003410/22 22:55

wens10/22 23:21pid 1 ~ 100k 肯定是不夠。站上人數最多是可以到150k的

nh60211as10/22 23:48ㄟ AccountRecovery::GenCode呼叫random_text_code

nh60211as10/22 23:48是不是存過界啦

viper970910/23 01:06

ssccg10/23 01:13這種事關資安的隨機還用時間pid之類的來seed也太沒sense

ssccg10/23 01:14crypto secure random用urandom是基本吧

GuYueHu10/23 04:26聽起來zero-day正式開始XD

s3716611710/23 05:22看第二次才懂在說啥 不過不會操作XD

TakiDog10/23 08:10推 感覺可行(? 拿自己帳號寫POC送PR r XD

※ 編輯: kloer (114.36.26.240 臺灣), 10/23/2020 08:19:45

amyt10/23 09:53推XDDD

a90447200010/23 15:41怕爆來留名

enskylin10/23 15:48怎麼沒有用 urandom @@

d880126d10/23 16:28太神啦

runedcross10/23 18:40神人

p9008510/23 19:04y

stellvia235910/23 19:32拜神

duck1070410/23 21:47推個

fr7510/24 10:12可怕

Jekk10/24 13:35

HenryLiKing10/25 11:28神串留名啊!! 好厲害喔!!

wildli042210/25 13:56囧,zero-day start

locklose10/26 11:10

rebuildModel10/27 00:37

bobsonlin10/27 04:19

emperorrock10/30 15:13