渗透基础——远程从 lsass.exe 进程导出凭据
0x00 前言
在之前文章 《渗透基础——从 lsass.exe 进程导出凭据》 介绍了本地导出凭据的方法,而在渗透测试中,经常遇到的情况是需要远程导出凭据,本文将要介绍远程导出凭据的思路和方法,记录细节
0x01 简介
本文将要介绍以下内容:
- 思路
- 实现方法
- lsassy 介绍
0x02 思路
在远程导出凭据时,需要考虑以下几点:
(1) 需要实现远程命令执行,关于远程命令执行,可以参考之前的文章《在远程系统上执行程序的技术整理》
(2) 由于保护措施的限制,不同环境需要不同的导出方法
(3) 远程导出 lsass 进程的 dump 文件后,通常会选择将 dump 文件复制到本地,解析得到口令 hash,而有的时候 lsass 进程的 dump 文件很大,所以需要考虑传输文件的效率
(4) 对于多个系统,重复劳动太多,效率不高
综合以上几点,我们需要一个方便快捷的方法:支持多种导出方法,能够直接解析出口令 hash,操作自动化以提高效率
这里可以使用开源工具 Lsassy,地址为: https://github.com/Hackndo/lsassy
0x03 lsassy 介绍
1.安装使用
安装命令:
pip install lsassy
测试命令:
lsassy -u Administrator -p Password1 192.168.1.1
在输出上,使用 termcolor 添加了颜色显示,在默认 Windows cmd 下无法正常显示颜色,会导致显示格式不友好,存在一些乱码
为了解决 Windows 下格式乱码的问题,可以修改 <Python>\lib\site-packages\lsassy\logger.py
,代码如下:
import logging
import os
import sys
class LsassyFormatter(logging.Formatter):
def __init__(self):
logging.Formatter.__init__(self, '%(bullet)s %(threadName)s %(message)s', None)
if os.name == 'nt':
self.BLUE, self.WHITE, self.YELLOW, self.RED, self.NC = '', '', '', '', ''
else:
self.BLUE = '\033[1;34m'
self.WHITE = '\033[1;37m'
self.YELLOW = '\033[1;33m'
self.RED = '\033[1;31m'
self.GREEN = '\033[1;32m'
self.NC = '\033[0m'
def format(self, record):
if record.levelno == logging.INFO:
record.bullet = '[*]{}'.format(self.NC)
elif record.levelno == logging.DEBUG:
record.bullet = '[*]{}'.format(self.NC)
elif record.levelno == logging.WARNING:
record.bullet = '[!]{}'.format(self.NC)
elif record.levelno == logging.ERROR:
record.bullet = '[x]{}'.format(self.NC)
else:
record.bullet = '[+]{}'.format(self.NC)
if record.exc_info and logging.getLogger().getEffectiveLevel() != logging.DEBUG:
record.exc_info = None
return logging.Formatter.format(self, record)
def highlight(msg):
return msg
def init(quiet=False):
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(LsassyFormatter())
logging.getLogger().addHandler(handler)
logging.getLogger().setLevel(logging.INFO)
logging.addLevelName(25, 'SUCCESS')
setattr(logging, 'success', lambda message, *args: logging.getLogger()._log(25, message, args))
logging.getLogger().disabled = quiet
2.打包成 exe
这里可以使用 pyinstaller,主程序代码为 https://github.com/Hackndo/lsassy/blob/master/lsassy/console.py
打包成单独 exe 的命令:
pyinstaller -F console.py
生成 console.exe 后,在执行时会报错提示缺少 Module
根据输出提示修改打包命令,添加引用 Module:
pyinstaller -F console.py --hidden-import unicrypto.backends.pure.DES --hidden-import unicrypto.backends.pure.TDES --hidden-import unicrypto.backends.pure.AES --hidden-import unicrypto.backends.pure.RC4
此时虽然能够正常启动 console.exe,但是无法运行导出功能
调试方法:添加参数 -vv
,能够看到 lsassy.dumpmethod.comsvcs
找不到
添加所有依赖包,得到完整的打包命令:
pyinstaller -F console.py --hidden-import unicrypto.backends.pure.DES --hidden-import unicrypto.backends.pure.TDES --hidden-import unicrypto.backends.pure.AES --hidden-import unicrypto.backends.pure.RC4 --hidden-import lsassy.dumpmethod.comsvcs --hidden-import lsassy.dumpmethod.comsvcs_stealth --hidden-import lsassy.dumpmethod.dllinject --hidden-import lsassy.dumpmethod.dumpert --hidden-import lsassy.dumpmethod.dumpertdll --hidden-import lsassy.dumpmethod.edrsandblast --hidden-import lsassy.dumpmethod.mirrordump --hidden-import lsassy.dumpmethod.mirrordump_embedded --hidden-import lsassy.dumpmethod.nanodump --hidden-import lsassy.dumpmethod.ppldump --hidden-import lsassy.dumpmethod.ppldump_embedded --hidden-import lsassy.dumpmethod.procdump --hidden-import lsassy.dumpmethod.procdump_embedded --hidden-import lsassy.dumpmethod.rdrleakdiag --hidden-import lsassy.dumpmethod.wer --hidden-import lsassy.exec.mmc --hidden-import lsassy.exec.smb --hidden-import lsassy.exec.smb_stealth --hidden-import lsassy.exec.task --hidden-import lsassy.exec.wmi --hidden-import lsassy.output.grep_output --hidden-import lsassy.output.json_output --hidden-import lsassy.output.pretty_output --hidden-import lsassy.output.table_output
此时生成的 console.exe 可以正常使用
3.支持的导出方法
(1)comsvcs
使用 C:\windows\system32\comsvcs.dll
的导出函数 MiniDump()
获得 lsass 进程的 dump 文件
细节可参考之前的文章 《MiniDumpWriteDump via COM+ Services DLL》的利用测试
可直接使用
(2)comsvcs_stealth
方法类似 comsvcs,区别是先将 C:\windows\system32\comsvcs.dll
复制到 c:\windows\temp
并重命名,使用新的 dll 获得 lsass 进程的 dump 文件
可直接使用
(3)dllinject
通过 dll 注入的方式实现
APC 注入的方法可参考 《通过 APC 实现 Dll 注入——绕过 Sysmon 监控》
需要加入参数: -O loader_path=loader.exe,dll_path=inject.dll
(4)dumpert
技术细节: https://github.com/outflanknl/Dumpert
通过 API MiniDumpWriteDump()
获得 lsass 进程的 dump 文件
需要加入参数: -O dumpert_path=dumpert.exe
(5)dumpertdll
方法同上,区别是使用 dll 文件作为参数
需要加入参数: -O dumpertdll_path=dumpert.dll
(6)edrsandblast
技术细节: https://github.com/wavestone-cdt/EDRSandblast
利用带有签名的驱动程序获得 lsass 进程的 dump 文件
需要加入参数: -O edrsandblast_path=EDRSandBlast.exe,RTCore64_path=RTCore64.sys,ntoskrnl_path=NtoskrnlOffsets.csv
(7)mirrordump
技术细节: https://github.com/CCob/MirrorDump
实现流程:
- 加载一个 LSA SSP 插件
- 在插件中泄露 lsass.exe 的进程句柄
- 通过 API
MiniDumpWriteDump()
获得 lsass 进程的 dump 文件
需要加入参数: -O mirrordump_path=Mirrordump.exe
(8)mirrordump_embedded
方法同上,不需要 Mirrordump.exe 作为参数
需要注意的是 mirrordump 无法自动清除已注册的 LSA SSP 插件,使用该方法后会留下以下痕迹:
- LSA SSP 插件保存在
C:\Windows\System32
,名称为八位随机字符,后缀名为 dll - lsass 进程中残留未卸载的 dll
痕迹如下图
清除痕迹的方法:先卸载 lsass 进程中加载的 dll,再删除 dll 文件
关于枚举和清除 LSA SSP 插件的细节可参考之前的文章 《Mimikatz 中 SSP 的使用》
可直接使用
(9)nanodump
技术细节: https://github.com/helpsystems/nanodump
优点是支持多种方式泄露 lsass 进程句柄
需要加入参数: -O nanodump_path=nanodump.exe
(10)ppldump
技术细节: https://github.com/itm4n/PPLdump
支持 Win10 和 Server2019
能够绕过 PPL(Protected Process Light) 对 lsass 进程的保护
相关细节:
- https://itm4n.github.io/lsass-runasppl/
- https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/
需要加入参数: -O ppldump_path=PPLdump.exe
(11)ppldump_embedded
方法同上,不需要 PPLdump.exe 作为参数
可直接使用
(12)procdump
通过 procdump.exe 获得 lsass 进程的 dump 文件
需要加入参数: -O procdump_path=procdump.exe
(13)procdump_embedded
方法同上,不需要 procdump.exe 作为参数
可直接使用
(14)rdrleakdiag
目标系统需要在 c:\windows\system32\
下存在文件 rdrleakdiag.exe
默认存在的系统:
Windows 10,10.0.15063.0 Windows 8.1,6.3.9600.17415 Windows 8,6.2.9200.16384 Windows7,6.1.7600.16385 Windows Vista,6.0.6001.18000
只能执行一次,再次执行需要重新启动操作系统
可直接使用
(15)wer
技术细节: https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1
通过 Powershell 调用 API MiniDumpWriteDump()
获得 lsass 进程的 dmp 文件
可直接使用
0x04 小结
本文介绍了远程从 lsass.exe 进程导出凭据的思路,逐个介绍 Lsassy 使用的导出方法,分析技术细节。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: BIG-IP 漏洞调试环境搭建
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论