前面幾章主要都在學習「如何分析 Malware」,包含 Static Analysis、Dynamic Analysis、Debugging,以及 Kernel Malware。
從 Chapter 11 開始,重點稍微改變。
這次不是再學一個新的分析工具,而是要開始認識:
Malware 到底會做什麼?
雖然惡意程式種類很多,而且新的攻擊方式一直出現,但許多 Malware 仍然會出現一些共通行為。
例如:
下載其他 Malware
建立 Backdoor
竊取帳號密碼
Keylogging
建立 Persistence
提升權限
隱藏惡意行為
如果熟悉這些常見行為,之後在 IDA Pro 看到某些 API、Strings 或程式結構時,就可以比較快判斷 Malware 可能正在做什麼。
【聲明】由於時間問題本日文章由 AI 生成QQ
首先是兩種很常見的 Malware:
Downloader 的功能很直接:
從 Internet 下載另一個 Malware,再執行它。
因此 Downloader 本身可能沒有太多惡意功能,真正的 Payload 是之後下載的 Malware。
教材提到一種很典型的組合:
URLDownloadToFileA
↓
下載 Malware
↓
WinExec
↓
執行 Malware
所以分析 Sample 時,如果看到:
URLDownloadToFileA
WinExec
出現在一起,就值得檢查它是不是 Downloader。
Launcher 又稱為 Loader。
它的工作是:
安裝或載入 Malware,讓 Malware 現在或未來能夠執行。
和 Downloader 不同的是,Launcher 常常已經包含它要載入的 Malware,不一定需要從 Internet 下載。
Backdoor 是讓攻擊者能夠遠端控制受害電腦的 Malware。
Backdoor 通常包含很多功能,例如:
修改 Registry
建立 Directory
搜尋 File
執行 Command
收集系統資訊
分析 Backdoor 時,可以從 Imports 使用的 Windows API 推測它具備哪些功能。
Backdoor 還需要和攻擊者通訊。
教材中特別提到 HTTP 與 Port 80,原因很簡單:
HTTP 本來就是非常常見的正常流量,因此惡意流量比較容易混在一般 Network Traffic 中。
Reverse Shell 是 Backdoor 中很重要的一種功能。
一般情況下,如果攻擊者直接連入 Victim:
Attacker
↓
Victim
可能會被 Firewall 或 NAT 阻擋。
Reverse Shell 則反過來:
Victim
↓
Attacker
由受感染的電腦主動建立 Connection。
Connection 建立之後,攻擊者就能取得 Shell,並像在本機操作一樣執行 Command。
教材以 Netcat 說明這個概念,而 Windows Malware 也常直接建立 Socket,再啟動:
cmd.exe
基本流程是:
Create Socket
↓
Connect
↓
CreateProcess
↓
cmd.exe
↓
stdin / stdout / stderr
↓
Socket
因此分析 Malware 時,如果看到 Networking API、CreateProcess 和 cmd.exe 一起出現,就值得檢查是否存在 Reverse Shell。
比較複雜的版本也可能使用:
CreatePipe
CreateThread
建立多執行緒 Reverse Shell,甚至在傳送資料前進一步 Encode。
RAT 全名:
Remote Administration Tool
同樣可以遠端控制電腦,但是 RAT 通常提供更完整的控制功能。
教材中的架構可以簡化成:
Attacker
│
│ Command & Control
↓
Victim 1
Victim 2
Victim 3
受感染的 Victim 會主動向控制端 Beacon,再由攻擊者進行控制。
RAT 經常使用:
80
443
等常見 Port 進行通訊。
Botnet 則是大量被感染電腦組成的網路。
每一台受感染電腦通常稱為:
Zombie
並受到 Botnet Controller 控制。
Botnet 的目的可能包括:
散播 Malware
發送 Spam
DDoS
兩者雖然都可以遠端控制受害電腦,但使用方式不同。
RAT 通常比較偏向:
少量 Victim
+
針對性控制
Botnet 則偏向:
大量 Victim
+
同時控制
因此教材把 RAT 和 Targeted Attack 聯繫在一起,而 Botnet 更偏向 Mass Attack。
取得系統之後,攻擊者通常會想辦法取得 Credential。
教材將 Credential Stealing 大致分成三類:
攔截登入資訊
取得 Windows 儲存的 Password Hash
記錄使用者輸入
也就是接下來的:
這是一種 Windows XP 時代的 Credential Stealing 技術。
Windows XP 的 Login Process 使用:
msgina.dll
處理 Authentication。
Windows 也允許 Third-party DLL 加入登入流程。
Malware 就可以利用這個機制,把惡意 DLL 放在:
Winlogon
↓
Malicious GINA DLL
↓
msgina.dll
如此一來,Username 和 Password 就會先經過 Malware。
教材中的惡意 fsgina.dll 會把登入資訊記錄到:
%SystemRoot%\system32\drivers\tcpudp.sys
其中包含 Username、Domain、Password 等資訊。
分析這類 DLL 時還有一個特徵:
Wlx*
如果看到大量以 Wlx 開頭的 Export Function,就值得懷疑是不是 GINA Interceptor。
另一種 Credential Stealing 方法是取得:
LM Hash
NTLM Hash
攻擊者取得 Hash 後,可以嘗試 Offline Cracking,也可能直接進行 Pass-the-Hash。
教材介紹的經典工具是:
pwdump
Pwdump 會透過 DLL Injection,把 DLL 放進:
lsass.exe
中執行。
為什麼選 LSASS?
因為它具有足夠的權限,而且能存取 Authentication 相關資訊。
分析 Pwdump Variant 時,可以注意:
samsrv.dll
advapi32.dll
GetProcAddress
以及與 SAM 操作相關的 Function。
不過教材也特別提醒:
比起花大量時間研究 Malware 到底用哪一個底層 API Dump Hash,更重要的是先搞清楚它取得 Hash 之後要做什麼。
例如:
寫入 Disk?
傳送到 Server?
進行 Pass-the-Hash?
這些資訊對理解 Malware 整體目的可能更重要。
Keylogger 會記錄使用者的 Keyboard Input,例如:
Username
Password
Message
其他輸入內容
教材分成:
Kernel-based Keylogger
User-space Keylogger
Kernel-based Keylogger 可以作為 Keyboard Driver 運作,因此 User Mode 程式比較難發現。
User-space Keylogger 則常使用:
常見 API:
SetWindowsHookEx
當 Keyboard Event 發生時通知 Malware。
不斷詢問 Keyboard 的狀態。
常見 API:
GetAsyncKeyState
GetForegroundWindow
典型流程:
GetForegroundWindow
↓
目前使用哪個 Application?
↓
GetAsyncKeyState
↓
哪個 Key 被按下?
↓
檢查 Shift / Caps Lock
↓
記錄按鍵
↓
Repeat
教材第 9 頁的流程圖就是這種 Polling Keylogger 的典型 Loop:先取得 Foreground Window,再逐一檢查 Keyboard Keys,完成後重新開始。
除了 Imports,也可以從 Strings 判斷 Keylogger。
例如:
[Num Lock]
[PageDown]
[Left]
[Right]
[Up]
[Down]
因為如果 Malware 想完整記錄 Keyboard Input,就必須處理這些特殊按鍵。
Malware 成功感染電腦後,通常不希望:
Reboot
↓
Malware 消失
所以需要建立:
Persistence
也就是讓 Malware 在重新開機、登入或其他條件發生後再次執行。
教材介紹幾種重要方式。
最常見的方法之一就是修改 Registry。
例如:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
不過 Persistence Registry Location 非常多,不需要全部背起來。
實際分析時可以使用:
Autoruns
Procmon
協助尋找。
教材另外介紹三個值得認識的位置。
設定在:
HKLM\SOFTWARE\Microsoft\
Windows NT\CurrentVersion\Windows
其中的 AppInit_DLLs 可以讓指定 DLL 被載入許多會使用 User32.dll 的 Process。
可以讓 Malware 配合:
Logon
Logoff
Startup
Shutdown
Lock Screen
等 Winlogon Event 載入。
Malware 也可能把自己安裝成由:
svchost.exe
載入的 Service DLL。
這種方法可以讓 Malware 混在 Windows 大量正常 svchost.exe Process 中,比一般 Service 更不顯眼。
另一種 Persistence 方法是直接修改正常 Windows Binary。
概念是:
Original System DLL
↓
修改 Entry Point
↓
Malicious Code
↓
載入 Malware
↓
跳回 Original Code
教材中的例子修改:
rtutils.dll
原本的 DLL Entry Point 被改成 Jump。
Malicious Code 接著:
LoadLibraryA("msconf32.dll")
載入惡意 DLL。
完成後再回到原本的 DLL Code,因此正常功能仍然可以繼續執行。
這樣使用者可能完全感覺不到 System DLL 已經遭到修改。
這個技術利用 Windows 尋找 DLL 的順序。
以教材中的 Windows XP 為例,Application 載入 DLL 時會依序搜尋多個位置。
如果攻擊者可以把:
malicious.dll
放在 Legitimate DLL 之前會被搜尋的位置,就可能讓 Windows:
Application
↓
搜尋 DLL
↓
先找到 Malicious DLL
↓
載入 Malware
而不是原本真正的 DLL。
教材舉例:
explorer.exe
需要載入:
ntshrui.dll
如果攻擊者在較優先搜尋的位置放入同名惡意 DLL,就可能讓 Explorer 先載入 Malware。
惡意 DLL 再載入真正的 DLL,讓程式維持正常運作。
這種方法的特色是:
不一定需要另外建立 Registry Persistence,也不一定要修改原本的 Binary。
Malware 有時候還需要取得更高權限。
例如:
User
↓
Administrator
↓
SYSTEM
如果目前權限不足,Malware 可能利用 OS Vulnerability 或其他方法進行 Privilege Escalation。
教材特別介紹:
SeDebugPrivilege
Windows Process 有自己的 Access Token,用來描述 Process 具備哪些權限。
Malware 可以透過:
OpenProcessToken
LookupPrivilegeValue
AdjustTokenPrivileges
嘗試啟用:
SeDebugPrivilege
典型流程:
GetCurrentProcess
↓
OpenProcessToken
↓
LookupPrivilegeValue
↓
"SeDebugPrivilege"
↓
AdjustTokenPrivileges
↓
SE_PRIVILEGE_ENABLED
取得這個 Privilege 後,就能進一步操作一些高權限 Process。
所以分析 Malware 時,如果看到:
OpenProcessToken
LookupPrivilegeValue
AdjustTokenPrivileges
SeDebugPrivilege
這組合一起出現,就可以優先懷疑它正在調整 Process Privilege。
最後是前幾篇已經接觸過的 Rootkit。
之前看到的 SSDT Hooking 屬於 Kernel Mode。
這一章則介紹兩種 User Mode Hook:
IAT Hooking
Inline Hooking
正常情況:
Program
↓
IAT
↓
Kernel32.dll
↓
TerminateProcess
Rootkit 可以修改 IAT Pointer:
Program
↓
IAT
↓
Rootkit Code
↓
TerminateProcess
如此一來,原本要呼叫 API 的程式就會先進入 Rootkit。
教材的例子就是 Hook TerminateProcess,讓 Rootkit 可以干涉 Process Termination。
Inline Hooking 更進一步。
IAT Hooking 修改的是:
Function Pointer
Inline Hooking 則直接修改:
Function Code
例如原本:
ZwDeviceIoControlFile
↓
Original Code
被修改成:
ZwDeviceIoControlFile
↓
JMP
↓
Rootkit Code
教材中的 Rootkit 使用一個 7-byte Hook:
mov eax, Rootkit_Function
jmp eax
直接讓 Function 跳到 Malware。
範例 Hook ZwDeviceIoControlFile 後,Rootkit 會先過濾 Network Information,把目的 Port 為:
443
的 Traffic 隱藏,再呼叫真正的 ZwDeviceIoControlFile。
因此其他功能仍然可以正常運作,看起來不容易察覺異常。
Chapter 11 最重要的不是背下每一個 API,而是建立:
看到某些特徵,就能聯想到可能的 Malware Behavior。
可以簡單整理成:
URLDownloadToFileA
→ Downloader
Socket + cmd.exe
→ Reverse Shell
SetWindowsHookEx
GetAsyncKeyState
→ Keylogger
LSASS + Credential API
→ Credential Stealing
Run Key / AppInit_DLLs / Service
→ Persistence
OpenProcessToken
AdjustTokenPrivileges
SeDebugPrivilege
→ Privilege Manipulation
IAT 被修改
→ IAT Hooking
API 開頭出現 JMP
→ Inline Hooking
實際分析 Malware 時,不一定需要把每一段 Assembly 都 Reverse 到完全理解。
更重要的是先從:
Imports、Strings、API Calls、Registry、Network、Process 與程式結構
辨認出 Malware 的主要能力,再決定哪些 Function 值得繼續深入分析。
這也是 Chapter 11 和前面幾章最大的不同:前面是在學習怎麼分析 Malware,而這一章開始建立的是看到分析結果之後,怎麼知道 Malware 正在做什麼。
