這是一個名叫ReBreakCaptcha的邏輯漏洞,而這個漏洞將允許你輕松地繞過網站所采用的GoogleReCaptcha v2驗證碼。
技術概覽
早在2016年,我就開始研究如何才能繞過Google的ReCaptcha v2驗證碼系統,而且我也想知道對于一名攻擊者來說,繞過這種驗證碼系統的難度到底有多少。如果有哪一種驗證碼繞過技術可以在任何環境下都能很好地工作,而不只是針對某些特殊情況的話,那就非常完美了。
因此,我認為有必要跟大家介紹這種名叫ReBreakCaptcha的攻擊方法,我們可以用這種新型的繞過技術來繞過Google的ReCaptcha v2驗證碼系統。
ReBreakCaptcha的實現主要由以下三個步驟組成:
1.語音Challenge(驗證碼獲取)-得到正確的challenge類型;
2.Recognition(識別)-轉換Audiochallenge的音頻信息,然后將其發送給Google的語音識別API(Speech Recognition API);
3.Verification(驗證)-驗證語音識別的結果,然后繞過ReCaptcha;
ReBreakCaptcha第一步:語音Challenge
ReCaptcha v2的challenge主要有以下三種類型:
-圖片Challenge:這種Challenge信息中包含一張由9個子圖片組成的圖片以及需要選擇的圖片描述,系統會要求用戶根據提供的描述信息選擇相應的子圖片;
-語音Challenge:這種Challenge信息中包含一段語音信息,系統會要求用戶輸入他們所聽到的數字;
-文本Challenge:這種Challenge信息中包含五個候選文本以及用戶所需要選擇的對象種類,系統會要求用戶選擇相應種類的單詞。
我們可以利用ReBreakCaptcha來對付ReCaptchav2的語音Challenge,所以我們需要解決的問題就是如何能夠每次都能獲取到語音Challenge。
當我們點擊了ReCaptchav2中的“I’m not a robot”(我不是機器人)選項之后,系統通常會給我們現實以下Challenge類型:
上圖所示的即為圖片Challenge,如果想要發起語音Challenge的話,我們需要點擊如下圖所示的按鈕:
接下來,系統會要求我們完成語音驗證,而這種類型的Challenge是很容易繞過的:
可能有些同學已經發現了,除了語音Challenge之外,有時你可能還會遇到如下圖所示的文本Challenge:
為了繞過驗證系統并獲取到相應的驗證語音,你可以直接點擊“Reload Challenge”(重載Challenge)按鈕,直到你得到正確的Challenge類型為止。下圖所示即為“Reload Challenge”按鈕:
那么我們現在要做什么呢?當然是繞過ReCaptcha啦!那么具體應該怎么做呢?沒錯,此時就是Google語音識別API登場的時候了。
ReBreakCaptcha第二步:識別
這是最有意思的步驟了,我們將要利用Google提供的服務來黑掉它自己的另一個服務!
讓我們回到語音Challenge的話題上,先看下面這張圖片:
上圖即為驗證系統的語音Challenge界面,這個界面主要由以下幾種控制組件組成:
1. 一個播放按鈕:用來播放驗證碼;
2. 一個文本框:用來給用戶輸入聽到的驗證碼;
3. 一個下載按鈕:下載驗證語音;
現在,我們需要下載語音驗證文件,然后再把它發給Google的語音識別API。在動手之前,我們還需要將該文件轉換成“wav”格式,因為Google的語音識別API只能識別這種類型。現在我們手上已經拿到了語音驗證文件了,然后準備把它發給Google的語音識別服務。可是這該如何實現呢?是的,我們還需要使用一些其他的API。
這里給大家推薦一個非常好用的Python庫(SpeechRecognition),它支持多種在線/離線引擎和API,我們可以用它來完成語音識別的任務。當然了,我們將使用這個庫來對接Google的語音識別API。當我們發送了“wav”音頻文件之后,SpeechRecognition將會把語音識別的結果以字符串的形式返回給我們(例如‘25143’)。
ReBreakCaptcha第三步:驗證
這一步相對來說就比較簡單了,我們現在只需要將第二步的識別結果復制粘貼到文本輸入框之內,然后點擊ReCaptcha的“Verify”(驗證)按鈕就可以了。沒錯,我們現在可以用Google自己的服務來半自動化地繞過Google的另一個服務了。
完整的ReBreakCaptchaPoC
我需要用Python來寫一個完整的PoC腳本,這個腳本會自動完成上述所有的操作步驟,然后完全自動化地繞過ReCaptchav2。相應代碼我已經托管在GitHub上了,感興趣的同學可以自行下載查看【傳送門】。