【技术原创】渗透基础——远程从lsass.exe进程导出凭据

admin 2022年7月8日18:37:26评论32 views字数 5886阅读19分37秒阅读模式

【技术原创】渗透基础——远程从lsass.exe进程导出凭据

【技术原创】渗透基础——远程从lsass.exe进程导出凭据
0x00 前言

在之前文章《渗透基础——从lsass.exe进程导出凭据》介绍了本地导出凭据的方法,而在渗透测试中,经常遇到的情况是需要远程导出凭据,本文将要介绍远程导出凭据的思路和方法,记录细节。

【技术原创】渗透基础——远程从lsass.exe进程导出凭据
0x01 简介

本文将要介绍以下内容:

思路

实现方法

lsassy介绍

【技术原创】渗透基础——远程从lsass.exe进程导出凭据
0x02 思路

在远程导出凭据时,需要考虑以下几点:

(1)需要实现远程命令执行,关于远程命令执行,可以参考之前的文章《在远程系统上执行程序的技术整理》

(2)由于保护措施的限制,不同环境需要不同的导出方法

(3)远程导出lsass进程的dump文件后,通常会选择将dump文件复制到本地,解析得到口令hash,而有的时候lsass进程的dump文件很大,所以需要考虑传输文件的效率

(4)对于多个系统,重复劳动太多,效率不高

综合以上几点,我们需要一个方便快捷的方法:支持多种导出方法,能够直接解析出口令hash,操作自动化以提高效率。

这里可以使用开源工具Lsassy,地址为:https://github.com/Hackndo/lsassy

【技术原创】渗透基础——远程从lsass.exe进程导出凭据
0x03 lsassy介绍

1.安装使用

安装命令:

pip install lsassy

测试命令:

lsassy -u Administrator -p Password1 192.168.1.1

在输出上,使用termcolor添加了颜色显示,在默认Windows cmd下无法正常显示颜色,会导致显示格式不友好,存在一些乱码。

为了解决Windows下格式乱码的问题,可以修改< Python >libsite-packageslsassylogger.py,代码如下:

import loggingimport osimport sysclass 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 = '33[1;34m'            self.WHITE = '33[1;37m'            self.YELLOW = '33[1;33m'            self.RED = '33[1;31m'            self.GREEN = '33[1;32m'            self.NC = '33[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 msgdef 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:windowssystem32comsvcs.dll的导出函数MiniDump()获得lsass进程的dump文件。

细节可参考之前的文章《MiniDumpWriteDump via COM+ Services DLL》的利用测试。

可直接使用。

(2)comsvcs_stealth

方法类似comsvcs,区别是先将C:windowssystem32comsvcs.dll复制到c:windowstemp并重命名,使用新的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:WindowsSystem32,名称为八位随机字符,后缀名为dll

lsass进程中残留未卸载的dll

痕迹如下图

【技术原创】渗透基础——远程从lsass.exe进程导出凭据

清除痕迹的方法:先卸载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:windowssystem32下存在文件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文件。

可直接使用。

【技术原创】渗透基础——远程从lsass.exe进程导出凭据
0x04 小结

本文介绍了远程从lsass.exe进程导出凭据的思路,逐个介绍Lsassy使用的导出方法,分析技术细节。

【技术原创】渗透基础——远程从lsass.exe进程导出凭据

【技术原创】渗透基础——远程从lsass.exe进程导出凭据

原文始发于微信公众号(嘶吼专业版):【技术原创】渗透基础——远程从lsass.exe进程导出凭据

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月8日18:37:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【技术原创】渗透基础——远程从lsass.exe进程导出凭据http://cn-sec.com/archives/1166339.html

发表评论

匿名网友 填写信息