日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/18 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于利用rundll32执行程序的分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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.exe

cmd:

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.exe

cmd:

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。