批踢踢實業坊(PTT) 註冊驗證碼繞過 - HITCON ZeroDay

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
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)];
}

圖片
(成功以不存在的台大信箱註冊)

擷圖

留言討論

聯絡組織

 發送私人訊息
您也可以透過私人訊息的方式與組織聯繫,討論有關於這個漏洞的相關資訊。
;