关于利用rundll32执行程序的分析
0x00 前言
最近看到了一篇有趣的文章《Abusing Exported Functions and Exposed DCOM Interfaces for Pass-Thru Command Execution and Lateral Movement》,介紹了利用rundll32.exe加載url.dll,通過導出函數(shù)OpenURL執(zhí)行程序的方法。于是我對此做了研究,整理成文,解決以下問題:
-
利用rundll32執(zhí)行程序的細節(jié)和原理
-
利用腳本批量掃描dll,查找能夠執(zhí)行程序的dll
0x01 簡介
本文將要介紹以下內(nèi)容:
-
rundll32加載dll的用法
-
OpenURL的用法
-
API ShellExecute的用法
-
三者結合實現(xiàn)通過rundll32直接執(zhí)行程序
-
尋找其他可用的導出函數(shù)
-
利用powershell腳本批量獲得dll的導出函數(shù),篩選特定dll
0x02 相關細節(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的導出函數(shù)名,在dll中定義如下:
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);參數(shù)<optional arguments>對應dll導出函數(shù)中的LPSTR lpszCmdLine
也就是說通過rundll32能控制dll導出函數(shù)的LPSTR lpszCmdLine參數(shù)
2、OpenURL的用法
這里直接參考文章中的提示,找到url.dll,包含導出函數(shù)OpenURL
使用IDA查看url.dll的導出函數(shù)OpenURL,其中調(diào)用了API ShellExecute,如下圖
查看偽代碼,如下圖
注意ShellExecute的第二個參數(shù)為NULL,第三個參數(shù)lpFile對應傳入的參數(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 );第二個參數(shù)為NULL時,表示執(zhí)行默認操作"open"
第三個參數(shù)lpFile表示要打開的程序或文件路徑
也就是說,url.dll中導出函數(shù)OpenURL的參數(shù)lpFile決定API ShellExecute要打開的程序或文件路徑
綜上,
rundll32.exe url.dll,OpenURL calc.exe實際上的操作為ShellExecuteA(hwnd, NULL, "calc.exe", NULL, NULL, nShowCmd);,即執(zhí)行計算器
使用Immunity Debugger動態(tài)調(diào)試,跟蹤到ShellExecuteA,驗證判斷,傳入的參數(shù)為
calc.exe,如下圖
0x03 擴展利用
1、查找url.dll中其它可供利用的導出函數(shù)
IDA加載url.dll,選擇Search?-?text...,搜索ShellExecuteA
導出函數(shù)FileProtocolHandler同樣調(diào)用API ShellExecute,如下圖
測試命令如下:
rundll32.exe url.dll,FileProtocolHandler calc.exe執(zhí)行計算器
2、查看其它dll是否包含導出函數(shù)OpenURL
實現(xiàn)思路:
枚舉%windir%/system32下所有dll的導出函數(shù),篩選出包含導出函數(shù)OpenURL的dll
通過powershell獲得dll的導出函數(shù)可參考FuzzySecurity的代碼,地址如下:
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-Exports.ps1
在這個代碼的基礎上,添加枚舉dll的功能,分別獲得導出函數(shù),進行判斷
實現(xiàn)細節(jié):
(1)枚舉c:\windows\system32下的所有dll:
$DllSearchPath = dir c:\windows\system32\*.dllforeach($DllName in $DllSearchPath) { $DllName.Name }(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
會報錯,嘗試讀取或?qū)懭胧鼙Wo的內(nèi)存,對語句$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í)行如下圖,獲得其他兩個dll,分別為ieframe.dll和shdocvw.dll
使用IDA加載ieframe.dll,查看導出函數(shù)OpenURL,偽代碼如下圖
由CInternetShortcut可以得知執(zhí)行的文件為.url文件
編寫一個.url文件,內(nèi)容如下:
[InternetShortcut] URL=c:\windows\system32\calc.execmd:
rundll32.exe ieframe.dll,OpenURL C:\4\calc.url成功執(zhí)行,彈出計算器
同樣,shdocvw.dll也是相同的測試結果
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í)行后彈出計算器
例如url文件,內(nèi)容如下:
[InternetShortcut] URL=c:\windows\system32\calc.execmd:
rundll32.exe ieframe.dll,OpenURL C:\4\calc.url成功執(zhí)行,彈出計算器
4、更多利用方法
hexacorn在他的文章里分享了另一個可供使用的dll和導出函數(shù):
rundll32 zipfldr.dll, RouteTheCall calc.exe當然,還有更多可供使用的dll,本文暫不介紹
0x04 小結
本文分析了利用rundll32.exe加載url.dll并通過導出函數(shù)OpenURL執(zhí)行程序的細節(jié),對其擴展,嘗試利用腳本批量掃描%windir%/system32下的dll,找到能夠執(zhí)行程序的dll,分別驗證了bohops和Hexacorn的結論。
總結
以上是生活随笔為你收集整理的关于利用rundll32执行程序的分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 权限管理流程图
- 下一篇: rundll32.exe 用法概述 [转