在過去的兩個月裏,我一直在研究采用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)。
在main()函數中,它將首先刪除Go二進制文件,然後調用函數randSeq()生成一個隨機AES密鑰,其大小爲0x20字節,如下圖所示:
接下來,它將調用函數makesecret(),目的是使用以二進制形式硬編碼的RSA公鑰來加密AES密鑰。在這個函數中,它通過調用函數EncryptPKCS1v15以使用RSA加密和PKCS#1 v1.5中的填充方案對給定的AES密鑰進行加密。
使用RSA加密後的數據如下:
接下來,它將在Golang包編碼/base64中調用函數EncodeToString,以使用base64算法對先前加密的數據進行編碼。
然後,它將爲解密的README文件(贖金票據)形成一個緩沖區,如圖8所示:
我們可以看到,加密的AES密鑰以Base64編碼的形式被寫入了解密的README文件中。
在加密文件之前,它還會通過發出命令“service stop [pname]”或“systemctl stop [pname]”來殺死以下進程。
當它嘗試停止apache2.service時,會彈出一個標題爲“Authentication Required(需要身份驗證)”的對話框,提示用戶輸入系統密碼以完成此操作。
最後,它將通過在Golang包“path/filepath”中調用函數Walk(根字符串,walkFn WalkFunc)來遍曆根目錄“/”,然後開始加密文件。
值得一提的是,該勒索軟件還包含一份加密目錄黑名單,目的是避免加密這些目錄下面的文件。
加密算法使用的是AES-256-CFB,被加密文件將被附加擴展名“.encrypted”,README文件如圖13所示:
用于執行加密的函數是EncFile(),它首先會獲取目標文件的大小。如果文件小于0x986880(1,000,000)字節,它將使用AES-256-CFB算法加密所有文件數據。否則,它將讀取數據的前0x986880(1,000,000)字節並將其加密,然後將原始文件的剩余數據複制到加密後文件的末尾。
結論
通過上述分析,我們可以看到這種勒索軟件並不複雜,可能還處于初始開發階段。
但是,我們應該意識到,Go語言正在被用來開發越來越多的惡意軟件,各大殺毒軟件廠商更是有必要注意這一點。