12

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

 2 years ago
source link: https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E5%9F%BA%E7%A1%80-%E8%BF%9C%E7%A8%8B%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

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

20 May 2022

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进程的保护

相关细节:

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使用的导出方法,分析技术细节。


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK