渗透基础——远程从lsass.exe进程导出凭据
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.
渗透基础——远程从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
痕迹如下图
清除痕迹的方法:先卸载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使用的导出方法,分析技术细节。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK