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

发布于 2024-08-28 09:31:37 字数 8884 浏览 19 评论 0

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

痕迹如下图

Alt text

清除痕迹的方法:先卸载 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 进程的保护

相关细节:

需要加入参数: -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 技术交流群。

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

发布评论

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

关于作者

离鸿

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

lee_heart

文章 0 评论 0

往事如风

文章 0 评论 0

春风十里

文章 0 评论 0

纸短情长

文章 0 评论 0

qq_pdEUFz

文章 0 评论 0

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