Shellcode
Shellcode 常被作為惡意程式的實現部分, 經常被用於幫助其在目標機器或系統上執行任意指令,是一種常見的攻擊實施手段。
Shellcode 是一個用於執行任意目的的程式碼、指令,通常是透過 16 進制的機器碼經過精心構造編寫而成,利用漏洞等方式影響程式進而導致執行流程改變。在早期用於利用漏洞觸發 shell 而聞名,因此被稱作 shellcode。
在傳統的駭客攻擊中,通常是指程式面的漏洞利用,而不像現今由於 Web 端服務便利而普及,使得攻擊面相越來越偏向 Web 面的滲透,而在過去的服務通常都是一個二進制的執行檔運行,因此大多都是利用二進制層面的漏洞,例如:緩衝區溢位漏洞(buffer overflow vulnerability),是指未對使用者輸入進行檢查與過濾,導致當使用者輸入超過輸入緩衝區大小的資料時,可能會破壞其內部結構,導致非預期行為的發生,而 shellcode 就是過去所使用的利用腳本,可以見得 shellcode 在過去的資安攻防的領域,其重要性不言而喻。
在現今, shellcode 不僅用於獲取shell,還被用於下載惡意程式、啟動後門程式等攻擊行為。透過精心構造來繞過防護機制,並根據不同的系統架構、處理器進行量身定制。編寫高品質的 shellcode 需要對底層系統有深入的理解。
現今環境下編寫 shellcode 已經不像過去如此困難,有很多生成的方法,甚至不需要自己動手編寫,並且很多人也會將自己所編寫的 shellcode 公開,以下是 shellcode 的相關資料與原始碼:
- 手動編寫
- 使用組合語言編寫
- 工具生成
- 線上資源
此處嘗試使用 msfvenom 生成 shellcode,先預設目標: 我們希望讓目標機器彈一個 Reverse Shell 給我們,並且在我們知道對方機器是 Windows 作業系統的假設情況。
我們首先需要知道自身的 IP 位址是多少(以下是根據實驗環境建立的內網環境,請根據自身狀況改變小心服用)

再使用 msfvenom 輸入以下指令生成(LHOST={自己的IP}、LPORT={自己的PORT})

現在有了 shellcode,但問題來了,要怎麼使用呢?🤔
奔跑吧 shellcode
以下是一個使用 Windows API 的簡易 Shellcode 執行程式碼,基本上直接執行是可以的。
將 shellcode 放在該放的位置後,編譯並建立該惡意程式

之後就可以使用 Metasploit 建立接收 Reverse Shell 的連結點了


當一切準備就緒就可以開始執行了

把我們的成果嘗試丟到 VirusTotal 看看

沒錯,VirusTotal 的評分相當的紅,顯然是個充滿惡意的程式,但這明顯不是我們要的,為了達到不被發覺是一個惡意程式,勢必需要其他手段達成…
Evading Techniques
Obfuscation
Obfuscation 是一種將程式碼進行混淆的技術,目的是為了增加分析者的分析成本,使得分析者難以理解程式碼的真正意圖,從而達到規避檢測的目的。
String/Instruction obfuscation
因為防毒軟體在對惡意程式進行匹配時,很可能會將程式中的機器碼進行比對,因此 shellcode 的樣式很容易就會被發現了。因此我們可以將 shellcode 透過 XOR 加密,使其混淆,如此一來就有有機會規避機器碼樣式的匹配了。
解密後再執行一樣可以達到相同效果
現在再將已經 XOR 過 shellcode 的惡意程式丟進 VirusTotal 看看

可以發現通過 XOR 將 shellcode 混淆是真的有些許效果的,但這畢竟還是有很多缺陷,實際上現實情況不太可能只會出現如此單純的混淆手段。
Control flow obfuscation
除了對 shellcode 進行 XOR 加密外,我們還可以對 shellcode 進行控制流混淆,使得分析者難以理解程式碼的真正意圖,從而達到規避檢測的目的。
Dynamic import loading
Dynamic import loading 是一種將程式碼中的 API 動態加載的技術,目的是為了使得分析者難以理解程式碼中 API 的真正意圖,從而達到規避檢測的目的。
Execution Delay
Execution Delay 是一種將程式碼中的執行時間延遲的技術,目的是為了阻止分析者對程式碼的分析,增加分析成本。
Environment Detection
Environment Detection 是一種將程式碼中的環境檢測的技術,使得可以在不同環境有不同行為,也可以避免被檢測及分析。
Executable Packer
加殼器(Packer)是一個將執行檔進行加殼的工具,目的是為了將執行檔進行壓縮,減少檔案大小,並且可以對執行檔進行加密,從而達到保護執行檔的目的。
UPX
UPX 是一個開源的可執行檔加殼工具,本身的用途是將執行檔進行壓縮,減少檔案大小,但是 UPX 也可以一定程度上達到混淆的效果。因為 UPX 很常見,所以實際上是很容易被防毒軟體所檢測到的,但是對於一些不太熟悉的分析者來說,還是會增加分析成本。
我們可以嘗試利用 UPX 進行加殼

現在再將已經 UPX 過惡意程式丟進 VirusTotal 看看

x86 tricks
以上的惡意行為只要對該利用方法有過分析經驗,或是防毒軟體根據所使用的 API 或相應行為,很容易就可以得知惡意的意圖,我們可以通過構造一些過程中的非正常行為,從而繞過這些檢測或增加分析成本。
以下分享一些小技巧我們嘗試重新設計一個新的 shellcode,以彈出計算機為目的,再次使用 msfvenom 生成

Run Code without Calling (Stack Overflow)
透過 Stack Overflow 將 return address 蓋掉變成存放 shellcode 的記憶體區塊位址,其中利用 Microsoft 的特定編譯指令 `#pragma` 定義新的 Section 給 shellcode,並告訴 Linker 將權限設為 RWE,要特別注意需要將 main 函數的優化選項關閉。
在 main 函數中,構造了一個 Stack Overflow 漏洞,並且可以剛好蓋到 return address


當 EIP 指向 `ret` 時,就會執行到已經被覆蓋的 return address,即存放 shellcode 的位置


現在來嘗試彈出計算機吧!

Run Code without Calling (Stack Overflow and Exception Handle)
在 Windows 中還有一種機制叫例外處理(Exception Handle),是一種用於處理異常情況,主要用於當時程式執行發生意外錯誤或異常時,讓程式可以捕捉這些錯誤並加以處理,以避免程式崩潰或不正確行為的發生。
Using an Exception Handler我們也可以透過濫用例外處理的機制將處理異常的方法改為呼叫 shellcode,透過讓 return address 變為 \xCC 指令,當程式執行的該指令時就會觸發 BREAKPOINT_EXCEPTION 異常。
stackoverflow - 0x-cc-vs-0x-cd-03-int-3

x64
現今大部分系統皆為 x64 居多,並且過去樣本大多都是 x86 占多數,因此若惡意程式為 x64 架構,多少會有奇效。

Conclusion
再來探討幾個混淆或增加分析成本的小技巧與手段,來幫助我們更加完善我們的惡意程式。
- Shellcode Loader
-
Evading Techniques
-
Obfuscation
- String/Instruction obfuscation
- Control flow obfuscation
- Dynamic import loading
- Execution Delay
- Environment Detection
- Executable Packer
-
Obfuscation
- x86 tricks: Run Code without Call
以下是 VirusTotal 對於簡易 Shellcode 執行器的 Behavior 分析結果,其利用 MITRE ATT&CK & MBC 來作行為匹配。

這篇僅僅是談了非常初階的惡意程式開發手法,其還有非常多更加複雜且高深的技術,舉凡像是為了提權可能會使用一些特殊手段將惡意程式碼注入到更高權限的程式記憶體區塊當中進行執行,或是為了規避防毒軟體,可能會偽裝或隱藏自身惡意行為等,甚至是會利用到 Kernel 層級的 System Call 直接執行底層的行為,從而繞過一些防禦機制。
References
- 0xPat blog 0xPat blog – Red/purple teamer
- crow Malware Development
- What is ired.team notes? | Red Team Notes
- https://space.bilibili.com/157504840/?spm_id_from=333.999.0.0
- Stack Overflow 0x cc vs 0x cd 03 (int 3)
- x86-64 - 維基百科,自由的百科全書
- Malcore - So You Want to Write Malware?
- al-khaser
- Anti-Debug Tricks