解析 Rundll32.exe

翻译自A Deep Dive Into RUNDLL32.EXE. Understanding “rundll32.exe” command… | by Nasreddine Bencherchali | Medium

RUNDLL32.EXE

恶意软件常常伪装成正常的 Windows 进程,常见的有svchost.exerundll32.exelsass.exe。本文主要目的是理解 rundll32。

顾名思义,rundll32.exe用于运行DLL。最简单的使用方式如下:

1
rundll32 <DLLName>

rundll32可以是一个子进程或者父进程,取决于执行的上下文。为了确定它是否是恶意的,我们需要查看它的启动位置和命令行参数。

RUNDLL32 总是位于:

1
2
\Windows\System32\rundll32.exe
\Windows\SysWOW64\rundll32.exe // 32bit version on 64bit systems

它的命令行参数则取决于启动的是一个 CPL 文件或者 DLL 等。下面来看几个例子。

Running a DLL

基本情况下,rundll32 只执行 DLL,所以此情况下需要检查 DLL 的启动位置,必要时在 VT 上检查哈希。

SHELL32.DLL——“OpenAs_RunDLL”

rundll32也可以执行 DLL 中的特定函数。例如,当右键单击一个文件时,可以看到右键菜单中包含Open With选项。点击后,可以在弹出框中选择系统中的一系列应用程序。

这背后的的原理是使用rundll32运行shell32.dll中的OpenAs_RunDLL函数:

1
C:\Windows\System32\rundll32.exe C:\Windows\System32\shell32.dll,OpenAs_RunDLL <file_path>

这种调用特定函数的操作非常常见,下面是列出了一些调用和含义的列表:

SHELL32.DLL——“Control_RunDLL”,”Control_RunDLLAsUser” and “Control Panel Applets”

rundll32另一常见功能是使用shell32.dll中的Control_RunDLLControl_RunDLLAsUser函数,这两个函数用于运行 CPL 文件或者控制面板项(control panel items)。

例如当我们需要改变系统日期和时间时,我们从控制面板启动日期和时间。这背后的原理是,windows 启动 rundll32:

1
C:\WINDOWS\System32\rundll32.exe C:\WINDOWS\System32\shell32.dll,Control_RunDLL C:\WINDOWS\System32\timedate.cpl

这种情况下,需要检查 .cpl 文件的合法性。

Control Panel Items(.CPL)

CPL 是导出了CPIApplet函数的 DLL 文件,给出了控制面板提供的功能。

一个 CPL 文件可以包含多个由 applet index 引用的 applet,每个 applet可以包含多个由 tab index 引用的 tabs。我们可以通过下列用法获取这些信息:

1
"C:\WINDOWS\System32\rundll32.exe C:\WINDOWS\System32\shell32.dll,Control_RunDLL <.CPL File>,@<applet Index>,<tab Index>"

例如,System32\main.cpl文件包含两个 applets——“Mouse” 和 “Keyboard” 属性。如果我们希望获得鼠标属性并修改指针,可以如下操作:

1
C:\WINDOWS\System32\rundll32.exe C:\WINDOWS\System32\shell32.dll,Control_RunDLL C:\WINDOWS\System32\main.cpl,@0,1

main.cpl可能被恶意替换。

一般来说,使用Control_RunDLL函数的rundll32的父进程一般是explorer.exe或者control.exe。另一些进程也可能做类似的事情,比如Google Chrome等使用inetcpl.clp修改代理和网络设置时。

如果想获得更多 CPL 和恶意软件的信息,可以查看这篇 paper,https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-cpl-malware.pdf。

DEVCLNTDLL——“DaySetCookie”(Web Dav Client)

一个比较神秘的命令行会产生许多日志:

1
C:\WINDOWS\System32\rundll32.exe C:\Windows\system32\davclnt.dll,DavSetCookie <Host> <Share>

当使用file://协议,无论时在 word file 中或者通过 Windows 共享,有时会使用 WebDav 客户端(当 SMB 被禁用)请求这些文件。此时会使用rundll32进行请求。

这种情况下,父进程一般为svchost.exe,命令行类似:

1
C:\Windows\system32\svchost.exe -k LocalService -p -s WebClient

例如 Emotet 这样的恶意软件已经使用过这种技巧。

RUNDLL32 ——“-sta”/“-localserver” Flags

比较不常见的命令行参数是-sta-localserver,可以用于加载恶意注册的 COM 对象。如果在日志中发现以下两种命令行之一:

1
2
rundll32.exe –localserver <CLSID_GUID>
rundll32.exesta <CLSID_GUID>

此时需要确认对应的注册表\HKEY_CLASSES_ROOT\CLSID\<GUID>和子键,查找是否有恶意 DLL 或者 SCT 脚本。

建议阅读bohops (@bohops) / Twitter的文章Abusing the COM Registry Structure: CLSID, LocalServer32, & InprocServer32 – bohops了解详细技巧,并检查Hexacorn | Blog Run Lola-bin, run…中包含的-localserver变种。

RUNDLL32.EXE —— Executing HTML/JAVASCRIPT

攻击者常用的另一个命令行参数是javascript,原因是rundll32可以使用mshtml.dll:

1
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication <HTML Code>

以下是该技巧的详细信息:

Conclusion

作者推特:Nasreddine Bencherchali (@nas_bench) / Twitter

作者

lll

发布于

2022-03-31

更新于

2023-03-24

许可协议