[[346887]]
0x00 前言
在進行威脅狩獵的過程中,如果想要找到惡意軟件,首先需要對平臺和操作系統具有一定的了解。如果想要甄別合法軟件和惡意軟件,首先必須明確哪些是合法的。
作為一個具有30多年歷史之久的操作系統,由于Windows的復雜性,往往使我們很難實現上面這一點。
也正因如此,惡意軟件作者通常會編寫惡意軟件,模仿合法的Windows進程。因此,我們可能會看到惡意軟件偽裝成svchost.exe、rundll32.exe或lsass.exe進程,攻擊者利用的就是大多數Windows用戶可能都不清楚這些系統進程在正常情況下的行為特征。
此前,我們討論過svchost.exe進程及其命令行選項。在這篇文章中,我們將深入挖掘rundll32.exe,以期對其有所了解。

0x01 關于RUNDLL32.EXE
顧名思義,rundll32.exe可執行文件是用于運行DLL(RUN DLL),即運行動態鏈接庫的。
在MSDN中,對DLL的定義如下:
動態鏈接庫(DLL)是一個模塊,其中包含可以由另一個模塊(應用程序或DLL)使用的函數和數據。
以下是使用rundll32.exe的最基本語法:
rundll32
rundll32.exe可執行文件可以是子進程,也可以是父進程,具體要取決于執行的上下文。為了確定一個rundll32.exe實例是否屬于惡意,我們需要確認幾件事。首先,需要確認啟動它的路徑,其次是命令行。
合法的RUNDLL32.EXE進程始終位于:
\Windows\System32\rundll32.exe
\Windows\SysWOW64\rundll32.exe(64位系統上的32位版本)
至于rundll32.exe實例的命令行,完全取決于要運行的內容,例如CPL文件、DLL安裝等等。
接下來,我們來看幾個例子。
0x02 運行DLL
在其基本形式中,rundll32.exe將僅執行一個DLL,因此,如果我們看到了rundll32.exe實例,首先要檢查被調用的DLL的合法性。
我們始終要檢查DLL的調用位置。例如,如果是從%temp%調用kernel32.dll,這種情況顯然是惡意的。此外,我們還需要在VirusTotal這樣的站點上檢查其哈希值。
0x03 SHELL32.DLL – “OpenAs_RunDLL”
Rundll32.exe還可以執行DLL中的特定函數。例如,當選擇一個文件并右鍵單擊時,將會顯示出一個上下文菜單,其中包含多個選項。這里的一個選項是“OpenWith”(打開方式)。在點擊后,將會出現一個彈出窗口,可以從系統上安裝的應用程序中進行選擇。
實際上,在此過程的背后,是使用shell32.dll和OpenAs_RunDL函數啟動rundll32.exe實用程序。
- C:\Windows\System32\rundll32.exe C:\Windows\System32\shell32.dll,OpenAs_RunDLL < file_path >
這種在DLL中調用特定函數的行為非常普遍,因此我們恐怕無法將所有函數都了解全面。下面的兩篇文章詳細介紹了一系列rundll32.exe調用和對應的作用。
https://www.tenforums.com/tutorials/77458-rundll32-commands-list-windows-10-a.html
http://chagdali.free.fr/dcs/RunDll.htm
0x04 SHELL32.DLL – “Control_RunDLL”、“Control_RunDLLAsUser”和控制面板程序

我們發現與shell32.dll一起使用的另一個常見函數是Control_RunDLL或Control_RunDLLAsUser。這兩個函數用于運行.CPL文件或控制面板選項。
例如,如果我們要更改計算機的日期和時間,可以從控制面板啟動對應的applet。

在后臺,Windows實際上是使用以下命令行啟動了rundll32.exe實例。
- C:\WINDOWS\System32\rundll32.exe C:\WINDOWS\System32\shell32.dll,Control_RunDLL C:\WINDOWS\System32\timedate.cpl
除了驗證DLL的合法性。在使用Control_RunDLL或Control_RunDLLAsUser函數時,應該始終檢查.CPL文件的合法性。
0x05 控制面板選項(.CPL)
CPL即Control Panel Items(控制面板選項),是控制面板所提供功能對應的程序,或者換而言之,它們是導出CPIApplet函數的DLL。
.CPL文件可以包含一個applet索引可以引用的多個applet,每個applet可以包含一個選項卡索引可以引用的多個選項卡。
我們可以通過rundll32.exe實用程序訪問和請求此信息,如下所示。

例如,System32文件夾中的main.cpl文件包含兩個applet,分別是鼠標和鍵盤屬性。如果我們要在鼠標屬性中更改指針,實際的操作如下。
- C:\WINDOWS\System32\rundll32.exe C:\WINDOWS\System32\shell32.dll,Control_RunDLL C:\WINDOWS\System32\main.cpl,@0,1
如我們所見,我們可以輕松使用惡意版本來替換原始的main.cpl文件,不了解這方面知識的用戶很容易注意不到這一點。實際上,這正是惡意軟件作者感染計算機的方式。
在正常情況下,使用Control_RunDLL函數的rundll32.exe實例的父進程應該是explorer.exe或者control.exe。
其他進程也可以使用該函數啟動rundll32.exe。例如,當運行inetcpl.cpl進行代理或網絡配置時,rundll32.exe的父進程有可能是Google Chrome、MSGEDGE或IE。
如果大家想了解有關CPL以及惡意軟件如何濫用的,可以閱讀這篇趨勢科技對CPL惡意軟件的研究報告( https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-cpl-malware.pdf )。
0x06 DEVCLNT.DLL – “DavSetCookie”(Web Dav客戶端)
Rundll32.exe實例有一個神秘的命令行,可能會大量出現在日志中,其格式如下。
- C:\WINDOWS\System32\rundll32.exe C:\Windows\system32\davclnt.dll,DavSetCookie < Host > < Share >
當使用file://協議時,無論是在Word文件中,還是通過共享窗口,有時(如果SMB被禁用)會使用WebDav客戶端來請求這些文件。在此時,會通過rundll32.exe實用程序發出請求。
這類請求的父進程是svchost.exe,其中的“-s WebClient”參數并不是必須添加的。
- C:\Windows\system32\svchost.exe -k LocalService -p -s WebClient
類似Emotet這樣的惡意軟件在此前已經利用了這種技術。因此,我們始終需要分析這類命令行中包含的主機,并確保全部都是合法的。
0x07 RUNDLL32.EXE – “-sta”或“-localserver”標志
有一個鮮為人知的命令行參數,就是“-sta”和“-localserver”。二者均可以用于加載惡意注冊的COM對象。
如果我們在日志中看到以下內容,或者發現有進程使用了下面的命令行參數運行:
- rundll32.exe –localserver < CLSID_GUID >
- rundll32.exe –sta < CLSID_GUID >
我們就需要驗證相應的注冊表項\HKEY_CLASSES_ROOT\CLSID\
我強烈推薦大家閱讀@bohops的文章,以詳細了解這種技術。在hexacorn的博客中,詳細介紹了“-localserver”的變體。
https://bohops.com/2018/06/28/abusing-com-registry-structure-clsid-localserver32-inprocserver32/
0x08 RUNDLL32.EXE – 執行HTML或JavaScript
攻擊者可能會在rundll32.exe中使用的另一個命令行參數是“javascript”標志。
實際上,rundll32.exe實例可以使用mshtml.dll和javascript關鍵詞來運行HTML或JavaScript代碼。
- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication < HTML Code >
我從未見過這種方式的任何一次合法使用。因此,一旦我們在日志中發現了這類使用方法,就應該立即進行應急排查。
可以通過下面的資源,了解這種技術的更詳細信息:
https://pentestlab.blog/2017/05/23/applocker-bypass-rundll32/
https://oddvar.moe/2017/12/13/applocker-case-study-how-insecure-is-it-really-part-1/
https://lolbas-project.github.io/lolbas/Binaries/Rundll32/
0x09 總結
感謝大家的閱讀,希望能通過本篇文章對Rundll32有所了解。
如果大家有任何反饋或建議,歡迎通過Twitter @nas_bench與我聯系。
0x0A 參考文章
[1] https://bohops.com/2018/06/28/abusing-com-registry-structure-clsid-localserver32-inprocserver32/
[2] https://threathunterplaybook.com/evals/apt29/report.html
[3] https://www.hexacorn.com/blog/2020/02/13/run-lola-bin-run/
[4] https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-cpl-malware.pdf
[5] https://support.microsoft.com/en-us/help/149648/description-of-control-panel-cpl-files
[6] https://isc.sans.edu/forums/diary/Lets+Trade+You+Read+My+Email+Ill+Read+Your+Password/24062/
[7] https://blog.didierstevens.com/2017/11/13/webdav-traffic-to-malicious-sites/
本文翻譯自:https://medium.com/@nasbench/a-deep-dive-into-rundll32-exe-642344b41e90如若轉載,請注明原文地址。