雷蛇支付(Razer Pay)在新加坡和馬來西亞被廣泛使用,在該篇Writeup中,作者通過APP逆向分析,利用Frida調試,發現了雷蛇支付電子錢包(Razer Pay Ewallet)中的用戶簽名(Signature)生成漏洞,由此可讀取雷蛇支付用戶的聊天記錄、刪除用戶綁定的銀行賬戶並竊取用戶個人敏感信息,漏洞最終獲得了雷蛇官方將近$6,000的獎勵。以下是作者的漏洞發現思路,僅當姿勢學習借鑑:

漏洞背景

雷蛇(Razer Inc,RΛZΞR)是一家在新加坡創立的遊戲周邊設備公司,又被稱爲“綠光燈廠”,近年開始進軍電子消費業務。雷蛇的兩個總部分別設立在新加坡及美國聖地牙哥。2017年11月在香港聯交所上市,產品面向遊戲玩家,其產品大多數都以肉食動物命名。2018年推出電子錢包Razer Pay。2020年5月,開始生產外科口罩。

在雷蛇支付電子錢包(Razer Pay Ewallet)的請求防篡改機制中,除auth_token之外,還使用了參數signature對不同用戶的請求進行簽名驗證,每一個對服務端的GET和POST請求都會附帶一個經過編碼的signature參數值和用戶id,如下圖所示:

因此,試圖對任意請求參數的篡改重發都會無效,但經APK逆向分析發現,雷蛇支付電子錢包(Razer Pay Ewallet)存在用戶簽名(Signature)生成漏洞,結合Frida的分析利用可自動計算生成新的用戶簽名(Signature),由此可導致很多的越權(IDOR)問題。

我在使用Burp對雷蛇支付APP的網絡請求進行抓包時發現,由於請求中用戶簽名(Signature)的保護,所以其中很多參數都是無法篡改的,因此,我第一時間想到了註冊另外一個雷蛇支付用戶來進行配合測試,但在兩個用戶的同一請求的場景下,經會話Payload的替換操作後,執行無效,原因還是出在有用戶簽名(Signature)的會話請求保護。

我決定切實分析一下用戶簽名(Signature)的生成機制,在apktool 和 Jadx-Gui 的反編譯幫助下,我對其APP的運行有了代碼層次的理解,發現其中存在一個名爲“MD5Encode”的方法函數,從名字上就知道是用了MD5加密算法。經過一些參數Payload的組合,我決定嘗試一下生成用戶簽名(Signature),但怎麼試也無法生成正確的用戶簽名,我猜想可能是參數次序錯誤,或它是一種非常規的MD5加密。

刪除其他用戶的綁定銀行賬戶

不拋棄不放棄,我把其中涉及用戶簽名生成的所有相關代碼拷貝出來,然後用IDE調試工具IntelliJ IDEA進行嘗試生成,終於,在“MD5Encode”方法運用中,我組合對了正確的參數次序,不過由於有代碼混淆,還需要做一些微調,但還算不太難。最終,在之前生成的請求主體中,插入正確的參數值,用上述代碼即能生成正確的用戶簽名(Signature)字符串!

(小編分析,在以下多個用戶簽名的生成過程中,用到了用戶自己的token,其爲參數之一,然後經MD5Encode方法,可以生成與多個用戶id對應的不同用戶簽名,也就是可以成功生成雷蛇服務端分配給多個用戶的各個用戶簽名Signature)

由此,我首先想到的就是測試越權漏洞(IDOR),我選擇了一個比較敏感的API接口/deleteBankAccount,也就是刪除用戶綁定的銀行賬戶操作,然後在兩個賬戶的測試場景下,竟然能成功刪除掉另一雷蛇支付(Razer Pay)用戶的綁定銀行賬戶!

加入其他用戶創建的聊天羣組

到這步,我想肯定還有其它受Signature保護的API接口存在IDOR越權問題,於是我嘗試用上述方法去做了一波測試,但毫無發現。而且其它API接口使用了不同代碼混淆方法,導致我花費了很多時間去研究分析。沒有頭緒之時,那就用Frida來試試吧,Frida是一個非常好用的調試工具,我正好可以用它來識別一些可以hook利用的方法函數,結合上述的MD5Encode方法,找到正確的電子錢包代碼包,同樣可以用這些方法函數生成新的正確的用戶簽名Signature。

如以下frida.js代碼實現的功能是爲當前用戶生成的新的用戶簽名,以加入其他用戶創建的聊天羣組:

// frida.js - Use this for recalculating signature for adding user to other people's chatgroup

console.log("Starting...")

Java.perform(function () {

    var MD5 = Java.use('com.mol.molwallet.view.MD5')

    MD5.MD5Encode.implementation = function (arg)

    {

        console.log("Hooking class MD5 - method MD5Encode")

       //Extra step - calculate new signature

        var ret_value = this.MD5Encode("groupId=1x9&userIds=95xxx7&token=b6fxxxd3-2xxc-4xxf-bxx7-7fxxxxa6")

        console.log("[+]  signature= " + ret_value)

        //Call method with original arguments so app doesn't crash ..

        var ret_value = this.MD5Encode(arg) //original value

                console.log("original ARG: " + arg) 

        return ret_value;

    }

})

但是要運行Frida,需要root級別的訪問,好在我另外發現了一個服務端漏洞可以讓攻擊者在一臺root過的移動設備中執行操作,以下爲在移動設備中啓動Frida服務的命令:

$ adb shell
# sudo su
# /data/local/tmp/frida-server

之後,在另一個終端窗口下,運行以下命令:

$ frida -l frida.js -U com.mol.molwallet

然後,在移動設備中,我打開雷蛇支付APP,這其中任何調用到hook方法“MD5Encode”的操作都將會執行上述的frida.js腳本,最終我就能針對特定用戶請求生成有效正確的用戶簽名Signature了,這裏的測試用例是,我可以爲我自己生成一個用戶簽名,以它爲驗證憑據加入其他用戶創建的聊天羣組中去,這種方式的危害之處在於,可以神不知鬼不覺地加入某個羣組,然後獲取別人的聊天內容,或點擊領取搶掉別人發送的紅包。

導致的其它安全問題

利用上述方法,我把其它受Signature影響的所有API接口都做了測試,發現可以從這些API接口獲取用戶羣組聊天時分享的紅包金額,另外還能修改並查看其他用戶的轉賬記錄和個人信息。

*參考來源: sambal0x ,clouds 編譯整理,轉載請註明來自 FreeBuf.COM

相關文章