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


    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的用法

    官方文档:

    https://support.microsoft.com/sk-sk/help/164787/info-windows-rundll-and-rundll32-interface

    用法:

    rundll32 <dllname>,<entrypoint> <optional arguments>

    参数代表传入dll的导出函数名,在dll中定义如下:

    void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

    参数对应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要打开的程序或文件路径

    综上,

    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,如下图

    测试命令如下:

    rundll32.exe url.dll,FileProtocolHandler calc.exe

    执行计算器

    2、查看其它dll是否包含导出函数OpenURL

    实现思路:

    枚举%windir%/system32下所有dll的导出函数,筛选出包含导出函数OpenURL的dll

    通过powershell获得dll的导出函数可参考FuzzySecurity的代码,地址如下:

    https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/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判断

    代码位置:

    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]::PtrToStructure($OffsetPtr, [type]$IMAGE_EXPORT_DIRECTORY)
    加入try catch判断

    (4)目前代码只支持32位dll的判断

    完整代码可参考:

    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:

    rundll32.exe ieframe.dll,OpenURL C:\4\calc.url

    成功执行,弹出计算器

    同样,shdocvw.dll也是相同的测试结果

    3、执行的程序类型

    调用API ShellExecute执行程序,不仅支持exe,也同样支持脚本

    例如执行js文件,内容如下:

    WScript.Echo("1");

    cmd:

    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:

    rundll32.exe url.dll,OpenURLA C:\4\calc.hta

    执行后弹出计算器

    例如url文件,内容如下:

    1. [InternetShortcut]
    2. URL=c:\windows\system32\calc.exe

    cmd:

    rundll32.exe ieframe.dll,OpenURL C:\4\calc.url

    成功执行,弹出计算器

    4、更多利用方法

    hexacorn在他的文章里分享了另一个可供使用的dll和导出函数:

    rundll32 zipfldr.dll, RouteTheCall calc.exe

    当然,还有更多可供使用的dll,本文暂不介绍

    0x04 小结

    本文分析了利用rundll32.exe加载url.dll并通过导出函数OpenURL执行程序的细节,对其扩展,尝试利用脚本批量扫描%windir%/system32下的dll,找到能够执行程序的dll,分别验证了bohops和Hexacorn的结论。

  • 相关阅读:
    C/C++ 二分查找面试算法题
    C++实现的动态规划求解分解为若干素数之和的方案总数
    LVGL GUI-Freertos卡死原因总结
    java社区供暖系统springboot
    驱动 点灯
    Java模拟电影院购票系统
    25分钟了解命令执行漏洞【例题+详细讲解】(一)
    3D Web轻量化工具HOOPS Web Platform助力Rapid DCS快速上市碳估算产品!
    centos7安装virtualenv
    【车载开发系列】UDS诊断---电控单元复位 ($0x11)
  • 原文地址:https://blog.csdn.net/hongduilanjun/article/details/127641289