在過去的兩個月里,我一直在研究采用Go語言編寫的惡意軟件。
Go,又稱Golang,是谷歌公司開發(fā)的一種編程語言,如今正在被越來越多的惡意軟件開發(fā)者所使用的。
在這篇文章中,我就將針對一款采用GO語言編寫的新型linux勒索軟件進(jìn)行分析。
GO二進(jìn)制文件概述
這里分析的樣本,是一個被剝離了編譯和調(diào)試信息的ELF可執(zhí)行文件,這使得逆向工程變得困難。值得慶幸的是,一款補(bǔ)救工具(REDRESS: https://go-re.tk/redress/)可以為我們提供幫助。
下面是使用參數(shù)“-src”分析此樣本的輸出:
圖1.惡意軟件的源代碼
通過圖1,我們可以看出該惡意軟件由三個Go文件組成。
此外,我們還可以看到它所有的函數(shù)以及它們的代碼行號。根據(jù)一些函數(shù)的名稱,我們大致就能判定,它應(yīng)該是一種勒索軟件。
源代碼僅有300多行,說明這款勒索軟件并不復(fù)雜,可能還處于初始開發(fā)階段。
接下來,就讓我們在調(diào)試器中開始動態(tài)調(diào)試吧。
在這里,我使用的是Radare2(Radare2: https://rada.re/r/)。這是因為對于分析被剝離了的Go二進(jìn)制文件而言,它比GDB更合適。
Go二進(jìn)制文件的動態(tài)分析
我在Radare2中發(fā)出命令“aaa”以執(zhí)行自動分析,在圖2中,我們可以看到Radare2很好地還原并識別了函數(shù)名和符號名。
圖2.使用Radare2還原的函數(shù)名稱和符號
如你所見,函數(shù)init()在主函數(shù)之前執(zhí)行,函數(shù)check()在函數(shù)init()中調(diào)用。
在函數(shù)check()中,勒索軟件首先會通過向hxxps://ipapi.co/json/發(fā)送一個http請求來獲取受感染主機(jī)的位置信息,目的是避免感染一些特定國家的用戶,如白俄羅斯(BY)、俄羅斯(RU)和烏克蘭(UA)。
圖3.過濾掉白俄羅斯(BY)、俄羅斯(RU)和烏克蘭(UA)
在main()函數(shù)中,它將首先刪除Go二進(jìn)制文件,然后調(diào)用函數(shù)randSeq()生成一個隨機(jī)AES密鑰,其大小為0x20字節(jié),如下圖所示:
圖4.生成隨機(jī)AES密鑰
接下來,它將調(diào)用函數(shù)makesecret(),目的是使用以二進(jìn)制形式硬編碼的RSA公鑰來加密AES密鑰。在這個函數(shù)中,它通過調(diào)用函數(shù)EncryptPKCS1v15以使用RSA加密和PKCS#1 v1.5中的填充方案對給定的AES密鑰進(jìn)行加密。
圖5. Go二進(jìn)制文件中的硬編碼RSA公鑰
使用RSA加密后的數(shù)據(jù)如下:
圖6.使用RSA加密后的AES密鑰
接下來,它將在Golang包編碼/base64中調(diào)用函數(shù)EncodeToString,以使用base64算法對先前加密的數(shù)據(jù)進(jìn)行編碼。
圖7.使用Base64編碼的AES密鑰
然后,它將為解密的README文件(贖金票據(jù))形成一個緩沖區(qū),如圖8所示:
圖8.解密的README文件的緩沖區(qū)
我們可以看到,加密的AES密鑰以Base64編碼的形式被寫入了解密的README文件中。
在加密文件之前,它還會通過發(fā)出命令“service stop [pname]”或“systemctl stop [pname]”來殺死以下進(jìn)程。
圖9.目標(biāo)服務(wù)
當(dāng)它嘗試停止Apache2.service時,會彈出一個標(biāo)題為“Authentication Required(需要身份驗證)”的對話框,提示用戶輸入系統(tǒng)密碼以完成此操作。
圖10. apache2.service身份驗證對話框
最后,它將通過在Golang包“path/filepath”中調(diào)用函數(shù)Walk(根字符串,walkFn WalkFunc)來遍歷根目錄“/”,然后開始加密文件。
圖11.遍歷根目錄并加密文件
值得一提的是,該勒索軟件還包含一份加密目錄黑名單,目的是避免加密這些目錄下面的文件。
圖12.加密目錄黑名單
加密算法使用的是AES-256-CFB,被加密文件將被附加擴(kuò)展名“.encrypted”,README文件如圖13所示:
圖13. README文件
用于執(zhí)行加密的函數(shù)是EncFile(),它首先會獲取目標(biāo)文件的大小。如果文件小于0x986880(1,000,000)字節(jié),它將使用AES-256-CFB算法加密所有文件數(shù)據(jù)。否則,它將讀取數(shù)據(jù)的前0x986880(1,000,000)字節(jié)并將其加密,然后將原始文件的剩余數(shù)據(jù)復(fù)制到加密后文件的末尾。
圖14.檢查目標(biāo)文件的大小
圖15.大于0x989680字節(jié)的文件經(jīng)過加密后的數(shù)據(jù)
結(jié)論
通過上述分析,我們可以看到這種勒索軟件并不復(fù)雜,可能還處于初始開發(fā)階段。
但是,我們應(yīng)該意識到,Go語言正在被用來開發(fā)越來越多的惡意軟件,各大殺毒軟件廠商更是有必要注意這一點。