垃圾桶

EL PSY CONGROO.

Lz1y's avatar Lz1y

分析comsvcs.dll中的MiniDump的具体实现

之前在推特上看到了一个姿势,可以直接调用系统dll,对特定进程Dump其内存:
https://modexp.wordpress.com/2019/08/30/minidumpwritedump-via-com-services-dll/

文章关于comsvcs.dll中的MiniDump具体实现,并没有描述的很清楚,所以好奇心驱动,尝试看了下实现原理,其实想找到这类姿势,还是比较麻烦的。

分析开始起,先感谢一下三好学生师傅提供的具体使用方式,以及写的快速寻找导出函数的脚本~受益良多!
https://www.4hou.com/technology/20146.html

直接开始分析:
首先通过comsvcs.dll的导出函数表,可以发现,其调用了MiniDumpWriteDump API,要知道ProcDump等工具的实现也是基于此API,然后查看调用这个API的点:

只看到一处调用,直接跟入:


这里直接贴出注释后的图,可以看到,实际上就是让Rundll32调用的一个封装了MiniDumpWriteDump的API,我们只需要提供PID,Dump输出文件,以及full这个标识为即可~

然后想Dump其他进程的话,需要SeDebugPrivilege特权,而cmd中默认没有这个特权,而Psh中为了实现获取所有进程的信息,默认给开了,实际上也完全可以自己开启这个特权~

为何Psh(.Net)打开SeDebugPrivilege特权:
https://github.com/dotnet/corefx/blob/master/src/System.Diagnostics.Process/src/System/Diagnostics/ProcessManager.Windows.cs#L141

如何在没有特权的情况下,使用Psh开启SeDebugPrivilege特权:
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Conjure-LSASS.ps1#L121

所以完整的Payload为:
powershell -c "rundll32 C:\windows\system32\comsvcs.dll,MiniDump 612 %APPDATA%\\LSASS.dmp full"
即可在%APPDATA%下生成Dump文件~

回顾一下三好学生师傅的文章,他是搜索所有的导出函数在搜索,实际上效果并不是很好,因为我们只能使用封装了MiniDumpWriteDump,并且对Rundll32也支持了的函数。所以目前还是只能先搜索倒入函数有MiniDumpWriteDump的dll,再人肉分析是否存在可以利用的导出函数~