QQ盜號木馬動靜態分析流程

CatEraser發表於2024-07-17

小小的記錄一下~~

分析物件

動態分析 – 測試電腦環境

測試電腦執行環境:Win10_64位機
木馬分析工具:火絨劍5.0.74,dnSpy
image
image

木馬動態分析

執行時提示載入失敗,該檔案未釋放任何檔案,且在登錄檔,計劃任務,服務項,使用者組內未發現惡意內容存在。
image

木馬靜態分析

將木馬拖入DIE中進行檢查,發現其為32位.Net木馬程式,且不存在加殼保護。時間戳為2058-09-27,時間戳混亂。
image

將檔案拖入dnSpy中進行反編譯,檢查其程式碼。其程式入口處為BingNav.Program.Main,進入程式入口處繼續分析,發現其實際執行函式為BingNav()。
image
image

BingNav()函式中只有兩步程式碼,第一行負責初始化一個Windows視窗,即動態分析中跳出的Windows視窗,第二行則是進入功能函式BingNavWorkJob(),繼續跟進該函式。
image

該函式中嘗試執行實際的功能函式BingNavExcuteBingNav(),如果執行中發生了錯誤,則執行函式BingNavShowErrMesgBingNav(),該函式主要負責返回錯誤提示資訊視窗。
image

BingNavExcuteBingNav()函式中則實現了該程式的主要功能邏輯,函式較為複雜且部分敏感字串是被AES加密後再以位元組資料格式寫在程式中,以下是對該函式的功能分析:

  1. 獲取當前程序並匹配目標程序(chyed.exe,qq.exe,tim.exe):該函式首先使用CreateToolhelp32Snapshot建立當前計算機中系統程序的快照,並透過Process32First和Process32Next遍歷每個程序。隨後使用SelfDec函式解密位元組陣列,並進行匹配。
    image

SelfDec函式內定義了一個AES-ECB模式的解密方法,接收加密的位元組陣列,並解密為UTF8編碼的字串。在本地實現該解密函式,其三個位元組陣列的實際內容為:
bytes1 = chyed.exe;
bytes2 = qq.exe(QQ程序);
bytes3 = tim.exe(QQ tim程序)
說明該程式匹配的是這三個與QQ相關的程序,獲取到當前電腦存在匹配程序後進入後續操作。
image
image

  1. 讀取匹配程序的記憶體資料,搜尋並提取特定資料字串:該函式在匹配到目標程序後,繼續獲取此程序的記憶體資料,隨後在該記憶體資料中使用BingNavGetIDXByComBingNav函式進行匹配,被匹配的位元組陣列為array。
    image
    BingNavGetIDXByComBingNav函式負責在傳入的記憶體資料中查詢另一個位元組序列的首次出現位置,並返回匹配序列末尾的索引,完成尋找特定的資料塊這一行為。
    image
    array位元組陣列並未進行加密操作,其位元組資料轉為UTF8字串為:msg.fcg?clientuin=,pattern位元組陣列解密後是一串正規表示式:clientuin=[0-9]*,即匹配以字串“clientuin=“開始的一串阿拉伯數字字串,這些字串可能與劫持QQNT、TIM、QQ客戶端的QQClientKeys/QQKey相關,相關文章:
    https://www.cnblogs.com/RainbowTechnology/p/17947778
    https://cloud.tencent.com/developer/article/2150324
    根據程式碼和文章可得,此步主要行為是遍歷程序的記憶體資料,並在記憶體資料中查詢字串msg.fcg?clientuin=,最後獲取到的內容為當前受害者電腦中的QQ號碼。
    image
    image
    接下來函式再次進行匹配,進行的操作與上一步匹配類似,只是第一次匹配的位元組陣列換為bingNavMatchBingNav,解析出的16進位制字串為“70000000700000000001“,匹配到該16進位制字串後繼續獲取該字串後1024位元組的資料,並在該資料內搜尋被解密的bytes4位元組陣列,該位元組陣列實際內容為“700000007000000000016”,在網上搜尋未發現有關內容,可能和QQ程序的cookie或key值有關。最後程式在匹配到的結果中提取從第16個字元開始的到第224個字元,可能是存在其固定的資料格式。
    image
    image

如果兩個匹配都匹配到目標資料後,函式則將提取的資訊新增到列表中,並構造一個特定格式的字串(10@{第一個匹配的QQ號碼資料}@{第二個匹配的16進位制字串資料)),然後終止迴圈。
image
image

  1. 構造和傳送HTTP請求到固定的URL,並解析響應包獲取客戶段金鑰:此部分中函式使用了多個加密的位元組陣列(從byte5到byte14),這裡先列出這些位元組陣列對應的明文內容:
    bytes5 = https://localhost.ptlogin2.qq.com:4301/pt_get_st?callback=
    bytes6 = https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=
    bytes7 = https://xui.ptlogin2.qq.com
    bytes8 = pt_local_token=
    bytes9 = &pt_local_tk=
    bytes10 = "uin"😦\d+)
    bytes11 = clientkey=(\w+);
    bytes12 = Cookie
    bytes13 = GET
    bytes14 = GetResponse
    image

繼續分析函式實現邏輯,其主要完成了使用解密的位元組陣列去構建HTTP請求包,並使用正規表示式提取使用者ID和客戶端金鑰,本次請求中其訪問的URL為https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=,
根據相關文章:
https://www.cnblogs.com/qiyeboy/p/9496262.html
發現得,此URL和埠指向本地127.0.0.1上的QQ監聽埠4301,歸屬於QQ快速登入協議,攻擊者構造此HTTP請求包從而獲取本地QQ使用者的使用者ID和客戶端金鑰。
image
image

隨後該函式根據獲取到的使用者ID構建第二次請求,可能用來驗證使用者 ID 或獲取更多資料,本次請求中其訪問的URL為:
https://localhost.ptlogin2.qq.com:4301/pt_get_st?callback=
隨後將響應包內容的資料使用正規表示式進行提取,獲取客戶端金鑰,並儲存到列表中。
image

  1. 傳遞使用者端資料回給攻擊者伺服器:當列表記憶體在資料時,其指向函式BingNavDestroyBingNav(),繼續分析該函式。
    image

BingNavDestroyBingNav()函式中也存在多個加密的位元組陣列,這裡將其列出:
CreateDirectory = C:\bing
text =
domain = http://fa****.cn/user/home
WriteAllText = c:\bing\index.html
該函式主要完成了將QQ使用者敏感資料構造為JS指令碼標籤,這些指令碼標籤指向特定的URL(該URL透過AES加密後又加了一層base64編碼)。它將這些JS指令碼寫入一個HTML檔案,隨後其開啟該HTML檔案,即向回連伺服器傳遞QQ客戶端ID和金鑰資料,到這裡整個流程就結束了。
image
image

木馬驗證

註冊新QQ使用者驗證上述邏輯,發現確實建立HTML檔案,且裡面URL為目標伺服器URL。
image
image

相關文章