解析 Rundll32.exe
RUNDLL32.EXE
恶意软件常常伪装成正常的 Windows 进程,常见的有svchost.exe
,rundll32.exe
和lsass.exe
。本文主要目的是理解 rundll32。
顾名思义,rundll32.exe
用于运行DLL。最简单的使用方式如下:
1 | rundll32 <DLLName> |
rundll32
可以是一个子进程或者父进程,取决于执行的上下文。为了确定它是否是恶意的,我们需要查看它的启动位置和命令行参数。
RUNDLL32 总是位于:
1 | \Windows\System32\rundll32.exe |
它的命令行参数则取决于启动的是一个 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_RunDLL
和Control_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 | rundll32.exe –localserver <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> |
以下是该技巧的详细信息:
- AppLocker Bypass – Rundll32 – Penetration Testing Lab (pentestlab.blog)
- AppLocker Bypass – Rundll32 – Penetration Testing Lab (pentestlab.blog)
- rundll32 | LOLBAS (lolbas-project.github.io)
Conclusion
解析 Rundll32.exe