COC Proxy

項目起源

回鍋 COC 有好一陣子了,在 PaD 的坑結束後過一陣子乏力期,一打開 IDA 就全身酸軟。

五月初又是一陣期中報告,實習面試,雖然一直有想要拆開它的慾望,卻一直抽不出身

就在考多益的前一週突然渾身不對勁的跳坑開始著手研究

研究過程

準備

COC 和 Pad 不同,是走 raw socket, 這様窺探資料的難度增加了 (這年頭沒有明文傳輸了吧)

所以也不需要 wireshark,先用 apktool 解開 apk

翻了翻 smali 果然重點都不在 java 層, 將唯一的 lib libg.so 丟到 IDA。一看太好了,沒有加殼!

開 strings subview 找到伺服器和 port

使用 python 開 tcp socket proxy 準備中間人解密資料

要讓 app 改連 proxy 首先想到 /etc/hosts 但改了沒有用而且不通用(需要 root),後來是看到有現成的 fakedns,接著只要手動設定 wifi dns 地址即可。

之前弄的逆向相關項目幾乎都是用 C 實作,這次來玩玩看聽說處理底層資料也游刃有餘的 python 2

解密

接著是最關鍵的部分,如何解密資料流。

由於靜態分析功力有限,直接用室友舊手機開 COC 用 IDA 動態調適,沒有任何 anti-ptrace

attach 後對關鍵函式下斷分析。根據 proxy 觀察,每 3,4 秒會有心跳包送出,先針對 libc 中的 send 下斷

返回後向上觀察下斷找到 encryption function 會針對即將送出的 stream of bytes 做等長加密

小菜我缺乏密碼學知識啊!看到 function 不斷從一張表中用奇怪的方法挑出 byte 跟名文加密,也不知道這張表怎麼來

經過努力的觀察,終於發現有兩張表分別對應 send 跟 recv 而這兩張表在每次開 COC 時是固定且一樣的!!

雖然心中抱有懷疑,加密的 IV 可能會固定嗎? 但憑著不試白不試的心情將 IDA disassember 出的結果改進 python 中(非常醜)

實際實驗後(都已 global chat 測試)發現還是抓不到 仔細觀察後發現在第一次登入 packet 送出 server response 後整張加密表都變了!

貌似雖然開發公司對 binary 沒做保護但加密算法可不馬虎。只好針對第一次的 server response 動態 track

這邊走了偷吃步 分析過程看到了一串 const fhsd6f86f67rt8fw78fw789we78r9789wer6re 果斷 Google,果然人外有人,早就有補完計畫了 COCDP

透過文件,知道是以 RC4 進行串流加密,順便學習了一下 RC4 算法

雖然有文件支援 但是怕版本有更新 還是動態調適進去看 server nonce 怎麼被 KSA 使用,產生新的 S

Debug 一陣子後終於能成功解密

應用?

YA! 終於能看到資料了! ……然後呢? 突然想不太到有什麼應用

畢竟資料都在人家 server 裡,能做的事很有限。最近又聽聞某叉助手沒辦法模擬出陷阱了,想必是官方開始不信任 client,某叉駐守做不到的我也不想去撞牆

閒來沒事看了看傳出的資料,原來配對完成同時也將陷阱跟援軍資料都送過來了,那就來做個即時顯示器吧!

這樣打錢打水甚至爬杯時就不會被陰了

開發

抉擇

要將資料以圖像方式直覺顯示才行,用 python 繪圖嗎? Google 一下就開始頭痛了……

於是乎回歸 browser 強大魔法的懷抱 利用 browser 當 GUI ,資料傳輸就決定用 Websocket

SVG

畫圖就交給 d3.js + svg 囉

流程大致是

COC Proxy => websocket broadcast to web => d3.js render

後續

之後可能測試看看欺騙 client 端能達到什麼效果 像是讓敵人家只剩大本營之類的
或是做個爬杯 bot
不過最想試試看的是模擬野豬的路徑,找出最佳下兵點,可以避開陷阱最大化攻擊路徑
等有空吧 ……

結語

寫成紀錄文能重新整理思緒與資料,還不錯。之後來把 Pad 脫機戰鬥的記錄也發一發好了。

另外 fake-dns 也有很多可以運用的地方,當成工具筆記下來。

這個坑就先到一段落吧 五月六月還有一堆 deadline 要趕呢。

今天考的多益閱讀測驗應是送了四題題組,不知道過不過的了門檻啊。