ESET 研究人員發現了一種獨特且以前未出現過的 Windows 二進制加載程序,與其他此類加載程序不同,它作為服務器運行并在內存中執行接收到的模塊。研究人員將這個新的惡意軟件命名為Wslink,Wslink是其中一個dll的名稱。
在過去兩年中,研究人員只在中歐、北美和中東的觀察中發現過幾次由Wslink發起的攻擊。初始攻擊向量是未知的,大多數示例都使用了MPRESS,部分代碼是虛擬化的。不幸的是,到目前為止,研究人員還無法獲得它應該接收的任何模塊。根據對比,目前還有已知的惡意軟件與它在代碼、功能或操作上具有相似性。
接下來,我們將對加載程序和研究人員自己的客戶端進行分析,這最初研究人員是用來測試檢測方法的。這個客戶端的源代碼可能對惡意軟件分析的初學者感興趣,它展示了如何重用和與先前分析的惡意軟件的現有功能進行交互。
技術分析
Wslink作為服務運行,偵聽服務參數(Parameters)項的ServicePort注冊表值中指定的端口上的所有網絡接口。前面注冊Wslink服務的組件是未知的。下圖描述了接受到該端口的傳入連接的代碼。
接受傳入連接的循環的 Hex-Rays 反編譯
Hex-Rays號稱最強悍的反編譯工具。可以反編譯VB VC BCB Delphi等等一切 x86/x64代碼為C代碼。
接受連接之后是使用硬編碼的 2048 位公鑰進行 RSA 握手,以安全地交換密鑰和 IV,以用于 CBC 模式下的 256 位 AES。加密模塊是隨后收到一個惟一的標識符——簽名以及用于解密的附加密鑰。
有趣的是,最近接收到的帶有其簽名的加密模塊是全局存儲的,這使得它對所有客戶端都可用。這種方式節省流量,如果要加載的模塊的簽名與前一個匹配,則只傳輸密鑰即可。
接收模塊及其簽名的 Hex-Rays 反編譯
使用MemoryModule庫將解密的模塊(它是一個常規PE文件)加載到內存中,并最終執行其第一次導出。用于通信、套接字、鍵和IV的函數以參數的形式傳遞給導出,使模塊能夠通過已經建立的連接交換消息。
在內存中執行接收模塊的代碼的Hex-Rays反編譯
客戶端實現
研究人員自己的Wslink客戶端實現,如下所述,簡單地與修改后的 Wslink 服務器建立連接,并發送一個模塊,然后解密和執行該模塊。由于研究人員的客戶端無法知道在任何給定的Wslink服務器實例中與公鑰匹配的私鑰,因此研究人員生成了自己的密鑰對,并使用來自該密鑰對的公鑰修改服務器可執行文件,并在研究人員的Wslink客戶端實現中使用私鑰。
該客戶端使研究人員能夠復制Wslink的通信和搜索獨特的模式,這進一步證實了研究人員的發現,因為研究人員可以模仿它的行為。
最初,一些用于發送/接收消息的函數是從原始示例中獲得的,且可以立即使用它們進行實現。
從Wslink示例中加載函數的代碼
隨后,研究人員的客戶端從文件中讀取要使用的私有RSA密鑰,并建立到指定IP和端口的連接。預計Wslink的一個實例已經在提供的地址和端口上偵聽。當然,其嵌入的公鑰也必須替換為已知私鑰的公鑰。
研究人員的客戶端和Wslink服務器繼續執行握手,交換用于AES加密的密鑰和IV。如下圖所示分為三個步驟,發送客戶端hello,接收帶有IV的對稱密鑰,并將它們發送回來以驗證成功解密。通過反轉 Wslink 二進制文件,研究人員了解到hello消息的唯一約束,除了大小240字節之外,就是第二個字節必須為零,因此研究人員將其全部設置為零。
研究人員客戶端的 RSA 握手密碼
最后一部分是發送模塊。如下圖所示,分為以下四個簡單步驟:
?接收到之前加載的模塊的簽名,研究人員決定在實現中不使用它,因為它對研究人員不重要;
?發送模塊的硬編碼簽名;
?從文件中讀取模塊,加密它并發送;
?發送模塊的加密密鑰;
研究人員的客戶端發送模塊的代碼
研究人員客戶端用于加載和加密模塊的代碼
研究人員的客戶端的完整源代碼可以在WslinkClient GitHub存儲庫中找到。請注意,代碼仍然需要大量的加工才能用于攻擊,并且從頭開始創建另一個加載程序會更容易。
總結
Wslink是一個小巧靈活的加載程序,與研究人員通常看到的加載程序不同,它作為服務器運行,并在內存中執行接收到的模塊。
有趣的是,這些模塊在通信、秘鑰和套接字方面重用了加載程序的函數;因此,因此他們不必啟動新的出站連接,Wslink 還具有完善的加密協議來保護交換的數據。