Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2023-00133
- Vendor: 批踢踢實業坊
- Title: 批踢踢實業坊(PTT) 註冊驗證碼繞過
- Introduction: 使用不安全的隨機函式生成驗證碼,導致可以使用任意信箱註冊
處理狀態
目前狀態
公開
Last Update : 2023/05/21
-
新提交
-
已審核
-
已通報
-
已修補
-
已複測
-
公開
處理歷程
- 2023/03/16 21:24:02 : 新提交 (由 愛麗絲 更新此狀態)
- 2023/03/21 14:54:40 : 新提交 (由 愛麗絲 更新此狀態)
- 2023/03/26 20:23:07 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2023/04/24 12:54:51 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2023/04/24 12:54:51 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2023/05/16 03:00:02 : 公開 (由 HITCON ZeroDay 平台自動更新)
- 2023/05/16 17:47:05 : 公開 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2023/05/16 17:50:56 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2023/05/16 17:50:56 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2023/05/17 16:31:02 : 複測申請中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2023/05/17 19:46:53 : 確認已修補 (由 愛麗絲 更新此狀態)
- 2023/05/21 03:00:02 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2023-00133
- 通報者:fxfxxxfxx (愛麗絲)
- 風險:低
- 類型:其他 (Other)
參考資料
暫無資料
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)
相關網址
https://term.ptt.cc
以及其他使用 https://github.com/ptt/pttbbs 的站台
以及其他使用 https://github.com/ptt/pttbbs 的站台
敘述
原始碼: https://github.com/ptt/pttbbs
PTT 目前有三種註冊方式:人工註冊、信箱註冊(僅限台大信箱)及簡訊註冊。
若用信箱註冊,則必須是 @ntu.edu.tw 結尾。並會生成11個字元的隨機驗證碼寄至該信箱。
但因為使用的隨機函式是 glibc 的 random(),在 seed 只有 2^32 種可能的情況下可以暴力破解。
mbbsd/mbbsd.c:361:
static void
mysrand(void)
{
unsigned int seed;
must_getrandom(&seed, sizeof(seed));
seed ^= getpid();
srandom(seed);
}
這裡使用 pmore 下的動畫功能,會提供跳至隨機頁數的功能。
因此只要發一篇有 16 個隨機頁面的 ansi 動畫即可知道 (random() % 16) 的值。
生成 10 個數後,就可以暴力撞出 seed。
mbbsd/pmore.c:4192
if (igs)
{
// make random
igs = random() % (igs+1);
for (pe = p ; igs > 0 && pe < end && *pe &&
*pe > ' ' && *pe < 0x80
; pe ++)
if (*pe == ',') igs--;
if (pe != p)
p = pe-1;
}
(有 16 個隨機頁面的 ansi 動畫)
找出 seed 後,之後所有的 random() 都可以預測結果
到註冊頁面,填入以 @ntu.edu.tw 結尾的任意信箱,
接著算出當次的驗證碼並輸入即可成功註冊。
mbbsd/register.c:262:
static void
makeregcode(char *buf)
{
int i;
// prevent ambigious characters: oOlI
const char *alphabet = "qwertyuipasdfghjkzxcvbnmoQWERTYUPASDFGHJKLZXCVBNM";
/* generate a new regcode */
buf[REGCODE_LEN] = 0;
buf[0] = REGCODE_INITIAL[0];
buf[1] = REGCODE_INITIAL[1];
for( i = 2 ; i < REGCODE_LEN ; ++i )
buf[i] = alphabet[random() % strlen(alphabet)];
}
(成功以不存在的台大信箱註冊)
擷圖
留言討論
登入後留言
聯絡組織
發送私人訊息
您也可以透過私人訊息的方式與組織聯繫,討論有關於這個漏洞的相關資訊。