关于利用rundll32执行程序的分析
0x00 前言
最近看到了一篇有趣的文章《Abusing Exported Functions and Exposed DCOM Interfaces for Pass-Thru Command Execution and Lateral Movement》,介紹了利用rundll32.exe加載url.dll,通過導(dǎo)出函數(shù)OpenURL執(zhí)行程序的方法。于是我對(duì)此做了研究,整理成文,解決以下問題:
-
利用rundll32執(zhí)行程序的細(xì)節(jié)和原理
-
利用腳本批量掃描dll,查找能夠執(zhí)行程序的dll
0x01 簡(jiǎn)介
本文將要介紹以下內(nèi)容:
-
rundll32加載dll的用法
-
OpenURL的用法
-
API ShellExecute的用法
-
三者結(jié)合實(shí)現(xiàn)通過rundll32直接執(zhí)行程序
-
尋找其他可用的導(dǎo)出函數(shù)
-
利用powershell腳本批量獲得dll的導(dǎo)出函數(shù),篩選特定dll
0x02 相關(guān)細(xì)節(jié)
1、rundll32加載dll的用法
官方文檔:
https://support.microsoft.com/sk-sk/help/164787/info-windows-rundll-and-rundll32-interface
用法:
rundll32 <dllname>,<entrypoint> <optional arguments>參數(shù)<entrypoint>代表傳入dll的導(dǎo)出函數(shù)名,在dll中定義如下:
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);參數(shù)<optional arguments>對(duì)應(yīng)dll導(dǎo)出函數(shù)中的LPSTR lpszCmdLine
也就是說通過rundll32能控制dll導(dǎo)出函數(shù)的LPSTR lpszCmdLine參數(shù)
2、OpenURL的用法
這里直接參考文章中的提示,找到url.dll,包含導(dǎo)出函數(shù)OpenURL
使用IDA查看url.dll的導(dǎo)出函數(shù)OpenURL,其中調(diào)用了API ShellExecute,如下圖
查看偽代碼,如下圖
注意ShellExecute的第二個(gè)參數(shù)為NULL,第三個(gè)參數(shù)lpFile對(duì)應(yīng)傳入的參數(shù)lpFile
3、API ShellExecute的用法
函數(shù)原型與參數(shù)定義如下:
HINSTANCE ShellExecute(_In_opt_ HWND hwnd,_In_opt_ LPCTSTR lpOperation,_In_ LPCTSTR lpFile,_In_opt_ LPCTSTR lpParameters,_In_opt_ LPCTSTR lpDirectory,_In_ INT nShowCmd );第二個(gè)參數(shù)為NULL時(shí),表示執(zhí)行默認(rèn)操作"open"
第三個(gè)參數(shù)lpFile表示要打開的程序或文件路徑
也就是說,url.dll中導(dǎo)出函數(shù)OpenURL的參數(shù)lpFile決定API ShellExecute要打開的程序或文件路徑
綜上,
rundll32.exe url.dll,OpenURL calc.exe實(shí)際上的操作為ShellExecuteA(hwnd, NULL, "calc.exe", NULL, NULL, nShowCmd);,即執(zhí)行計(jì)算器
使用Immunity Debugger動(dòng)態(tài)調(diào)試,跟蹤到ShellExecuteA,驗(yàn)證判斷,傳入的參數(shù)為
calc.exe,如下圖
0x03 擴(kuò)展利用
1、查找url.dll中其它可供利用的導(dǎo)出函數(shù)
IDA加載url.dll,選擇Search?-?text...,搜索ShellExecuteA
導(dǎo)出函數(shù)FileProtocolHandler同樣調(diào)用API ShellExecute,如下圖
測(cè)試命令如下:
rundll32.exe url.dll,FileProtocolHandler calc.exe執(zhí)行計(jì)算器
2、查看其它dll是否包含導(dǎo)出函數(shù)OpenURL
實(shí)現(xiàn)思路:
枚舉%windir%/system32下所有dll的導(dǎo)出函數(shù),篩選出包含導(dǎo)出函數(shù)OpenURL的dll
通過powershell獲得dll的導(dǎo)出函數(shù)可參考FuzzySecurity的代碼,地址如下:
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-Exports.ps1
在這個(gè)代碼的基礎(chǔ)上,添加枚舉dll的功能,分別獲得導(dǎo)出函數(shù),進(jìn)行判斷
實(shí)現(xiàn)細(xì)節(jié):
(1)枚舉c:\windows\system32下的所有dll:
$DllSearchPath = dir c:\windows\system32\*.dllforeach($DllName in $DllSearchPath) { $DllName.Name }(2)對(duì)于c:\windows\system32\auditpolmsg.dll
會(huì)報(bào)錯(cuò)提示輸入字符串的格式不正確,所以對(duì)語句$OffsetPtr = New-Object System.Intptr -ArgumentList $($HModule.ToInt64() + $ExportRVA)加入try catch判斷
代碼位置:
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-Exports.ps1#L141
(3)對(duì)于c:\windows\system32\avicap.dll
會(huì)報(bào)錯(cuò),嘗試讀取或?qū)懭胧鼙Wo(hù)的內(nèi)存,對(duì)語句$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
執(zhí)行如下圖,獲得其他兩個(gè)dll,分別為ieframe.dll和shdocvw.dll
使用IDA加載ieframe.dll,查看導(dǎo)出函數(shù)OpenURL,偽代碼如下圖
由CInternetShortcut可以得知執(zhí)行的文件為.url文件
編寫一個(gè).url文件,內(nèi)容如下:
[InternetShortcut] URL=c:\windows\system32\calc.execmd:
rundll32.exe ieframe.dll,OpenURL C:\4\calc.url成功執(zhí)行,彈出計(jì)算器
同樣,shdocvw.dll也是相同的測(cè)試結(jié)果
3、執(zhí)行的程序類型
調(diào)用API ShellExecute執(zhí)行程序,不僅支持exe,也同樣支持腳本
例如執(zhí)行js文件,內(nèi)容如下:
WScript.Echo("1");cmd:
rundll32.exe url.dll,OpenURL C:\4\echo.js執(zhí)行后彈框
例如hta文件,內(nèi)容如下:
<HTML> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <HEAD> <script language="VBScript"> Window.ReSizeTo 0, 0 Window.moveTo -2000,-2000 Set objShell = CreateObject("Wscript.Shell") objShell.Run "calc.exe" self.close </script> <body> demo </body> </HEAD> </HTML>cmd:
rundll32.exe url.dll,OpenURLA C:\4\calc.hta執(zhí)行后彈出計(jì)算器
例如url文件,內(nèi)容如下:
[InternetShortcut] URL=c:\windows\system32\calc.execmd:
rundll32.exe ieframe.dll,OpenURL C:\4\calc.url成功執(zhí)行,彈出計(jì)算器
4、更多利用方法
hexacorn在他的文章里分享了另一個(gè)可供使用的dll和導(dǎo)出函數(shù):
rundll32 zipfldr.dll, RouteTheCall calc.exe當(dāng)然,還有更多可供使用的dll,本文暫不介紹
0x04 小結(jié)
本文分析了利用rundll32.exe加載url.dll并通過導(dǎo)出函數(shù)OpenURL執(zhí)行程序的細(xì)節(jié),對(duì)其擴(kuò)展,嘗試?yán)媚_本批量掃描%windir%/system32下的dll,找到能夠執(zhí)行程序的dll,分別驗(yàn)證了bohops和Hexacorn的結(jié)論。
總結(jié)
以上是生活随笔為你收集整理的关于利用rundll32执行程序的分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 权限管理流程图
- 下一篇: rundll32.exe 用法概述 [转