Google帳號洩電話
之前分享過洩漏 YouTube 頻道 email 拿到 2 萬美金的故事,同個作者 brutecat 這次又揭露新的漏洞:只要知道你的 Google 帳號,就能拿到你的電話號碼。
在看 writeup 的時候由於都是順著作者的脈絡,關關難過關關過,感受不到困難之處,因此這次我們換個角度,從「我可能會在哪裡就卡住」來聊聊整個故事。
前情提要是 Google 在 2018 年時發了個公告,説他們在登入頁會用 JavaScript 做一些安全檢查,提前阻止可疑的行為,因此瀏覽器一定要能執行 JavaScript,否則就不給用。
但 brutecat 找到一個就算關了 JavaScript 還是可以用的 username 復原服務,假設你忘記你的 Google 帳號,輸入電話跟姓名,就能找出你當初註冊的帳號。
例如說我電話是 0900-000-000,姓名是 Peter Lin,輸入這兩個之後就會跑出來 peter1234 這個 Google 帳號。
但是找回帳號對駭客來說有什麼用呢?我又不知道電話也不知道姓名,就算都知道了,能找到帳號又有什麼問題呢?這時 brutecat 其實是把它倒過來想的,假設我已經知道某個人帳號是 peter1234,姓名是 Peter Lin,那是不是就能反過來利用這功能,暴力破解出他的電話是多少!
舉個例子,輸入 0900-000-111 加上姓名,找不到帳號,代表這是錯的,但如果輸入 0900-000-000 跟姓名,找回成功,就代表找到了這個人的電話。
因此這整個攻擊的核心就在於,知道了某個 Google 帳號外加姓名,就能暴力破解出電話號碼。甚至更往前了一步,只要知道 Google 帳號就好。因為 brutecat 利用了其他 Google 產品中的一個功能,洩漏出 Google 帳號對應的 display name,藉此來知道對應的姓名。這一步如果沒什麼毅力的話直接就卡住了,只能一直隨機去戳各個產品然後試各種功能,直到找到一個能洩露姓名的功能為止。
所以現在的攻擊流程是:
- 決定要被攻擊的帳號,如 peter1234
- 洩漏出 peter1234 對應的名稱 Peter Lin
- 利用暴力破解,猜出電話號碼
而這第三步就是精華中的精華了。
當你利用帳號復原功能嘗試了幾次後,會發現跳出 captcha 把你擋住。由於這種機制通常針對的都是 IP,因此下一步我也會試試看能不能多換幾個 IP 繞過。
以前聽過有個方法是去各大雲上面開 serverless function,如 AWS Lambda 當 proxy,你開一個就是一個 IP,照使用量算錢很便宜,到處開一開要拿到 1000 個 IP 應該不是問題?不過還是有點少就是了。
而 brutecat 用的方法是我第一次聽到的:IPv6。一些 VPS 服務在開啟 IPv6 時,直接給你一整個網段,如 Vultr 給你 /64,因此你有一堆可以用的 IP。我實際去 Vultr 開了機器並且拿作者的 PoC 去跑,確實是這樣沒錯,可以在發請求時一直換 IP,如果 rate limiting 認的是 IPv6 地址,那就等於毫無作用。
但是呢,這招對 Google 來說不管用,因為 brutecat 後來發現就算換了 IP 還是會出現 captcha(雖然不管用但我偷偷學起來了,感覺未來用得到)。
到這邊應該許多人就放棄了,都換 IP 還是繞不過,心已死。
但 brutecat 繼續深挖,發現有開啟 JavaScript 的帳號復原功能裡面有個 token,把它搬來這邊用以後就能繞過 captcha,解決了這個問題 😂
到這邊其實暴力破解基本上就完成了,只是時間問題而已。不過目前要破解至少 10 位數的數字,要發幾億個請求,有可能被認為是「理論上可行」,但實務上困難,降低整體攻擊的 impact。
這時又可以凸顯出差異了,有些人到這邊可能就回報漏洞了,至少理論上可行(我懶惰,很可能會這樣幹)。而 brutecat 選擇進一步改善作法,要證明實務上也是可行的。
透過忘記密碼的功能,輸入 email 後選擇用電話號碼還原,Google 會顯示部分的電話號碼,如 •••• ••• •00,除了給了你兩碼以外,這個 • 的排列其實也暗示了地區,如美國會是 (•••) •••-••••,透過這兩個線索,能大幅降低要破解的數量,只嘗試符合的號碼。
最後嘗試出來的結果就是,像新加坡這種只有 8 碼的,又給了你 2 碼,只剩下 6 碼也就是最多 100 萬種組合,每秒可以嘗試 4 萬次(這個也很值得學習,這嘗試次數好多),扣掉不合法的號碼後,只需要 5 秒就能破解成功。
外行看熱鬧,內行看門道,乍看之下就是個暴力破解而已,但實際看會發現眉角很多,少了任何一步都沒辦法讓整個攻擊這麼成功,包括:
- 從 email 洩漏出 display name
- 利用忘記密碼拿到電話號碼 pattern 跟最後 2 碼
- 繞過 captcha
- 利用 IPv6 更換大量 IP(我其實不確定這步是不是必須的就是了)
這些細節其實才是關鍵所在。
評論