在過去的兩個月裡,我一直在研究採用GO語言編寫的惡意軟體。
Go,又稱Golang,是谷歌公司開發的一種程式語言,現在正在被越來越多的惡意軟體開發者所使用的。
在這篇文章中,我就將針對一款採用GO語言編寫的新型Linux勒索軟體進行分析。
GO二進位制檔案概述這裡分析的樣本,是一個被剝離了編譯和除錯資訊的ELF可執行檔案,這使得逆向工程變得困難。值得慶幸的是,一款補救工具(REDRESS: https://go-re.tk/redress/)可以為我們提供幫助。
下面是使用引數“-src”分析此樣本的輸出:
通過圖1,我們可以看出該惡意軟體由三個Go檔案組成。
此外,我們還可以看到它所有的函式以及它們的程式碼行號。根據一些函式的名稱,我們大致就能判定,它應該是一種勒索軟體。
原始碼僅有300多行,說明這款勒索軟體並不複雜,可能還處於初始開發階段。
接下來,就讓我們在偵錯程式中開始動態除錯吧。
在這裡,我使用的是Radare2(Radare2: https://rada.re/r/)。這是因為對於分析被剝離了的Go二進位制檔案而言,它比GDB更合適。
Go二進位制檔案的動態分析我在Radare2中發出命令“aaa”以執行自動分析,在圖2中,我們可以看到Radare2很好地還原並識別了函式名和符號名。
如你所見,函式init()在主函式之前執行,函式check()在函式init()中呼叫。
在函式check()中,勒索軟體首先會通過向hxxps://ipapi.co/json/傳送一個http請求來獲取受感染主機的位置資訊,目的是避免感染一些特定國家的使用者,如白俄羅斯(BY)、俄羅斯(RU)和烏克蘭(UA)。
接下來,它將呼叫函式makesecret(),目的是使用以二進位制形式硬編碼的RSA公鑰來加密AES金鑰。在這個函式中,它通過呼叫函式EncryptPKCS1v15以使用RSA加密和PKCS#1 v1.5中的填充方案對給定的AES金鑰進行加密。
使用RSA加密後的資料如下:
圖6.使用RSA加密後的AES金鑰
接下來,它將在Golang包編碼/base64中呼叫函式EncodeToString,以使用base64演算法對先前加密的資料進行編碼。
然後,它將為解密的README檔案(贖金票據)形成一個緩衝區,如圖8所示:
我們可以看到,加密的AES金鑰以Base64編碼的形式被寫入了解密的README檔案中。
在加密檔案之前,它還會通過發出命令“service stop [pname]”或“systemctl stop [pname]”來殺死以下程序。
當它嘗試停止apache2.service時,會彈出一個標題為“Authentication Required(需要身份驗證)”的對話方塊,提示使用者輸入系統密碼以完成此操作。
圖10. apache2.service身份驗證對話方塊
最後,它將通過在Golang包“path/filepath”中呼叫函式Walk(根字串,walkFn WalkFunc)來遍歷根目錄“/”,然後開始加密檔案。
值得一提的是,該勒索軟體還包含一份加密目錄黑名單,目的是避免加密這些目錄下面的檔案。
圖12.加密目錄黑名單
加密演算法使用的是AES-256-CFB,被加密檔案將被附加副檔名“.encrypted”,README檔案如圖13所示:
圖13. README檔案
用於執行加密的函式是EncFile(),它首先會獲取目標檔案的大小。如果檔案小於0x986880(1,000,000)位元組,它將使用AES-256-CFB演算法加密所有檔案資料。否則,它將讀取資料的前0x986880(1,000,000)位元組並將其加密,然後將原始檔案的剩餘資料複製到加密後文件的末尾。
結論通過上述分析,我們可以看到這種勒索軟體並不複雜,可能還處於初始開發階段。
但是,我們應該意識到,Go語言正在被用來開發越來越多的惡意軟體,各大防毒軟體廠商更是有必要注意這一點。
-
1 #
-
2 #
編譯後都是二進位制執行檔案,和用什麼語言寫惡意軟體沒關係,我golabg部背這個鍋
為啥要過濾掉某些國家呢??